lib/exstream.ex

defmodule Exstream do
  import Plug.Conn

  defstruct [:conn, :path, :start, :end]

  @type t :: %__MODULE__{conn: %Plug.Conn{}, path: String.t(), start: String.t(), end: String.t()}

  def stream(%Exstream{conn: %Plug.Conn{} = conn, path: path, start: start, end: finish}) do
    Exile.stream!([
      "ffmpeg",
      "-hide_banner",
      "-loglevel", "error",
      "-ss", "#{ start }",
      "-i", "#{ path }",
      "-to", "#{ finish }",
      "-copyts",
      "-c:v", "libx264",
      "-preset", "faster",
      "-profile:v", "high",
      "-level:v", "4.0",
      "-c:a", "aac",
      "-ac", "2",
      "-f", "mpegts",
      "pipe:1"
    ])
    |> Enum.into(
      conn
      |> send_chunked(200)
    )
  end
end