FFmpeg用法

FFmpeg是一个优秀的音视频处理开源工具,ffmpeg可以用来转封装、转编码格式、压缩、解压缩等等。

命令行格式

ffmpeg <global-options> <input-options> -i <input> <output-options> <output>

global-options全局参数
input-options输入参数
output-options输出参数

转编码及转封装格式

将编码格式转为H264

ffmpeg -i <input> -c:v libx264 output.mp4

转封装格式

ffmpeg -i input.mp4 -c copy output.mkv  

参数说明:
-c设置编码器
-c copy保留输入文件的编码格式
-c:v设置视频编码格式
-c:a设置音频编码格式
-an/-vn禁用音频/视频

时移/剪切

<start>开始获取<duration>时长(秒)的音视频片段

ffmpeg -ss <start> -i <input> -t <duration> -c copy <output>

截取<start><end>之间的音视频片段

ffmpeg -ss <start> -i <input> -to <end> -c copy <output>

Example:

ffmpeg -ss 00:01:50 -i <input> -t 10.5 -c copy <output>
ffmpeg -ss 2.5 -i <input> -to 10 -c copy <output>

视频质量

-b:v/-b:a设置比特率
e.g.:
-b:v 1000K, -b:v 8M -q:v/-q:a设置固定质量参数
e.g:
-q:a 2
Example:

ffmpeg -i <input> -b:v 4M <output>

改变帧率

ffmpeg -i <input> -r 24 <output>

流映射

每个音视频文件以及文件中的流都拥有独一无二的ID,起始ID为0
例子: 0:0表示第一个文件中的第一路流
0:1表示第一个文件中的第二路流
2:a:0表示第三个文件中的第一个音频流
Example: 将第一个文件中的第一个视频流和第二个文件中的第一个音频流组合输出成一个文件

ffmpeg -i input.mp4 -i input.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4

缩放

设置分辨率为320*340

ffmpeg -i <input> -vf "scale=w=320:h=240" <output>

调试宏块及运动矢量

调试运动矢量

ffmpeg -flags2 +export_mvs -i input.mp4 -vf codecview=mv=pf+bf+bb output.mp4

pfp帧向前预测运动矢量
bfb帧向前预测运动矢量
bbb帧向后预测运动矢量

调试宏块

ffmpeg -debug vis_mb_type -i input.mp4 output.mp4

很实用的命令

给视频加上当前时间水印

ffmpeg -re -i sample.flv -vf "drawtext=fontsize=100:fontcolor=white:text='%{localtime}'" -c:v libx264 -c:a copy -f flv "rtmp://127.0.0.1/live/test"

循环推流

ffmpeg -re -stream_loop -1 -i sample.flv -c copy -f flv "rtmp://127.0.0.1/live/test"

解析音视频数据
打印帧信息

ffprobe -show_frames -of csv=nk=0 "rtmp://127.0.0.1/live/test"

打印数据包信息

ffprobe -show_packets -of csv=nk=0 "rtmp://127.0.0.1/live/test"

打印详细日志

ffprobe -show_frames -of csv=nk=0 -show_log 48 video.mp4