在做音视频的项目当中,常常遇到音视频不同步,编码和解码的出错的等等问题,这时候就需要将对应出问题的视频数据给dump下来进行分析,使用ffmpeg的各种工具能够更好的分析对应的音视频的文件。
ffmpeg
ffmpeg工具主要用于音视频转码。
使用规则是:
ffmpeg [global_options] {
[input_file_options] -i input_url} ... {
[output_file_options] output_url} ...
1.流说明符
stream_index
表示流的编号,是从0开始的,一般使用的时候都是配合streamType进行使用的。
示例
比如-codec:a :1 ac3,表示指定第二路音频流使用ac3进行编码,不指定stream_index的话,就表示所有的流,-b:a 128k,表示指定所有的音频流都用128k的码率,-codec copy 或者-codec:copy则表示将只是将流复制,并没有重新编码
stream_type
stream_type | 说明 |
---|---|
‘v’ 或者 ‘V’ | 表示视频 |
‘a’ | 表示音频 |
‘s’ | 表示字幕 |
‘d’ | 表示data |
‘t’ | 表示附加信息 |
p:program_id[:stream_index] or p:program_id[:stream_type[:stream_index]] or p:program_idⓂ️key[:value]"
第一种情况,匹配指定的stream_index流;
第二种情况,匹配指定的stream_type和指定的stream_index的流;
第三种情况,匹配指定metadata的流
m:key[:value]
跟指定了metadata的key和value的流进行匹配,value没有给出的话,匹配有对应的key的流。
u
跟可用配置的流进行匹配。
2.通用选项
这些选项都在ff*的工具都通用
-L
显示证书
-h,-?,-help,–help [arg]
帮助说明
arg的取值
arg取值 | 说明 |
---|---|
long | 打印附加的选项 |
full | 打印全部的选项 |
decoder=decoder_name | 打印指定解码器的参数 |
encoder=encoder_name | 打印指定编码器的参数 |
demuxer=demuxer_name | 打印指定解复用器的参数 |
muxer=muxer_name | 打印指定合成器的参数 |
filter=filter_name | 打印指定滤镜的参数 |
-version
显示版本
-formats、-demuxers、-muxers、-devices、-codecs、-decoders、-encoders、-bsfs、-protocols、-filters、-pix_fmts、-sample_fmts、-layouts-colors、-sources device[,opt1=val1[,opt2=val2]…]、-sinks device[,opt1=val1[,opt2=val2]…]
上面参数都显示类的,都是显示可用的参数,bsfs是bitstream fitlers
-loglevel [flags+]loglevel | -v [flags+]loglevel
loglevel有如下的值
值 | 类型 | 说明 |
---|---|---|
-8 | quiet | 不显示任何东西 |
0 | panic | 只显示错误信息,和导致错误的信息 |
8 | fatal | 显示错误信息 |
16 | error | 显示所有的错误信息 |
24 | warning | 显示warning信息 |
32 | info | 显示info信息 |
40 | verbose | 显示verbose信息 |
48 | debug | 显示所有信息 |
56 | trace | 显示trace信息 |
-report
将所有的日志给dump下来,文件名字规则为program-YYYYMMDD-HHMMSS.log
-hide_bander
压制打印的banner
-cpuflags flags
3.主要的选项
-f fmt (input/output)
指定输入输出的格式
-i url (input)
输入的文件格式
-y (global)
不在询问的重写输出文件
-n (global)
不重写输出文件
-stream_loop number(input)
设置输入的流是否需要循环,Loop 0表示不loop,loop -l表示无限loop
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
指定转码的编码器
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
-map 0表示对所有的视频流都生效,-c:v 表示指定视频流的编码器,-c:a 表示对音频流的只是复制而已。
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
-t duration (input/output)
表示限制读取的数据的时间长度
-to position (input/output)
表示停止读取源文件的位置
-fs limit_size (output)
显示输出文件的大小
-ss position (input/output)
指定输入或者输出文件的起始位置
-sseof position (input)
指定输入文件的结束位置
-itsoffset offset (input)
设置输入文件的时间偏移
-timestamp date (output)
设置录制的时间戳
-metadata[:metadata_specifier] key=value (output,per-metadata)
添加输入文件的metadata信息
ffmpeg -i in.avi -metadata title="my title" out.flv
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-disposition[:stream_specifier] value (output,per-stream)
设置流的配置
下面有流的配置
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
-program [title=title:][program_num=program_num:]st=stream[:st=stream…] (output)
创建指定的项目
-target type (output)
设置输出的文件类型
vcd, svcd, dvd, dv, dv50等等类型,有可能要使用这些格式前缀pal-, ntsc- or film-
示例
ffmpeg -i myfile.avi -target pal-vcd /tmp/vcd.mpg
-dn (output)
不转码data数据
-dframes number (output)
设置data数据的帧率
-frames[:stream_specifier] framecount (output,per-stream)
设置达到某个帧数,然后停止转码
-q[:stream_specifier] q (output,per-stream)
-qscale[:stream_specifier] q (output,per-stream)
用来解决高质量的转码
-filter[:stream_specifier] filtergraph (output,per-stream)
使用指定的滤镜效果,filtergraph是过滤器图
-filter_script[:stream_specifier] filename (output,per-stream)
和上面的参数一致
-filter_threads nb_threads (global)
定义处理filter的线程数
-pre[:stream_specifier] preset_name (output,per-stream)
设置流的预先配置
-stats (global)
打印转码的状态日志
-progress url (global)
将处理进度打印到文件当中
-stdin
开启标准输入输出
-debug_ts (global) 或者-fdebug ts
打印转码时间戳,用来测试或者debug的
-attach filename (output)
添加一个附属的文件到输出文件中
ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s