赞
踩
1、点击跳转 ===> FFmpeg 官方文档地址
2、点击跳转 ===> FFmpeg 官方 Wiki 地址
3、点击跳转 ===> FFmpeg 翻译文档地址
https://xdsnet.gitbooks.io/other-doc-cn-ffmpeg/content/index.html
4、点击跳转 ===> FFmpeg 中文论坛地址
5、点击跳转 ===> FFmpeg 雷神博客地址
6、点击跳转 ===> 罗索实验室官方地址
7、点击跳转 ===> FFmpeg 命令行实践+理论分析(视频教程)
视频中的地址已经无法打开,我将 ffmepg4.3.1 的开发包和源码上传到了百度云:
链接:https://pan.baidu.com/s/1-3xSO6ytyQLlSId0Xiak4w 提取码:fyxy
C:\Users\lenovo>ffmpeg431.exe -version
ffmpeg version 4.3.1 Copyright © 2000-2020 the FFmpeg developers built with gcc 10.2.1 (GCC) 20200726
configuration: --enable-gpl --enable-version3 --enable-sdl2
–enable-fontconfig --enable-gnutls --enable-iconv --enable-libass
–enable-libdav1d --enable-libbluray --enable-libfreetype
–enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus
–enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt
–enable-libtheora --enable-libtwolame --enable-libvpx
–enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265
–enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib
–enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis
–enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex
–enable-libxvid --enable-libaom --enable-libgsm --disable-w32threads
–enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid
–enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2
–enable-avisynth --enable-libopenmpt --enable-amf
FFmpeg 选项
一、主要选项
ffmpeg431 -ss 10 -i ande_302.mp4 -t 00:00:10.345 -vcodec copy/libx264/libxvid -acodec copy
-f: 文件,封装格式
-vcodec/acodec: 音视频编解码格式
1、-f fmt (input/output) 指定输入或者输出文件格式(封装格式,视频容器)。常规可省略而使用依据扩展名(文件的前几百 K 的内容,智能分析 )的自动指定,但一些选项需要强制明确设定。
2、-i filename (input) 指定输入文件。
3、-y (global) 默认自动覆盖输出文件,而不再询问确认。
4、-n (global) 不覆盖输出文件,如果输出文件已经存在则立即退出。
5、-t duration(input/output) 限制输入/输出的时间。如果是在 -i 前面,就是限定从输入中读取多少时间的数据;如果是用于限定输出文件,则表示写入多少时间数据后就停止。
duration 可以是以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值。 注意 -to 和 -t 是互斥的,-t 有更高优先级。
6、-to position (output) 只写入 position 时间后就停止,position 可以是以秒为单位的数值或者 hh:mm:ss[.xxx]格式的时间值。 注意 -to 和 -t 是互斥的,-t 有更高优先级。
7、-ss position (input/output)
当在 -i 前,表示定位输入文件到 position 指定的位置。注意可能一些格式是不支持精确定位的,所以 ffmpeg 可能是定位到最接近 position(在之前)的可定位点。position 可以是以秒为单位的数值或者 hh:mm:ss[.xxx] 格式的时间值。
8、-codec[:stream_specifier] codec (input/output,per-stream) 为特定的文件选择编/解码模式,对于输出文件就是编码器,对于输入或者某个流就是解码器。选项参数中 codec 是编解码器的名字,或者是 copy(仅对输出文件)则意味着流数据直接复制而不再编码。
二、视频选项
1、-vframes number (output) 设置输出文件的帧数,是 -frames:v 的别名。
2、-r[:stream_specifier] fps (input/output,per-stream) 设置帧率(一种 Hz 值,缩写或者分数值)。
3、-s[:stream_specifier] size (input/output,per-stream) 设置帧的尺寸。
4、-vn (output) 禁止输出视频。N:no
5、-vcodec codec (output) 设置视频编码器,这是 -codec:v 的一个别名。
6、aspect[:stream_specifier] aspect (output,per-stream) 指定视频的纵横比(长宽显示比例)。
aspect 是 一 个 浮 点 数 字 符 串 或 者 num:den 格 式 字 符 串 ( 其 值 就 是 num/den) , 例 如
“4:3”,“16:9”,"1.3333"以及"1.7777"都是常用参数值。
Ffmpeg431.exe -encoders
Flv: [sorenson spark(vcodec) + mp3(acodec)]
ffmpeg431 -i ande_302.mp4 -vcodec libx264 -vframes 90 -f flv -y ande_302-testflv.flv
ffmpeg431 -i ande_302.mp4 -vn -f flv -y ande_302-testflv.flv
三、音频选项
1、-aframes number (output) 设置 number 音频帧输出,是 -frames:a 的别名。
2、-ar[:stream_specifier] freq (input/output,per-stream) 设置音频采样率。默认是输出同于输入。对于输入进行设置,仅仅通道是真实的设备或者 raw 数据分离出并映射的通道才有效。对于输出则可以强制设置音频量化的采用率。
3、-aq q (output) 设置音频品质(编码指定为 VBR),它是 -q:a 的别名。
4、-ac[:stream_specifier] channels (input/output,per-stream) 设置音频通道数。默认输出会有输入相同的音频通道。对于输入进行设置,仅仅通道是真实的设备或者 raw 数据分离出并映射的通道才有效。
5、-an (output) 禁止输出音频。
6、-acode codec (input/output) 设置音频解码/编码的编/解码器,是 -codec:a 的别名。
Mp3: libmp3lame
ffmpeg431 -i ande_302.mp4 -vn -aframes 180 -acodec libmp3lame -ac 2 -ar 48000 -y
ande_302-testmp3.mp3
quality settings (VBR)
-aq 4 = 128 kb/s
-aq 5 = 160 kb/s
-aq 6 = 192 kb/s
-aq 7 = 224 kb/s
-aq 8 = 256 kb/s
-codec:a, -codec:v, -codec:s
-c:a, -c:v, -c:s
-acodec, -vcodec, -scodec
subtitle
四、字幕选项
1、-scodec codec(input/output) 设置字幕解码器,是 -codec:s 的别名。
2、-sn (output) 禁止输出字幕。
S: subtitle:字幕
字幕格式: srt, ass, ssa, … Srt:
ffmpeg431 -i 0.mp4 -vf subtitles=012.srt -y output1001.mp4 mov_text
字幕格式转换:Srt—>ass
ffmpeg431 -i 012.srt 012.ass
ffmpeg431 -i 0.mp4 -i 012.ass -c copy -y output1002.mkv
ffmpeg431 -i output1002.mkv -an -vn -scodec srt output-sub1.srt ffmpeg431 -i output1002.mkv -an -vn -scodec ass -y output-sub1.ass
五、FFmpeg 命令示例
参数说明: 命令格式:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件] ffmpeg [[options][`-i’ input_file]]… {[options] output_file}…
(1)h264: 表示输出的是 h264 的视频裸流
(2)mp4: 表示输出的是 mp4 的视频
(3)mpegts: 表示 ts 视频流
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为 200Kbit/s,bitrate
-r 设定帧速率,默认为 25
-s 设定画面的宽与高( -s 1920x1080)
-aspect 设定画面的比例
-vn 不处理视频
-vcodec(-c:v, -codec:v) 设定视频编解码器,未设定时则使用与输入流相同的编解码器,一般后面加 copy 表示拷贝
音频参数:
-ar 设定采样率
-ac 设定声音的 Channel 数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器,一般后面加 copy
表示拷贝
-an 不处理音频
FFmpeg 命令示例
1、转化格式(封装格式的转化)
ffmpeg -i input_test.mp4 -vn -acodec copy output_test.flv ffmpeg -i input_test.aac -vn -acodec copy output_test.mp3
H264( VCL,NAL, VideoCodingLayer, Network Abstract Layer, NALU)
2、抽取画面中的音频
ffmpeg -i input_test.mp4 -vn -y -acodec copy output_test.aac
/// 注意:视频文件中的音频流必须是 mp3 编码的。
/// mp3: 必须是 mp3 编码的音频流
ffmpeg -i input_test.mp4 -vn -y -acodec copy output_test.mp3 ffmpeg -i input_test.mp4 -acodec copy -vn output_test.mp3
/// audio: aac—>mp3
ffmpeg -i ande_302.mp4 -vcodec copy -acodec libmp3lame -y ande_302-mp3.flv Ffmpeg431 -i ande_302-mp3.flv -vn -acodec copy -y output-demo2.mp3
/// aac: ADTS,必须是 AAC 编码的音频流
Ffmpeg431 -i ande_302-mp3.flv -vn -acodec copy -y output-demo2.aac
3、抽取画面中的视频
ffmpeg -i input_test.mp4 -vcodec copy -an output_test.avi ffmpeg -i input_test.mp4 -vcodec copy -an output_test.mp4
4、音频+视频合成
ffmpeg -i input_test_1.mp4 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp4
ffmpeg -i input_test_1.mp4 -itsoffset 10 -i input_test_2.mp3 -vcodec copy -acodec copy output_test.mp4
//如果希望某个输入流延迟输出,可以使用 itsoffset(input timestamp offset) 参数
ffmpeg -ss 20 -t 5 -i input_test_1.mp4 -i input_test_2.aac -vcodec copy -acodec copy output_test.mp4
//音乐持续播放,视频只播放 5 秒
ffmpeg -ss 20 -t 5 -i input_test_1.mp3 -i input_test_2.mp4 -vcodec copy -acodec copy output_test.mp4
//视频持续播放,音乐只播放 5 秒
5、音频+音频合成
ffmpeg -i input_test_1.mp3 -i input_test_2.mp3
-filter_complex amix=inputs=2:duration=shortest output_test.mp3
// 注意: 混音
ffmpeg -i input_test_1.mp3 -i input_test_2.mp3 -filter_complex amix=inputs=2:duration=longest output_test.mp3
ffmpeg –i input_test_1.mp3 -i input_test_2.mp3 -vcodec copy –acodec copy output_test.mp3
格式:
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
6、视频分离成图片
ffmpeg -i input_test.mp4 -r 1 -f image2 output_image-%03d.jpeg
7、图片合成视频
ffmpeg -f image2 -i output_image-%03d.jpeg output_test.mp4
8、改变音量大小
ffmpeg -i input_test.mp3 -af ‘volume=0.5’ output_test.mp3
9、音效淡入淡出效果
ffmpeg -i input_test.mp3 -filter_complex afade=t=in:ss=0:d=4 output_test.mp3
淡入效果:把 input_test.mp3 文件的前 5s 做一个淡入淡出效果,输出到 output_test.mp3
文件中
d:duration
ffmpeg -i input_test.mp3 -filter_complex afade=t=out:ss=20:d=6 output_test.mp3
淡出效果:将 input_test.mp3 文件从 20s 开始,做 6s 的淡出效果,输出到 output_test.mp3
文件中
10、截取音频
ffmpeg -ss 10 -i input_test.mp3 -to 20 -vn -acodec copy output_test.mp3 ffmpeg -ss 10 -i input_test.mp3 -t 5 -vn -acodec copy output_test.mp3 ffmpeg -i input_test.mp3 -c copy -t 10 -output_ts_offset 120 output_test.mp3
11、容器时长获取
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i input_test.mp3
12、网络资源下载
ffmpeg -i https://xxx.xxx.xxxxxx -c copy -f mp3 output_test.mp3
11、播放音频视频
ffplay input_test.mp3
12、图片生成 gif 动图
ffmpeg -i input_image_%03d.png -r 5 output_test.gif
13、抽取 PCM 数据
ffmpeg -i input_test.mp4 -vn -ar 44100 -ac 2 -f s16le output_test.pcm Signed 16bit le:little-endian
Ffplay -ar 44100 -ac 2 -f s16le output_test.pcm
六、更多选项
(本节内容,仅供参考,)
a)通用选项
-L license
-h 帮助
-formats 显示可用的格式,编解码的,协议的。。。
-f fmt 强迫采用格式 fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
b)视频选项
-b bitrate 设置比特率,缺省 200kb/s
-r fps 设置帧频 缺省 25
-s size 设置帧大小 格式为 WXH 缺省 160X128.下面的简写也可以直接使用: Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop size 设置顶部切除带大小 像素单位
-cropbottom size –cropleft size –cropright size
-padtop size 设置顶部补齐的大小 像素单位
-padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6 个 16
进制的数,红:绿:兰排列,比如 000000 代表黑色)
-vn 不做视频记录
-bt tolerance 设置视频码率容忍度 kbit/s
-maxrate bitrate 设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用 codec 编解码方式。如果用 copy 表示原始编解码数据必须被拷贝。
-sameq 使用同样视频质量作为源(VBR)
-pass n 选择处理遍数(1 或者 2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
-passlogfile file 选择两遍的纪录文件名为 file
c)高级视频选项
-g gop_size 设置图像组大小
-r 25 -g 250
-intra 仅适用帧内编码
-qscale q 使用固定的视频量化标度(VBR)
-qmin q 最小视频量化标度(VBR)
-qmax q 最大视频量化标度(VBR)
-qdiff q 量化标度间最大偏差 (VBR)
-qblur blur 视频量化标度柔化(VBR)
-qcomp compression 视频量化标度压缩(VBR)
-rc_init_cplx complexity 一遍编码的初始复杂度
-b_qfactor factor 在 p 和 b 帧间的 qp 因子
-i_qfactor factor 在 p 和 i 帧间的 qp 因子
-b_qoffset offset 在 p 和 b 帧间的 qp 偏差
-i_qoffset offset 在 p 和 i 帧间的 qp 偏差
-rc_eq equation 设置码率控制方程 默认 tex^qComp
-rc_override override 特定间隔下的速率控制重载
-me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 设置 dct 的算法 可用的有 0 FF_DCT_AUTO 缺省的 DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 设置 idct 算法。可用的有 0 FF_IDCT_AUTO 缺省的 IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6
FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 设置错误残留为 n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 设置错误掩蔽为 bit_mask, 该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用 frames B 帧,支持 mpeg1,mpeg2,mpeg4
-mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用 mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用 4 个运动矢量 仅用于 mpeg4
-part 使用数据划分 仅用于 mpeg4
-bug param 绕过没有被自动监测到编码器的问题
-strict strictness 跟标准的严格性
-aic 使能高级帧内编码 h263+
-umv 使能无限运动矢量 h263+
-deinterlace 不采用交织方法
-interlace 强迫交织法编码仅对 mpeg2 和 mpeg4 有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
-psnr 计算压缩帧的 psnr
-vstats 输出视频编码统计到 vstats_hhmmss.log
-vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开
D)音频选项
-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道 缺省为 1
-an 不使能音频纪录
-acodec codec 使用 codec 编解码
E)音频/视频捕获选项
-vd device 设置视频捕获设备。比如/dev/video0
-vc channel 设置视频捕获通道 DV1394 专用
-tvstd standard 设置电视标准 NTSC PAL(SECAM)
-dv1394 设置 DV1394 捕获
-av device 设置音频设备 比如/dev/dsp
F)高级选项
-map file:stream 设置输入流映射
-debug 打印特定调试信息
-benchmark 为基准测试加入时间
-hex 倾倒每一个输入包
-bitexact 仅使用位精确算法 用于编解码测试
-ps size 设置包大小,以 bits 为单位
-re 以本地帧频读数据,主要用于模拟捕获设备
-loop 循环输入流。只工作于图像流,用于 ffserver 测试
ffmpeg.exe, ffplay.exe, ffprobe.exe
ffmpeg 常用命令
ffmpeg 在做音视频编解码时非常方便,所以很多场景下转码使用的是 ffmpeg, 通过 ffmpeg –help 命令操作可以看到 ffmpeg 常见的命令大概分为六部分:
1.ffmpeg 信息查询部分
2.公共操做参数部分
3.文件主要操作参数部分
4.视频操作参数部分
5.音频操作参数部分
6.字幕操作参数部分
ffmpeg 信息查询部分主要参数:
其中通过 ffmpeg --help 查看到的 help 信息是基础的信息,如果想获得高级参数部分, 可以通过使用 ffmpeg --help long 参数来查看,如果希望获得全部的帮助信息,可以同过使用ffmpeg --help full 参数来获得。
通过-L 参数,可以看到 ffmpeg 目前所支持的 license 协议,通过-version 查看 ffmpeg 的版本,这里所查看的版本,是详细的版本,包含 libavformat、libavcodec、libavutil、libavfilter、
libswscale、libswresample 的版本。
有时候使用 ffmpeg 转码,发现无法解析视频文件,或者无法生成视频文件,报一些不支持生成对应的视频文件的错误,这个时候就需要查看当前使用的 ffmpeg 是否支对应的视频文件格式,需要使用 ffmpeg -formats 来查看。
封装格式/解封装格式
这个列表比较长,还有一些信息,可以自己执行命令查看 根据上图可以看到,在输出的内容中,分为三部分:
第一列是多媒体文件格式的 Demuxing 支持与 Muxing 支持; 第二列是多媒体文件格式;
第三列是文件格式的详细说明。 下面详细介绍 ffmpeg 的封装转换。
Avformat Avcodec Avutil
FFmpeg 的封装转换部分,主要是通过 libavformat 这部分来完成的功能,通过 libavformat 库进行 mux 和 demux 操作,多媒体文件的格式有很多种,但是还是有好多 demux 与 mux 的操作参数是公用的,下面来详细介绍一下这些公用的参数:
通过查看 ffmpeg 的 help full 参数,找到 AVFormatContext 参数部分,在这个参数下面的所有的参数均为封装转换可使用的参数:
avioflags: format 的缓冲设置,默认为 0,就是有缓冲: direct: 无缓冲状态;
probesize: 获得文件内容的大小;
formatprobesiz: 设置一个获得文件内容的大小来解析文件的 format;
fflags: 设置读取或者写出的格式的形式的标签,分为多种方式:flush_packets,ignidx,genpts,
nofillin,noparse,igndts,discardcorrupt,sortdts,keepside,fastseek,latm,nobuffer,bitexact,
下面针对这些 format 读写方式进行一一详解;
AVPacket( 压 缩 的 h264/aac),AVFrame( 原 始 未 压 缩 :yuv,pcm) flush_packets: 立即将 packets 数据刷新入文件中; genpts: 输出是产生 pts;//pts, presentation timestamp, dts:decoding timestamp
nofillin: 不填写可以精确计算缺失的值;
igndts: 忽 略 dts; discardcorrupt: 丢弃损坏的帧;
sortdts: 尝试以 dts 的顺序为准输出;
keepside: 不合并数据;
fastseek: 快速 seek,但是不够精确;
latm: 设置 RTP MP4_LATM 生效;
nobuffer: 直接读取或者写出,不存 buffer;
bitexact: 不 写 入 随 机 或 者 不 稳 定 的 数 据 ; seek2any: 支 持 随 意 seek, 这 个 seek 可 以 不 以 keyframe 为 参 考 ; analyzeduration: 指定解析媒体所需要花销的时间,这里设置的值越高,解析的越准确,如果在直播中为了降低延迟,这个可以设置得低一些 codec_whitelist: 设置可以解析的 codec 的白名单;
format_whitelist: 设置可以解析的 format 的白名单;
FFmpeg 的编解码部分主要是通过 libavcodec 这个库来完成的功能,通过 libavcodec 库进行 encode 与 decode 操作,多媒体的编码格式种类很多,但是还是有好多基本的操作参数
是共同可以设置的,下面来详细介绍一下这些公用的参数:
通过查看 ffmpeg 的 help full 参数可以看到 AVCodecContext AVOptions,在这个选项下面的所有参数均为编解码可以使用的参数:
b: 设置音频与视频码率,可以认为是音视频加起来的码率,默认为 200k; 使用这个参数可以根据 b:v 设置视频码率,b:a 设置音频码率; ab: 设 置 音 频 的 码 率 , 默 认 是 128k; g: 设置视频 GOP 大小,关键帧间隔,默认是 12 帧一个 gop
// r: 帧率,比如 25, GOP:25/50 ar: 设置音频采样率,默认为 0
ac: 设 置 音 频 通 道 数 , 默 认 为 0 bf: 设置非 B 帧之间的 B 帧个数,默认为 0// Ibbpbbpbbp, Ipppppppp
maxrate:最大码率设置,与 bufsize 一同使用即可,默认为 0
minrate: 最小码率设置,配合 maxrate 与 bufsize 可以设置为 CBR 模式,平时基本没用,默认为 0
bufsize:设置控制码率的 buffer 的大小,默认为 0
keyint_min: 设置最小 IDR 帧间隔,默认为 25//I 帧,,IDR 帧
Instantaneous 及时解码刷新 , Decoding Refresh
// 解码缓存队列
// IDRbbpbbbpbbp, Ibbpbbpbbp, Ibbpbbpbbp, IDRbbpbbpbbp
sc_threshold: 设置场景切换支持,默认为 0
me_threshold: 设置运动估计阀值,默认为 0
mb_threshold: 设置宏块阀 yu:threshold 值,默认为 0
profile: 设置音视频的 profile,默认为-99
level: 设置音视频的 level,默认为-99
timecode_frame_start: 设置 GOP 帧的开始时间,需要在 non-drop-frame 默认情况下使用
channel_layout: 设置音频通道的布局格式
threads: 设置编解码等工作的线程数
Ffmpeg -i xxx -threads 0/1/2/3
ffmpeg 工具主要用途为编码、解码、转码,常用 ffmpeg 做的为转码操作,使用 ffmpeg 转码主要原理为:
在 FFMpeg 套件中,出了 ffmpeg 还有 ffprobe,ffprobe 主要用来查看多媒体文件的信息, 下面看一下 ffprobe 中常见的基本命令.
ffprobe 常用参数比较多,可以用过 ffprobe --help 来查看详细的信息:
show_packets 查看的多媒体包信息使用 PACKET 标签所包括起来,其中包含的信息主要如下:
codec_type: 多媒体类型,例如视频包,音频包等; stream_index: 多媒体的 stream 索引; pts: 多媒体的显示时间值//presentation timestamp
pts_time: 根据不同格式计算过后的多媒体的显示时间
/// I bbp bbp bbp bbp …
/// I ppp ppp ppp ppp …
dts: 多媒体解码时间值 //decoding timestamp
dts_time: 根据不同格式计算过后的多媒体解码时间
duration: 多媒体包占用的时间值
duration_time: 根据不同格式计算过后的多媒体包占用的时间值
size: 多媒体包的大小
pos: 多媒体包所在的文件偏移位置
flags: 多媒体包标记,关键包与非关键包的标记
除了 packets 与 data 外,ffprobe 还可以分析多媒体的封装格式,通过 show_format 参数可以查看多媒体的封装格式,封装可是使用 FORMAT 标签括起来显示:
ffprobe -show_format ande_10s.flv Iso mpeg1,2,4,
Itu h.261,3,4,5
通过读取 format 信息,可以看到这个视频文件只有一个流通道,起始时间是 0.000000, 长度为 85.867000,文件大小为 2377700 字节,码率为 221523 字节每秒,这个文件有可能是一个 mov、有可能是 mp4、有可能是 m4a、有可能是 3gp、有可能是 3g2、也有可能是
mj2,之所以 ffprobe 会这么输出,是因为这几种封装格式在 ffmpeg 中所识别的标签基本相同,所以才会这么多种显示方式,而其他种封装格式不一定是这样的,
通过 ffprobe 的 show_frames 的参数可以查看视频文件中的帧信息,输出的帧信息使用
FRAME 标签括起来
通过-show_frames 参数查看到如图的信息,能够看到每一帧的信息,下面介绍一下重要的信息
AVPacket,
AVFrame:yuv, pcm
通过-show_frame 参数查看到如图的信息,能够看到每一帧的信息,下面介绍一下重要的信息
通过-show_streams 参数可以查看到多媒体文件中的流信息,流的信息使用 STREAMS 标签括起来:
ffprobe 使用前面的参数可以获得到对应的 key-value,但是阅读起来因习惯不同所以有的人认为方便,有的人认为不方便,这样就需要用到 ffprobe 的 print_format 参数来进行相应的格式输出,下面举几种输出的例子:
ffprobe -show_frames ande_10s.flv -print_format json
xml,json,ini,csv,flat
XML 格式输出:
如果只查看音频流或视频流,使用 select_streams 参数即可,例如只查看视频流的 frames
信息:
ffprobe -show_frames -select_streams v -of xml input.mp4
命令行执行后可以看到输出的信息如下,全部为视频的 frames 信息:
在编译 FFmpeg 源代码时,如果系统中包含了 SDL-1.2 版本时,会默认将 ffplay 编译生成出来,如果不包含 SDL-1.2 或者版本不是 SDL-1.2 时,无法生成 ffplay 文件,所以,生成如果想使用 ffplay 进行流媒体播放测试,是需要安装 SDL-1.2 的。
通常使用 ffplay 作为播放器,其实 ffplay 不但可以做播放器,同样可以作为很多图像化音视频数据的分析根据,通过 ffplay 可以看到视频图像的运动估计方向,音频数据的波形等, 在本节将会有更多的参数进行介绍并举例。
ffplay 常用参数
ffplay 不仅仅是播放器,同时也是测试 ffmpeg 的 codec 引擎,format 引擎,以及 filter
引擎的工具,并且也可以做可视化的媒体参数分析,可以通过 ffplay --help 进行查看:
常见参数可以手动进行尝试:
如果希望从视频的第 30 秒开始播放,播放 10 秒钟的文件,则可以使用如下命令
#ffplay -ss 30 -t 10 input.mp4
如果希望视频播放时播放器的窗口显示标题为自定义标题,则使用如下命令
ffplay -window_title “Hello World, This is a sample” output.mp4
显示窗口如下图:
例如使用 ffplay 打开网络直播流,可以使用命令
如图播放的视频为实时网络直播视频流。
根据上图可以看到播放器播放的窗口标题已经显示为自定义设置的内容。 基本参数介绍完毕,下面进一步介绍 ffplay 的高级一些的参数。
ffplay 高级参数
通过使用 ffplay –help 参数看到帮助信息比较多,其中包含了高级参数介绍,下面详细介绍一下
下面根据这些参数与前面介绍过的一些参数进行组合:
例如从 20 秒播放一个视频,播放时长为 10 秒钟,播放完成后自动退出 ffplay,播放器的窗口标题为”Hello World”,为了确认播放时长正确,可以通过系统命令 time 查看命令运行时长
#time ffplay -window_title “Hello World” -ss 20 -t 10 -autoexit output.mp4 该命令执行完毕之后输出如下:
real 0m10.783s user 0m8.401s sys 0m0.915s
例如强制使用 H264 解码器解码 mpeg4 的视频,将会报错:
当视频流中出现多个 Program 时,播放 Program 与常规的播放方式则有所不同,需要指定对应的流, 可以通过 vst、ast、sst 参数指定,例如希望播放 Program 13 中的音视频流,则通过如下命令行指定:
#ffplay -vst 4 -ast 5 ~/Movies/movie/ChinaTV-11.ts
通过 Program 13 中的信息可以看到该流名称为 service_name 对应的值是 CCTV 9,而指定音视频流播放之后播放出来的图像也能够与之对应。
如果使用 ffplay 播放视频时希望加载字幕文件,则可以通过加载 ASS 或者 SRT 字幕文件来解决,下面举一个加载 SRT 字幕的例子,首先编辑 SRT 字幕文件,内容如下:
然后通过 filter 将字幕文件加载如播放数据中,使用命令
使用 ffplay 除了可以播放视频流媒体文件之外,还可以作为可视化的视频流媒体分析工具,例如当播放音频文件时,不确定文件的声音是否正常,噪声数据等分析,可以直接使用
ffplay 播放音频文件,播放的时候将会把解码后的音频数据以音频波形显示出来:
#ffplay -showmode 1 output.mp3
从图中可以看到,音频的播放时的波形可以通过振幅显示出来,可以用来看到音频的播放情 况。
例如当播放视频时体验解码器是如何解码每个宏块的,可以使用命令
显示窗口内容
在输出的视频信息中,可以看到不同颜色的方块,下面来说明一下这些颜色代表着什么信息:
例如通过 ffplay 查看 B 帧预测与 P 帧预测信息,希望将信息在窗口中显示出来,使用命令
专题一
一、获取视频信息
ffmpeg -i video.avi //查看本地的视频信息ffmpeg -i http://xxxx.com/videofiles/xxx2223.mp4
//查看远程 http 视频信息
二、分离视频音频流
音视频交错/交织存储
ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流
/// 具体的后缀名,需要与音频编码相符
/// flv : h.264,flashvideo + aac/mp3/ac3
/// mp3: mpeg1–audio(layer1,2,3)
/// mpeg3:
/// .mp4 : 封装格式(视频流+音频流),mpeg-4:system,audio,video,… ffmpeg -i input_file -acodec copy -vn output_file_audio //分离音频流ffmpeg -i input.mp4 -an output.mp4 //去掉视频中的音频ffmpeg -i test.avi -vcodec copy -an output.avi //去掉视频中的音频
三、视频转码相关
ffmpeg -i demo.mp4 -vcodec copy -an -bsf: h264_mp4toannexb -f h264 tmp.264 //提取 264 码流
ffmpeg -i demo.mp4 -vcodec copy -an -bsf: h264_mp4toannexb -f mp4 tmp002.mp4 //提取 264 码流,封装成 mp4
/// h264: VCL(avc1), NALU(annexb)
///VCL(avc1):MP4 文件,一个文件只有一个头部(sps,pps,idr,…)
///annexb: 一个 nalu 就有一个头,
/// ts<===>mp4
ffmpeg431 -i ande_302.mp4 -c copy -f mpegts ande_302-testts.ts
ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 output.mp4//ts 视频流转 mp4
ffmpeg431 -i tmp001.264 -vcodec copy -f mpegts tmp-testts.ts
ffmpeg -i test.h264 -vcodec copy -f mpegts output.ts//h264 视频转 ts 视频流
ffmpeg -i test.h264 -vcodec copy -f mp4 output.mp4//h264 视频转 mp4 b:bitrate:视频码率
ffmpeg -i test.mp4 -b:v 640k output.flv //mp4 转 flv
ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv output.flv //mp4 转 flv ffmpeg -i test.flv -b:v 640k output.mp4 //flv 转 mp4
-s:指定宽高 (widthxheight:偶数)
-r :帧率,25,30, 29.97,50,60,59.94
-g:gop,图像组,多少帧有一个关键帧
-r 25 -g 100: Ibbpbbpbbpbbp I
-b:码率,bps(bits per second)
-ac: 声道数
-ar:采样率,每秒采样多少次(44.1KHz=44100, 48KHz=48000,80KHz)
ffmpeg431 -i ande_302.mp4 -s 176x144 -vcodec libx264 -r 25 -g 100 -acodec aac -b 200K -ac 1 -ar 8000 tmp222.flv
ffmpeg -i test.mp4 -s 176x144 -vcodec libx264 -r 25 -b 12200 -acodec aac -ab 1200 -ac 1 -ar 8000 output.flv
//mp4 转 3gp
ffmpeg -i ande_302.mp4 -vcodec -acodec mp3 -ac 1 -ar 8000 -r 25 -ab 32 -y output.3gp //avi 转
3gp
ffmpeg -i test.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 output.avi //3gp 转 flv
ffmpeg -i test.flv -s 176x144 -vcodec h263 -r 25 -b 200 -ab 64 -acodec mp3 -ac 1 -ar 8000 output.3gp //flv 转 3gp
ffmpeg -i test.mp4 output.avi //mp4 转 avi
ffmpeg -i test.flv -vcodec h264 -r 25 -b 200 -ab 128 -acodec mp3 -ac 2 -ar 44100 output.mp4 //flv
转 mp4
ffmpeg -i test.mp4 -c:v libx264 -ar 22050 output.flv //mp4 转 flv ffmpeg -i test.avi -c copy -map 0 output.mp4 //avi 转 mp4
/// mp4:封装格式,头信息默认在文件的尾部。
/// -movflags +faststart :mp4 文件,头信息在文件的头部
ffmpeg -i http://xxxx/154202543368.m3u8 -c copy -movflags +faststart test.mp4 //m3u8 转
mp4
ffmpeg -i test.mkv -y -vcodec copy -acodec copy output.mp4 //mkv 转 mp4 ffmpeg -i test.mkv -vcodec copy -acodec copy output.avi //mkv 转 avi
四、图像处理相关
/// 常用:
ffmpeg -i test.mp4 -f image2 -ss 8 -t 0.001 -s 320x240 -y testImage.jpg
//截取指定时间的缩略图,-ss 后跟的时间单位是秒
/// 1s= 1000ms, fps:25, 1 帧=1000/24==40ms
/// video filter: 简单过滤器
/// 注意:overlay 的第三个参数,默认是 0,如果 1 强制颜色空间为 rgb,但是容易出问题
/// 最好省略第三个参数
ffmpeg -i input.mp4 -vf “movie=logo.png [logo]; [in][logo] overlay=10:10:1 [out]” output.mp4
//添加图片水印
//添加图片水印
/// filter_complex:复杂过滤器
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay test1.mp4
/// 注意: -vf,codec 不能使用 copy
ffmpeg –i input.mp4 -acodec aac -vcodec libx264
-vf “movie=test.png[watermark];[in][watermark]overlay=10:10:1[out]” output.mp4
//添加图片水印
ffmpeg -y -i test2.mp4 -ignore_loop 0 -i test.gif -filter_complex overlay=0:H-h test_out2.mp4
//添加 GIF
ffmpeg -i input.flv
-vf “drawtext=fontfile=simhei.ttf:text=‘xsfdsx’:x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2” drawtext.mp4
drawtext=key=value:key=value:key=value
//添加文字水印
overlay 技术又称视频叠加技术。overlay 视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能。
画中画是指在一个大的视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内 容同时播放。
overlay 技术中涉及两个窗口,通常把较大的窗口称作背景窗口,较小的窗口称作前景窗口,背景窗口或前景窗口里都可以播放视频或显示图片。
FFmpeg 中使用 overlay 滤镜可实现视频叠加效果。
overlay 滤镜说明如下:
描述:前景窗口(第二输入)覆盖在背景窗口(第一输入)的指定位置。
语法:overlay[=x:y[[:rgb={0, 1}]]
参数 x 和 y 是可选的,默认为 0。
参数 rgb 参数也是可选的,其值为 0 或 1,默认为 0。
参数说明:
x从左上角的水平坐标,默认值为 0
y从左上角的垂直坐标,默认值为 0
rgb 值为 0 表示输入颜色空间不改变,默认为 0;值为 1 表示将输入的颜色空间设置为 RGB
变量说明:如下变量可用在 x 和 y 的表达式中
main_w 或 W 主输入(背景窗口)宽度
main_h 或 H 主输入(背景窗口)高度
overlay_w 或 w overlay 输入(前景窗口)宽度
overlay_h 或 h overlay 输入(前景窗口)高度
//中间
ffmpeg -i ande_302.mp4 -vf “movie=logo.png[logo]; [in][logo]overlay=W/2-w/2:H/2-h/2[out]”
-vcodec libx264 -acodec aac zzoutput8.mp4
//右下角
ffmpeg -i ande_302.mp4 -vf “movie=logo.png[logo]; [in][logo]overlay=W-w:H-h[out]” -vcodec libx264 -acodec aac zzoutput7.mp4
drawtext 各个参数的含义详解
line_h, lh
the height of each text line
时间线
main_h, h, H
the input height
输入视频的高度:像素
main_w, w, W
the input width
输入视频的宽度:像素
n
the number of input frame, starting from 0
第几帧
rand(min, max)
return a random number included between min and max
随机数
mod(a, b) 求 余 ,a%b 5%2==>: 1
sar
The input sample aspect ratio.
输入采样的宽高比,yuv 像素的宽高比
t
timestamp expressed in seconds, NAN if the input timestamp is unknown
时间戳,单位:秒
text_h, th
the height of the rendered text
文本的高度:像素
text_w, tw
the width of the rendered text
文本的宽度:像素
在右上角显示当前时间 localtime
ffplay ande_302.mp4 -vf drawtext=“fontfile=simhei.ttf:x=w-tw:fontcolor=white:fontsize=30:text=‘%{localtime:%H\:%M
\:%S}’”
// Java
String strCmdLine = “…text=‘%{localtime\:%H\\\:%M\\\:%S}’…”;
/ cpp
char strCmdLine[1024] = {0};
strcpy(strCmdLine, “…text=‘%{localtime\:%H\\\:%M\\\:%S}’…”);
Ffmpeg431 -i ande_302.mp4 -vf drawtext="fontfile=simhei.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H\:%M
\:%S}'" -y zztest501.mp4
命令行中的路径问题
ffmpeg -i ande_302.mp4
-vf “drawtext=fontfile=simhei.ttf:text=‘x 是 否 对 双 方 都
sfdsx’:x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2” zzdrawtext1.mp4
Drawtext 路径:
ffmpeg -i ande_302.mp4 -vf “drawtext=fontfile=d\
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。