edit

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