Fix ffmpeg framegrabs with Exile

This commit is contained in:
Mark Felder 2024-03-07 17:38:21 -05:00
parent 8298b326a7
commit 54ff7234b9
2 changed files with 21 additions and 16 deletions

View File

@ -0,0 +1 @@
Video framegrabs were not working correctly after the change to use Exile to execute ffmpeg

View File

@ -40,28 +40,32 @@ def image_resize(url, options) do
end end
# Note: video thumbnail is intentionally not resized (always has original dimensions) # Note: video thumbnail is intentionally not resized (always has original dimensions)
@spec video_framegrab(String.t()) :: {:ok, binary()} | {:error, any()}
def video_framegrab(url) do def video_framegrab(url) do
with executable when is_binary(executable) <- System.find_executable("ffmpeg"), with executable when is_binary(executable) <- System.find_executable("ffmpeg"),
{:ok, env} <- HTTP.get(url, [], pool: :media), {:ok, env} <- HTTP.get(url, [], pool: :media),
{:ok, pid} <- StringIO.open(env.body) do {:ok, pid} <- StringIO.open(env.body) do
body_stream = IO.binstream(pid, 1) body_stream = IO.binstream(pid, 1)
Exile.stream!( result =
[ Exile.stream!(
executable, [
"-i", executable,
"pipe:0", "-i",
"-vframes", "pipe:0",
"1", "-vframes",
"-f", "1",
"mjpeg", "-f",
"pipe:1" "mjpeg",
], "pipe:1"
input: body_stream, ],
ignore_epipe: true, input: body_stream,
stderr: :disable ignore_epipe: true,
) stderr: :disable
|> Enum.into(<<>>) )
|> Enum.into(<<>>)
{:ok, result}
else else
nil -> {:error, {:ffmpeg, :command_not_found}} nil -> {:error, {:ffmpeg, :command_not_found}}
{:error, _} = error -> error {:error, _} = error -> error