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" 选项。
根据以上建议,修改命令如下:
-
提取单幅图像
第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 秒(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
- 提取一帧中的一场图像
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