FFmpeg命令行示例

1 提取视频流/音频流

// 分离视频流和音频流
ffmpeg -i input_file -vcodec copy -an output_file_video
ffmpeg -i input_file -acodec copy -vn output_file_audio

2 视频转封装

ffmpeg --i test.mp4 --vcodec copy --acodec copy --f m4v test.m4v
ffmpeg --i test.avi --vcodec copy --acodec copy --f m4v test.m4v

3 视频转码

ffmpeg --i test.mp4 --vcodec h264 --s 352*278 --an --f m4v test.264
ffmpeg --i test.mp4 --vcodec h264 --bf 0 --g 25 --s 352*278 --an --f m4v test.264
ffmpeg --i test.avi -vcodec mpeg4 --vtag xvid --qsame test_xvid.avi

部分选项说明:-bf,B 帧数量;-g,gop 大小控制;-s,分辨率。

4 视频封装

ffmpeg --i video_file --i audio_file --vcodec copy --acodec copy output_file

5 视频剪切

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi

部分选项说明:-r, 提取图像的频率;-ss,开始时间;-t 持续时间。

6 视频截图

先运行如下命令测试一下:

ffmpeg -ss 00:00:08 -i test.mp4 -f image2 test.jpg

发现截图已经正常生成,但是命令行有如下报错信息:
[image2 @ 0x1370f80] Could not get frame filename number 2 from pattern 'test.jpg' (either set update or use a pattern like %03d within the filename pattern)
av_interleaved_write_frame(): Invalid argument

参考 "Solutions to some ffmpeg errors and messages" 得到原因如下:

这个错误通常是因为输出名不正常或者少了某些选项:

如果输出单幅图像,应添加 "-frames:v 1" 输出选项;

如果输出一系列图像,应当使用正确的名称形式,例如输出文件名为 output_%03d.png 时,将会依次生成 output_001.png, output_002.png, output_003.png 等;

如果输出单幅图像,总是用最新的图像覆盖掉旧图像,应添加 "-update 1" 选项。

根据以上建议,修改命令如下:

  1. 提取单幅图像
    第8秒处的提取一帧图像:

    ffmpeg -ss 00:00:08 -i ring.mp4 -frames:v 1 -f image2 ring.jpg

各参数说明如下:

"-ss 00:00:08":输入选项,截取输入文件中第8秒处的图像

"-frames:v 1":输出选项,往输出中写入一个视频帧

"-f image2":输出选项,指定输出格式为image2

注意"-ss 00:00:08"应放在"-i ring.mp4"之前,作为输入选项,可以很快就能获得视频截图。如果放在 "-i ring.mp4" 之后就成了输出选项,作输出选项时,ffmpeg 会一直从输入文件中读取,直到到达指定时间点,才能获取截图,如果凑巧截图的位置在文件尾,则要等整个视频播放完才能得到视频截图。

  1. 提取一系列图像
    每隔 1 秒(1Hz)提取一帧图像:

    ffmpeg -i ring.mp4 -r 1 -f image2 ring-%3d.jpg

"-r 1":输出选项,设置帧率,通过重复(比输入文件帧率大)或丢弃(比输入文件帧率小)视频帧来满足此帧率

从第 8 秒开始的持续 10 秒的视频里,每隔 1 秒(1Hz)提取一帧图像:

ffmpeg -ss 00:00:08 -t 00:00:10 -i ring.mp4 -r 1 -f image2 ring-%03d.jpg

从第 8 秒开始的持续 10 秒的视频里,提取前 3 帧图像:

ffmpeg -ss 00:00:08 -t 00:00:10 -i ring.mp4 -frames:v 3 -f image2 ring-%03d.jpg
  1. 提取一帧中的一场图像
    ffmpeg -i video.avi -frames:v 1 -vf field=top top%d.png

7 视频录制

录制网络流

ffmpeg --i rtsp://192.168.2.104:1235/test --vcodec copy out.avi

录制测试图(testsrc)视频,时长 12 秒

ffmpeg -ss 00:00:00 -t 00:00:12 -f lavfi -i testsrc testsrc.flv

8 保存YUV文件

ffmpeg -i tiger.m2ts -an -c:v rawvideo -pixel_format yuv422p -ss 00:00:08 -frames:v 5 tiger_422_8b.yuv
ffmpeg -i tiger.m2ts -an -c:v rawvideo -pixel_format yuv422p10 -ss 00:00:08 -frames:v 5 tiger_422_10b.yuv
ffmpeg -i fifa.ts -an -c:v rawvideo -vf format=yuv422p -ss 00:01:00 -frames:v 5 fifa_3840x2160_422_8b.yuv
ffmpeg -f lavfi -i nullsrc=s=3840x2160:r=60,lutrgb=0:255:0 -frames:v 5 -vf format=yuv422p -c:v rawvideo green_3840x2160_422p_8b.yuv