ffmpeg工具包含 ffmpeg ffprobe和ffplayer,此处归纳总结前两个的常用用法,对于ffplayer 本文不加叙述。
ffmpeg 音视频处理工具
ffprobe 音视频分析工具,分析指定音视频的格式,
ffplayer 音视频播放工具
本文工具所运行的环境均为Linux环境。
本文主要解析ffmpeg的操作,ffprobe简要叙述
一 ffprobe
1.命令格式
ffprobe [options] [input_url]
options:
要操作的选项,如果时查询ffprobe的信息,则后面input_url可以为空
input_url
要分析的视频对象,可以是一个视频播放地址,也可以是一个文件名
2.查看当前ffprobe信息
-L 显示当前ffprobe的license
-h 显示帮助信息
-h [arg] 显示指定的帮助信息
arg
decoder=name 显示指定的解码器信息
encoder=name 显示指定的编码器信息
demuxer=name 显示指定的解封装格式信息
muxer=name 显示指定的封装格式信息
filter=name 显示指定的滤镜信息
bsf=name 显示指定的流过滤器信息
protocol=name 显示指定的网络协议信息
-version 显示指定的版本信息
-formats 显示当前支持的格式
-demuxers 显示当前支持的编码器
-muxers 显示当前的编码器
-devices 显示当前可用的设备
-codecx 显示当前支持的编码器
-decoders 显示当前可用的解码器
-bsfs 显示当前可用的流过滤器
-protocols 显示当前支持的网络协议
-filters 显示当前的滤镜
-pix_fmts 显示当前知道hi的像素格式
-samples 显示当前支持的采样率
-layouts 显示当前支持的通道名称和通道布局
3.查看音视频信息
-f format 强制使用指定的format去分析视频
-unit 显示当前所显示值的单位
-prefix 对显示的值使用SI前缀。除非使用了“-byte_binary_prefix”选项,否则所有前缀都是十进制的。
-byte_binary_prefix 强制使用二进制前缀显示字节值
-sexagesimal 使用sexagesimal格式显示时间值HH:MM:SS.MICROSECONDS
-pretty 优化当前显示值得格式,它对应于选项“-unit -prefix -byte_binary_prefix -sexagesimal”。
-of -print_format writer_name 以指定格式去打印数据,入-print_format jason
-sections 打印结构和机构信息,然后推出。输出并不意味着由机器进行解析
-select_streams stream_specifier 仅选择stream_specifier指定的流。这个选项只影响与流相关的选项(例如show_streams, show_packet等)。
-show_data 以十六进制和ASCII转储的形式显示有效负载数据
-show_data_hash algorithm 显示当前负载数据得哈希值,对packets要带上-show_packets,对编码extradata,要带上-show_streams
-show_format 显示当前视频格式
-show_packets 显示每个数据包得信息,
-show_frames 显示每个数据帧得具体信息
-show_streams 显示数据流得信息
-show_programs 显示包含在多媒体流中的程序信息和数据流
-show_chapters 显示格式中的每个存储章节的信息
-show_private_data 显示私有数据,这些数据取决于当先展示的元素格式, 这个选项默认被使能,但是你需要关闭它对于一些特殊的使用,例如当创建XSD-compliant XML的输出时
-i 读取输入,可以是一个文件路径,或者一个视频的url
二 ffmpeg
1.命令格式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
global_options :全局变量
input_file_options :针对输入文件的选项
input_url:输入的多媒体文件,可以是一个文件的绝对/相对路径,也可以是一个URL,输入文件前用 -i 来标识这是输入文件
output_file_options :针对输出文件的选项
out_url:输出文件的路径,可以是一个绝对/相对路径,也可以是一个URL
2.滤镜
图示如下:
1.简单滤镜
一个简单的滤镜流程如下:
decoded frames ----(simple filtergraph)---->filtered frames----(encoder)---->encoded data packets
简单滤镜在使用是使用 -filter选项
2. 复杂滤镜流程
复杂滤镜在使用时使用 -fileter-complex
2.流的复制
流程如下:
流的复制时使用 -copy选项后面跟上指定的参数
3.流的选择
ffmpeg 使用-map选项来手动选择要输出到输出文件中的文件流。同样的,也可以跳过-map选项,使用-vn/-an/-sn/-dn选项来跳过视频/音频/字幕/数据流。
1.自动选择
当未使用选项时,ffmpeg会自动选择合适的选项
- 对与视频流,自动选择最高分辨率的视频流
- 对于音频流,自动选择通道数最多的视频流
- 对于字幕,这是找到的第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本或基于图像的,并且只会选择相同类型的字幕流
2.手动选择
使用-map时,该输出文件中仅包含用户映射的流,
3.示例
数据源:
input file 'A.avi'
stream 0: video 640x360
stream 1: audio 2 channels
input file 'B.mp4'
stream 0: video 1920x1080
stream 1: audio 2 channels
stream 2: subtitles (text)
stream 3: audio 5.1 channels
stream 4: subtitles (text)
input file 'C.mkv'
stream 0: video 1280x720
stream 1: audio 2 channels
stream 2: subtitles (image)
自动选择视频源:
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
此处有三个输出文件
对于输出文件out1.mkv,该格式是一个Matroska容器,可以接收视频,音频和字母数据。此时ffmpeg自动为该容器选择每种格式的最合适的数据流。视频,选择B.mp4中的stream 0,此路视频流在输入中的所有数据流中分辨率最高;音频,选择B.mp4中的stream 3,此路音频流在所有数据流中通道数最多;字幕,选择B.mp4的stream 2,此路字幕流是输入中解析到的第一路字幕流
对于输出文件out2.wav,他只接受音频流,因此选择了通道数最多的B.mp4中的stream 3 输出到该文件中。
对于输出文件out3.mov,因为有一个-map 1:a 选项,因此会选择B.MP4中所有的音频流文件到该输出文件中
对于前两个输出文件,所有数据流都会被重新编码,编码器由ffmpe选择对应格式的默认编码器。对于输出文件3,由于有
-c:a copy,因此不会有重编码操作,该音频流会直接拷贝
自动/手动选择字幕源
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
尽管mkv容器能接受字幕信息,但是由于它只接受基于text格式的字幕,而C.mkv中的字幕是基于image的,因此在ou1.mkv中默认不会输出字幕。对于out2.mkv 由于有选项 -c:s 因此字幕数据流仍会被输出到该文件中,同时由于设置了选项 -an,因此在该文件汇总不会存在音频流
无标签的滤镜输出
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
此处使用了一个“overlay”滤镜,该滤镜要求至少有两路输入视频流,因为没有指定视频输入,因此两路视频流均会被使用到。由于过滤器没有标签,因此会被用于out1.mp4。
有标签的滤镜输出
4 操作
1.流说明符
一些选项被用于每一个流,如二进制流和编码器。流说明符用于精确指定得每一路数据流得属性。流说明符是一个字符串,通常来说附加在操作选项得名字后用一个冒号隔开。如 -codec:a:1 ac3 包含了a:1流说明符。另一方面,一个流说明符也可以匹配多个数据流,如 -b:a 128k指定了所有得音频数据流。如 -codec copy将应用与所有得数据流。
可能用到得流说明符如下:
stream_index:
数据流得序号。用指定得序号来匹配数据流。
stream_type:
流得类型,如a代表音频 v或V代表视频(v匹配所有得视频流V只匹配不携带艺术封面或图片得视频流),s代表字幕等
p:program_id:
匹配程序中id为program_id的shu'ju'liu
#stream_id 或者i:stream_id:
通过id来匹配数据流
2.通用选项
此处通用选项针对所有ffmpeg工具,可参考ffprobe
3.音视频选项
这些选项由libavformat,libavdevice和libavcodec来提供,如果需要查询具体可用的选项,可以通过 -help 来查看。这些选项大致可分为两类:
generic:
这些选项可以用于所有的容器,设备和编码。常规选项在容器/设备的AVFormatContext选项下和编解码器的AVCodecContext选项下列出
private:
和通用选项相同,可以用于容器设备和编码。专用选项在其相应的容器/设备/编解码器下列出。
如将MP3的头由ID3v2.3改为ID3V2.4
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有的音视频选项都是按流来操作的,因此需要将他们匹配到每一个流
ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
在上面的示例中,多通道音频流被映射两次以进行输出。第一个实例使用编解码器ac3和比特率640k进行编码。第二个实例降混到2个通道,并使用编解码器aac进行编码。使用输出流的绝对索引为其指定了128k的比特率。
4.主要选项
-f fmt 对输出/输出用指定的fmt格式来解析
-i url 指定输入文件的url
-y 覆盖输出文件不需要询问
-n 输出文件不要覆盖已经存在的文件,若输出的文件已经存在,则立即推出
-stream_loop number 设定输入数据流的循环次数,0待变不循环,-1待变
-codec[:stream_sercifier]
-c[:stream_sercifier] 只当编码器,针对的每一路数据流 如果不需要更改格式,后面可使用copy参数
例
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
ffmpeg -i INPUT -map 0 -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
-t duration 当用作输入选项时(-i之前),请限制从输入文件读取数据的持续时间
当用作输出选项时(在输出URL之前),请在持续时间达到持续时间后停止写入输出
duration必须是一个持续时间规范
-fs limit_size 设置输出文件的大小
-ss position 对于输入,如果在-i 之前对于输入文件,在poiont之前的部分被丢弃,对于输出文件,在point之前的部分,
解码但是丢弃数据
-itsscale scale 重新调整输入时间戳。标度应为浮点数
-timestamp date 设置记录的时间戳
-metadata[:metadata_specifier] key=value 设置元数据键值对可以提供可选的metadata_specifier来设置流,章节或程序上
的元数据。有关详细信息,请参见-map_metadata文档。此选项将覆盖使用-map_metadata设置的元数据。也可以通过使用空值来删除元数据。
ffmpeg -i in.avi -metadata title="my title" out.flv
-disposition[:stream_specifier] value 设置流的处置,此选项将覆盖从输入流复制的处置。通过将其设置为0,也可以删除
该处置。以下的选项将被识别:
default
dub
original
comment
lyrics
karaoke
forced
hearing_impaired
visual_impaired
clean_effects
attached_pic
captions
descriptions
dependent
metadata
将第二路码流设置为默认码流ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv
将第二路字幕设置为默认字幕,并取消第一路字幕的默认配置
ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv
-dn 作为输入选项时,阻止所有的数据流被过滤或被自动选择为输出。如果需要手动禁止某一轮数据流,参考-
discard的用法;作为输出时,禁止数据记录
-dframes number 设置要输出的数据帧的数量
-q[:stream_apecifier] q
-qscale[:stream_apecifier] q 使用固定质量量表(VBR)。 q / qscale的含义取决于编解码器。如果在不使用
5.视频选项
-vFrames number 设置要输出的数据帧的数量
-s[:stream_specifier] size 设置数据帧的大小,作为输入选项时这是video_size私有选项的快捷方式,已被某些多路分解器
识别,其帧大小未存储在文件中或可配置;作为输出选项时,这将会对视频做一个裁剪滤镜并输
出到结果中
-r[:stream_specifier] fps 设置帧率
-aspect[:stream_specifier] aspect 设置播放的纵横比 如设置16:9或者1.7777都是合法的
-vn 作为输入选项,阻止文件的所有视频流被过滤或为任何输出自动选择或映射
-vcodec codec 设置视频编码器和-c:v 以及-codec:v作用相同
-vf filtergraph 设置视频滤镜
-autorotate 设置视频源的自动旋转
-autoscale 设置自动裁剪
6.音频选项
-aframes number 设置要输出的音频帧数量
-ar[:stream_specifier] freq 设置音频的采样率适用于输入和输出
-aq q 设置音频的质量(特定编码器的vbr)
-ac[:stream_specifier] 设置音频通道数
-an 作为输出时,禁止所有音频流,作为输出时,禁止所有的音频记录
-acodec codec 指定编码器,和-codec:a以及-c:a含义相同
-sample_fmt[:stream_specifier] sample_fmt 指定音频格式,可以使用 -sample_fmt来获取当前支持的格式列表
-af filtergraph 指定音频滤镜
7.字幕选项
-scodec codec 设置编码器,和-codec:s以及-c:s作用相同
-sn 作为输出,禁止所有的字幕流,作为输出时,禁止所有的字幕流记录
-sbsf bitstream_filter 不推荐使用,参考-bsf