FFmpeg
介绍¶
功能¶
decode, encode, transcode, mux, demux, stream, filter, play
Lib¶
libavcodec, libavutil, libavformat, libavfilter, libavdevice, libswscale and libswresample
libavutil¶
A library containing functions for simplifying programming, including random number generators, data structures, mathematics routines, core multimedia utilities, and much more.
libavcodec 编解码库¶
A library containing decoders and encoders for audio/video codecs.
libavformat 封装库¶
A library containing demuxers and muxers for multimedia container formats.
libavdevice¶
A library containing input and output devices for grabbing from and rendering to many common multimedia input/output software frameworks, including Video4Linux, Video4Linux2, VfW, and ALSA.
libavfilter 加特效(如:水印)¶
A library containing media filters.
libswscale¶
A library performing highly optimized image scaling and color space/pixel format conversion operations.
libswresample¶
A library performing highly optimized audio resampling, rematrixing and sample format conversion operations.
App¶
ffmpeg, ffserver, ffplay and ffprobe
ffmpeg¶
A command line tool to convert multimedia files between formats
ffserver¶
A multimedia streaming server for live broadcasts
ffplay¶
A simple media player based on SDL and the FFmpeg libraries
播放视频
ffplay a.mp4
ffprobe¶
A simple multimedia stream analyzer
查看所有视频文件编码
find /mnt/f ( -iname .mp4 -o -iname .mov -o -iname .avi -o -iname .mkv -o -iname .wmv -o -iname .mpg ) -exec ./ffprobe {} \;
静态包下载地址¶
http://johnvansickle.com/ffmpeg/
库¶
libx264¶
libx265-10bit¶
视频标准¶
Apple HLS 标准定义编码¶
Video¶
H.264 Baseline Level 3.0, Baseline Level 3.1, Main Level 3.1, and High Profile Level 4.1.
Audio¶
HE-AAC or AAC-LC up to 48 kHz, stereo audio
MP3 (MPEG-1 Audio Layer 3) 8 kHz to 48 kHz, stereo audio
AC-3 (for Apple TV, in pass-through mode only)
音视频文件格式编码¶
https://zh.wikipedia.org/wiki/视频文件格式
https://zh.wikipedia.org/wiki/AVI格式
多媒体容器对比¶
https://en.wikipedia.org/wiki/Comparison_of_video_container_formats
视频编码对比¶
https://en.wikipedia.org/wiki/Comparison_of_video_codecs
音频编码对比¶
https://zh.wikipedia.org/wiki/音频编码格式的比较
流媒体系统对比¶
https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems
ffmpeg¶
语法¶
ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...
功能¶
- 音视频转换 *
- 直播录制 *
- 实时采样率转换 *
- 实时改变大小 *
输入 -i¶
文件、管道、网络、采集设备
文件引用,流引用¶
0, 1, 2:第一个文件,第二个文件,第三个文件
2:3:第三个文件的第四个流
文件参数¶
文件参数只对当前文件起作用
除全局参数外,文件参数依次跟在文件前面
设置输出文件码率为64kbit/s:ffmpeg -i input.avi -b:v 64k output.avi
设置输出文件帧率为24fps:ffmpeg -i input.avi -r 24 output.avi
设置输入文件帧率为1fps,输出文件帧率为24fps:ffmpeg -r 1 -i input.m2v -r 24 output.avi
流复制¶
-codec copy
-codec: copy
默认流程:输入-》解封装-》解码-》过滤器-》编码-》封装-》输出
复制流程:输入-》接封装-》封装-》输出
流自动选择规则¶
视频:选择输出分辨率最高的
音频:选择channel最多的
字幕:选择第一个
质量相同的:选择索引号最低的
手动配置忽略音频/视频/字幕:-vn/-an/-sn
映射配置:-map
流配置项¶
stream_index:使用流索引 -thread:1 4,第二条流设置为4
stream_type[:stream_index]:视频vV,音频a,字幕s,数据d,附件t,不加索引表示全部这一类型
p:program_id[:stream_index]
stream_id或i:stream_id:使用流id,如MPEG-TS的PID
m:key[:value]:使用metedata中key的值
例如 -codec copy 或-code: copy 所有流配置
例如 -codec:a:1 ac3,设置音频第二条流编码为ac3
缩写¶
-codec:v = -vcodec
-codec:a = -acodec
-b:v = -vb
-b:a = -ab
通用选项¶
查看所有格式¶
ffmpeg -formats
查看所有支持编码¶
ffmpeg -codecs
查看所有解码器¶
ffmpeg -decoders
查看所有编码器¶
ffmpeg -encoders
获取帮助¶
ffmpeg -h
ffmpeg -h long
ffmpeg -h full
查看特定编码帮助¶
ffmpeg -h encoder=nvenc_h264
查看封装默认编码¶
ffmpeg -help muxer=matroska
查看文件音视频编码编码¶
ffmpeg -i INPUTFILE 会报错,忽略错误
ffprobe INPUTFILE
MP4流媒体优化参数¶
mov或mp4格式¶
OUTPUT.mov
OUTPUT.mp4
-f mov OUTPUT
-f mp4 OUTPUT
moov索引前置(默认在文件最后)¶
-movflags +faststart
H.264高品质(High profile)¶
-c:v libx264 -profile:v {high|main|baseline}
合适码率,见nginx-vod-module分辨率对应码率表格¶
-c:v libx264 -x264-params b=option
- ffmpeg选项单位是bits/s,x264选项单位是kilobits/s *
逐行扫描(progressive scan),避免隔行扫描(interlaced)¶
Multi pass¶
动态码率(VBR),避免固定码率(CBR)¶
-c:v libx264 -b:v 1000k OUTPUT
- 默认就是动态码率,固定码率需要限制-minrate -maxrate为相同值模拟固定码率 *
帧率保持不变¶
默认帧率保持不变
将ISO文件压缩为MP4¶
ffmpeg -i INPUT.iso OUTPUT.mp4
字幕格式转换¶
ffmpeg -i Tor_animation.zh-CN.srt Tor_animation.zh-CN.ass
选项¶
设置媒体格式¶
-f fmt (input/output)
一般输入文件会自动识别格式,输出文件会根据文件后缀名自动设置格式
设置输入文件¶
-i filename (input)
覆盖输出文件¶
-y (global)
设置编解码格式¶
-c [:stream_specifiler] codec (input/output/per-stream)
-codec[:stream_specifiler] codec (input/output/per-stream)
例1:视频使用编码libx264,音频原样复制:
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
例2:多个-c选项会使用最后设置的,第二条视频流编码设置为libx264,第138条音频编码设置为libvorbis
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
常用视频编码:
ffmpeg -encoders | grep V
-c:v libx264
-c:v libx265
-c:v mpeg2video
-c:v mpeg4
-c:v gif
-c:v flv
-c:v libxvid
-c:v h264_nvenc = evenc = nvenc_h264
-c:v nvenc_hevc = hevc_nvenc
-c:v h264_qsv
-c:v hevc_qsv
-c:v mpeg2_qsv
常用音频编码:
ffmpeg -encoders | grep A
-c:a mp2
-c:a mp2fixed
-c:a libtwolame
-c:a libmp3lame
-c:a wmav1
-c:a wmav2
-c:a aac
常用字幕编码:
ffmpeg -encoders | grep S
-c:s ssa
-c:s ass
-c:s dvbsub
-c:s dvdsub
-c:s mov_text
-c:s srt
-c:s subrip
-c:s text
-c:s webvtt
-c:s xsub
设置时间段¶
-t duration (input/output)
为输入设置项时,会限制读取的时间段
为输出设置项时,在时间段内会停止写入
-to 设置与 -t设置冲突,-t有更高的优先级
设置停止写入时间点¶
-to position (output)
限制输出文件大小,达到后停止输出文件¶
-fs limit_size (output)
设置起始时间点¶
-ss position (input/output)
当用作输入文件的配置项时,会定位到输入文件的位置。
大部分格式不可能精确定位,所以ffmpeg会定位到position前的附近位置,当转码accurate_seek被设置时(默认设置),多余的数据会被解码并丢弃。当使用copy或-noaccurate_seek时,会被保留
设置结束时间点¶
-sseof position (input/output)
帧率¶
ffmpeg -r[:stream] fps (intput/output, per-stream)
用作输入时,忽略时间戳,强制按帧率读取
用作输出时,复制或丢弃帧达到帧率
- 言外之意是默认帧率保持不变 *
码率¶
-b:v option 设置视频码率
-b:a option 设置音频码率
硬件加速¶
-hwaccel[:stream_specifier] hwaccel (input,per-stream)
none:默认值,不要用任何硬件加速
auto:自动选择硬件加速
vda:Apple VDA硬件加速
vdpau:使用VDPAU(Video Decode and Presentation API for Unix)硬件加速
dxva2:使用DXVA2(DirectX Video Acceleration)硬件加速
qsv:使用Intel QuickSync Video acceleration硬件转码加速
qsv不同于其他选项,这个选项不开启解码加速(qsv解码器支持会自动开启),但是被加速转码不复制frame帧到系统内存。
编码和解码都要QSV acceleration,不能使用filter。
如果被选的加速器不能使用或不支持当前的解码器,则这个选项无效
大多数的加速方法都是为了播放,所以在现代CPU上并不会比软件解码快,而且ffmpeg还需要将解码的帧从GPU内存复制到系统内存,反而比软解慢,只用于测试。
map映射¶
映射第一个输入的全部流:
-map 0
ffmpeg -i INPUT -map 0 output
映射第一个输入的第二条流:
-map 0:1
ffmpeg -i INPUT -map 0:1 out.wav
映射第一个输入的第三条流和第二个输入的第七条流:
-map 0:2 -map 1:6
ffmapg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
映射第一个输入的全部视频和第三条音频:
-map 0:v -map 0:a:2
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
映射第一个输入的全部流,排除第二条音频:
-map 0 -map -0:a:1
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
映射第一个输入的英文音频
-map 0:m:language:eng
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
视频选项(以H.264为例)¶
原文:https://trac.ffmpeg.org/wiki/Encode/H.264
翻译:http://blog.csdn.net/vblittleboy/article/details/8982857
- 所有视频选项都是针对流设置的 *
CRF(8bit)¶
值域:0 - 51,0代表无损,51最差
默认值:23
合理值:18 - 28
建议值:18
- CRF每减小6,文件变大1倍 *
preset(预设,速度与质量平衡)¶
ultrafast
superfast
veryfast
faster
fast
medium
slow
slower
veryslow
placebo
默认值:medium
质量最好:veryslow
H.265 HEVC¶
https://trac.ffmpeg.org/wiki/Encode/H.265
文件合并¶
https://trac.ffmpeg.org/wiki/Concatenate
ffmpeg -f concat -safe 0 -i d:\list.txt -c copy 1.mp4
# this is a comment
file '\\YX-NAS\path\1.wmv'
file '\\YX-NAS\path\2.wmv'
file '\\YX-NAS\path\3.wmv'
file '\\YX-NAS\path\4.wmv'
硬件加速¶
https://trac.ffmpeg.org/wiki/HWAccelIntro
列出所有支持的硬件加速¶
ffmpeg -hwaccels
dxva2¶
- 支持H.264, MPEG2, VC1 and WMV3加速解码 *
编译选项:--enable-dxva2 (已经默认打开)
使用硬件加速:-hwaccel dxva2
示例:ffmpeg -hwaccel dxva2 -threads 1 -i INPUT -f null - -benchmark
NVENC¶
使用条件:
1、Nvidia显卡
2、Nvidia驱动
3、本地安装NVENC SDK的nvEncodeAPI.h头文件 https://developer.nvidia.com/nvidia-video-codec-sdk
4、ffmpeg --enable-nvenc (已经默认打开)
使用h.264编码器:ffmpeg -c:v nvenc_h264 (h264_nvenc, nvenc)
使用h.265编码器:ffmpeg -c:v nvenc_hevc (hevc_nvenc)
获取h.264帮助:ffmpeg -h encoder=nvenc_h264
获取h.265帮助:ffmpeg -h encoder=nvenc_hevc
示例:ffmpeg -i input -c:v nvenc_h264 -profile high444p -pixel_format yuv444p -preset default output.mp4
Intel QSV¶
Intel Media Server Studio – Community Edition:
编译选项:--enable-libmfx (已经默认打开)
查询所有解码器:ffmpeg -decoders | grep _qsv
查询所有编码器:ffmpeg -encoders | grep _qsv
h264编码器、解码器:-c:v h264_qsv
h265编码器、解码器:-c:v hevc_qsv
MPEG2编码器、解码器:-c:v mpeg2_qsv
vc1_qsv解码器:-c:v vc1_qsv
示例:ffmpeg -i INPUT -c:v h264_qsv -preset:v faster out.qsv.mp4