0.引言
阅读本文前可以先看看前面的文章,方便理解,文章列表如下:
1.保持编码格式
音视频均以copy的形式,就是不重新编码,换了一个封装,-codec copy 这个命令等同于-vcodec copy -acodec copy。如下命令:
(1)ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
(2)ffmpeg -i test.mp4 -codec copy test_copy2.ts
2.改变编码格式
音视频均改变编码格式,视频以x265,音频以mp3。
(1)ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
3.修改帧率
如果要修改帧率和采样率,肯定要涉及到重新转码。如下命令:
(1)ffmpeg -i test.mp4 -r 15 output2.mp4
注意:这时候不能以copy的形式,否则会报错。
4.修改视频码率
(1)ffmpeg -i test.mp4 -b 400k output_b.mkv
(2)ffmpeg -i test.mp4 -b:v 400k output_bv.mkv
注意:如果换了一种封装格式,此时音频也可能被重新编码。如下是转为MKV封装:
如下是转为ts封装,此时音频也可能被重新编码。如下图所示:
5.修改音频码率
修改音频码率,码率不可能无限大。如果不想重新编码video,需要加上-vcodec copy。命令如下:
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4
6.修改音视频码率
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
7.修改视频分辨率
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
8.修改音频采样率
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
9.ffmpeg裁剪视频
-ss设置裁剪起始时间,-t 是设置裁剪多长的时间。如果音视频源的音视频格式不统一则强制统一为 -vcodec libx264 -acodec aac
9.1找三个不同的视频每个视频截取10秒内容
(1)ffmpeg -i 02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
(2)ffmpeg -i 3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
(3)ffmpeg -i 4.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
9.2将上述1.mp4/2.mp4/3.mp4转成ts格式
(1)ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
(2)ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
(3)ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
9.3转成flv格式
(1)ffmpeg -i 1.mp4 -codec copy 1.flv
(2)ffmpeg -i 2.mp4 -codec copy 2.flv
(3)ffmpeg -i 3.mp4 -codec copy 3.flv
注意:分离某些封装格式(例如MP4/FLV/MKV等)中的H.264的时候,需要首先写入SPS和PPS,否则会导致分离出来的数据没有SPS、PPS而无法播放。H.264码流的SPS和PPS信息存储在AVCodecContext结构体的extradata中。需要使用ffmpeg中名称为“h264_mp4toannexb”的bitstream filter处理。
10.拼接文件
读一个文件列表,拼接可以不用重新编码。以MP4方式拼接,可能会出现问题。这里的拼接指的是把三个视频流拼接成一个流。
ts格式列表如下:
以flv格式进行拼接。
flv格式列表如下:
10.1 以MP4格式进行拼接
ffmpeg -f concat -i mp4list.txt -codec copy out_mp42.mp4
10.2 以TS格式进行拼接
(1):ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
(2):ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4
10.3 以FLV格式进行拼接
(1):ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4
(3):ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4
注意:方法1只适用部分封装格式,比如TS。
建议:
(1)使用方法2进行拼接
(2)转成TS格式再进行拼接
11 测试不同编码拼接
11.1 修改音频编码
(1)ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
(2)ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4
经过测试,结果第二段没有声音。
11.2 修改音频采样率
(1)ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
(2)ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4
经过测试,第二段播放异常
11.3 修改视频编码格式
(1)ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts
(2)ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out3.mp4
11.4 修改视频分辨率
(1)ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 800x472 -vbsf h264_mp4toannexb 1.ts
(2)ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out4.mp4
注意:根据测试,最好是把每个视频封装格式也统一为ts,拼接输出的时候再输出你需要的封装格式,比如MP4。视频分辨率可以不同,但是编码格式需要统一。音频编码格式需要统一,音频参数(采样率/声道等)也需要统一。
12.测试图片和视频转换
从视频中截取一张图片,如下命令:
12.1 截取jpg图片
(1)ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
(2)ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
12.2 截取bmp图片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp
注意:-i 输入 ,-y 覆盖之前的图片,-f 像素格式,image2表示图像格式,-ss 表示时间起始值,-vframes表示输出图片张数,输出加%03d ,test%03d.jpg。-s 表示格式大小size。结果如下图:
12.3 图片转换成视频
(1)ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
结果如下:
12.4 视频中生成GIF图片
(1)ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
(2)ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
12.5 将 GIF 转化为 视频
(1)ffmpeg -f gif -i image2.gif image2.mp4
13.总结