如何使用ffmpeg将视频转换为GIF,并有合理的质量?
我正在用ffmpeg
将一个视频转换为GIF文件:
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
,效果很好,但是输出的GIF文件质量很低。
我正在用ffmpeg
将一个视频转换为GIF文件:
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
,效果很好,但是输出的GIF文件质量很低。
ffmpeg
例ffmpeg
は高品質なGIFを出力することができます。始める前に、常に最新のバージョンを使用することをお勧めします。ダウンロード](https://ffmpeg.org/download.html)または[コンパイル](https://trac.ffmpeg.org/wiki/CompilationGuide).
ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
-ss 30
)をスキップし、3秒の出力(-t 3
)を作成します。この例では 1 秒あたり 10 フレームのレートを使用しています。 -loop
出力オプションでループを制御することができますが、値がわかりにくいです。0
の値は無限ループ、-1
はループしない、1
は一度だけループする、つまり二度再生されるということです。つまり、値を 10 にすると GIF は 11 回再生されます。 palettegen と paletteuse フィルタには、多くのオプションが追加されています。最も重要なのは
stats_mode
(palettegen) です。このフィルターはパレットの焦点を画像全体に合わせる (full
がデフォルトです) か、 可動部分のみに合わせる (diff
) か、 個々のフレームに合わせる (single
) かのいずれかに強制することができます。たとえば、 個々のフレームごとにパレットを生成するには palettegen=stats_mode=single
& paletteuse=new=1
を使用します。ディザリングアルゴリズムを選択します。主に3つのタイプがあります:決定論的(dither
)、誤差拡散(デフォルトのbayer
を含む他のすべてのタイプ)、そして何もしない。あなたの GIF は、特定のディザリングアルゴリズムを使った方がよく見えるかもしれませんし、ディザリングを全く使わない方がよく見えるかもしれません。説明、画像の例、高度な使い方の詳細については、FFmpeg で高品質 GIF を参照してください。
sierra2_4a
の例もう一つのコマンドライン方式は、ImageMagick から bayer
から bayer_scale
(または convert
) へパイプすることです。
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v pam -f image2pipe - | convert -delay 10 - -loop 0 -layers optimize output.gif
ffmpeg
オプション:
convert
fps と scale フィルタを使用した filtergraph 。本例では lanczos scaling algorithm を使用しています。
magick
PAM イメージエンコーダを選択します。この例では、PAM (Portable AnyMap) 画像フォーマットを出力していますが、これは透明度(アルファ)をサポートし、ffmpeg
でサポートされているシンプルでロスレスな RGB フォーマットです。
-vf "fps=10,scale=320:-1:flags=lanczos"
は image2pipe muxer を選択します。これは、パイプに出力する際にどの muxer を使用するかを伝える必要があるためです。詳しくは ImageMagickアニメーション最適化 を参照してください。出力が小さくなることを保証するものではありませんので、-c:v pam
を使わずに試して結果を比較してみる価値はあります。
convert
の fps フィルタと-f image2pipe
の ffmpeg
を組み合わせてフレームレートを設定します。これは、convert
が画像の生のストリームを取得するだけなので、fpsが保持されないため、ややこしくなることがあります。第二に、-delay
の -loop 0
の値は、毎秒のフレーム数ではなく、ticks(毎秒 100 回)の単位です。例えば、-layers optimize
= 100/12.5 = 8 = -layers optimize
とすると、
ffmpeg
は -delay
の値を整数に丸めるので、8.4 は 8、8.5 は 9 となります。これは、全てのフレームで一様な遅延を設定する場合、一部のフレームレートのみがサポートされていることを意味します(フレームごとに特定の遅延を設定することもできますが、それはこの答えの範囲を超えています)。
最後に、ブラウザや画像ビューアは最小遅延を実装している場合がありますので、あなたのconvert
はいずれにせよ無視される可能性があります。
ビデオ提供:U.S. Fish & Wildlife Service National Conservation Training Center
如果你希望避免中间的图像文件,可以在ffmpeg
和ImageMagick的convert
之间管道化,这样就不需要中间文件了。
ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif
ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif
-f image2pipe
告诉ffmpeg将视频分割成图像,使其适合被管道输出,而-vcodec ppm
则指定输出格式为PPM(由于某种原因,如果格式为png,要么convert
没有从管道中读取所有的图像,要么ffmpeg没有将其全部输出)。这两条命令的-
中的convert
分别指定了输出和输入用一个管道,如果要优化结果而不保存文件,可以将convert
的输出用管道输出到第二个gif:-
命令中:
&001
&001
告诉convert
将其输出为gif格式的数据进行管道输出,-layers Optimize
告诉第二个convert
执行optimize-frame
和optimize-transparancy
的方法(参见ImageMagick【动画优化介绍】(http://www.imagemagick.org/Usage/anim_opt/))。需要注意的是,`-layers Optimize`的输出不一定能提供更小的文件大小,所以你可以先尝试转换为GIF格式,而不做优化来确定。
请记住,在整个过程中,所有的东西都在内存中,所以如果图像相当大,你可能需要足够的内存。
运行./gifenc.sh input.mov output.gif 720 10
会从你给的电影中输出720p宽10fps的GIF。
#!/bin/sh
palette="/tmp/palette.png"
filters="fps=$4,scale=$3:-1:flags=lanczos"
ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette"
ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$2"
&001
你可以在我的Github
假设:ffmpeg已经安装好了,脚本和其他文件在同一个文件夹里。
使用方法:
./avi2gif.sh ./vokoscreen-2015-05-28_12-41-56.avi
HAVE PHUN :)
vim avi2gif.sh
#!/bin/sh
INPUT=$1
# default settings, modify if you want.
START_AT_SECOND=0; # in seconds, if you want to skip the first 30 seconds put 30 here
LENGTH_OF_GIF_VIDEO=9999999; # in seconds, how long the gif animation should be
echo "Generate a palette:"
ffmpeg -y -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png
echo "Output the GIF using the palette:"
ffmpeg -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $INPUT.gif
btw: vokoscreen是一个非常好的Linux屏幕捕捉工具 :)
感谢 Michael Kohaupt :) 5.3M = vokoscreen-2015-04-2815-43-17.avi -> vokoscreen-2015-05-2812-41-56.avi.gif = 1013K
按照@LordNeckbeard的方法使用ffmpeg
命令,请找到以下有用的Bash函数,可以添加到你的~/.bash_profile
文件中:
# Convert video to gif file.
# Usage: video2gif video_file (scale) (fps)
video2gif() {
ffmpeg -y -i "${1}" -vf fps=${3:-10},scale=${2:-320}:-1:flags=lanczos,palettegen "${1}.png"
ffmpeg -i "${1}" -i "${1}.png" -filter_complex "fps=${3:-10},scale=${2:-320}:-1:flags=lanczos[x];[x][1:v]paletteuse" "${1}".gif
rm "${1}.png"
}
一旦加载了这个函数(手动或从. ~/.bash_profile
中加载),你应该会有新的video2gif
命令。
示例用法:
video2gif input.flv
或:
video2gif input.flv 320 10
缩放到320宽度,每秒10帧。
你也可以指定不同的视频格式(如mp4)。
你可以尝试GIF Brewery应用程序,它可以从视频文件中创建GIF。
对于windows用户:
在windows目录下创建video2gif.bat
文件,内容如下:
@echo off
set arg1=%1
set arg2=%arg1:~0,-4%
ffmpeg -y -i %arg1% -vf fps=10,scale=-1:-1:flags=lanczos,palettegen %TEMP%\palette.png
ffmpeg -i %arg1% -i %TEMP%\palette.png -filter_complex "fps=10,scale=-1:-1:flags=lanczos[x];[x][1:v]paletteuse" %arg2%.gif
del /f %TEMP%\palette.png
video2gif myvideo.mp4
,然后在任何地方都可以使用,就像这样的例子:
&001
,那么你就在当前目录下有了myvideo.gif
。
EDIT:*
我建议使用这个批处理脚本 https://github.com/NabiKAZ/video2gif
以下是Windows用户的批处理文件:
gifenc.bat:
set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %2
源。高质量的GIF与FFmpeg:只提取一个样本](http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html)
如果你只想使用一个输入变量,而输出的名字只有GIF(发音为JIF)扩展名,那么用这个来代替:
set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
set var1=%1
set var2=%var1:~0,-4%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %var2%.gif
其他一些回答中提到了video2gif脚本,我用的是这个脚本。
要创建上下文菜单选项,你需要编辑你的注册表。打开一个powershell命令提示符,用admin privs运行。执行这些命令:
$key = "Registry::HKEY_CLASSES_ROOT# 如何添加一个windows 7/10 "右键点击 "上下文菜单条目,将视频文件转换为gif
其他一些回答中提到了[video2gif]&003脚本,我用的是这个脚本。
要创建上下文菜单选项,你需要编辑你的注册表。打开一个powershell命令提示符,用admin privs运行。执行这些命令:
*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force
现在当你右键点击一个文件,你会有一个 "Run Video2Gif "选项!
btw我把ffmpeg安装到`C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# 如何添加一个windows 7/10 "右键点击 "上下文菜单条目,将视频文件转换为gif
其他一些回答中提到了[video2gif]&003脚本,我用的是这个脚本。
要创建上下文菜单选项,你需要编辑你的注册表。打开一个powershell命令提示符,用admin privs运行。执行这些命令:
$key = "Registry::HKEY_CLASSES_ROOT# 如何添加一个windows 7/10 "右键点击 "上下文菜单条目,将视频文件转换为gif
其他一些回答中提到了[video2gif]&003脚本,我用的是这个脚本。
要创建上下文菜单选项,你需要编辑你的注册表。打开一个powershell命令提示符,用admin privs运行。执行这些命令:
*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force
现在当你右键点击一个文件,你会有一个 "Run Video2Gif "选项!
btw我把ffmpeg安装到,并把video2gif.bat
脚本放在ffmpeg.exe
旁边的bin dir里。我也把C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin
添加到了我的windows PATH
中,但我认为你不需要这样做。