ffmpeg 编辑音视频操作记录

2019-01-19 0 By admin

一、使用参数示例

1.1、ffmpeg 设置视频帧率

ffmpeg 工具使用-r选项设置视频帧率(每秒中读取多少帧)。在使用-r选项时,我们需要明确设置的对象是输入源input还是输出对象output。
如操作一个帧率为20的视频文件。
输入源
格式:ffmpeg -r 帧率 -i input output
当帧率分别设置为10或者40的时候,就表示视频的播放时间延长一倍和减少一半。这样就很容易理解对输入源设置帧率的作用了。
输出对象
格式:ffmpeg -i input -r 帧率 output
对输出对象设置帧率的情况;当数据源的帧率高于我们的需要时,我们可以设置低于数据源的帧率将视频压缩。如果我们将输出对象的帧率设置为10,则理论上我们输出的对象是源对象文件大小的一半。
降低视频的帧率会影响视频的观看体验,一般视频帧率在24左右就很好。

1.2、ffmpeg 视频转码

使用ffmpeg对视频和音频进行转码操作的示例如下:
ffmpeg -i input.avi -s 640x480 -b 500k -vcodec h264 -r 29.97 -acodec libfaac -ab 48k -ac 2 output.mp4
参数解释:
视频选项:-r 指定帧率,-s 指定分辨率,-b 指定比特率。
音频选项:-acodec 指定音频编码,-ab 指定音频比特率,-ac 指定声道数。

1.3、ffmpeg 视频剪切

使用ffmpeg对视频和音频进行剪切操作的相关选项,列表如下:
-ss :剪切开始时间
-t :截取的时间长度
-to :剪切结束的时间
视频剪切示例如下:
1、ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv
2、ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv
3、ffmpeg -i input.wmv -ss 30 -c copy -to 40 output.wmv

以上三种执行方式,就是截取视频30秒到40秒的片段。

1.4、ffmpeg 视频合并

ffmpeg工具可以使用concat demuxer选项进行视频的合并:
编辑视频列表文件:
$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'

执行视频合并操作:
$ ffmpeg -f concat -i mylist.txt -c copy output

二、问题调试

2.1、Past duration **** too large

是由于帧率的原因,原文内容如下:
To summarize this: This warning message appears when trying to encode a high frame rate source to a low frame rate output, which means frames need to be dropped.
实际帧率为50帧每秒,而转码帧率为25帧每秒,由高帧率转低帧率就会报错。因此ffmpeg使用-r设置输出流的帧率和输入流的帧率相同就可以消除上面的日志。

2.2、ffmpeg 推流输出状态speed小于1x

当使用ffmpeg进行推流时,我们会看到推流过程中的状态信息;如下:
frame=24360 fps= 24 q=28.0 size= 131171kB time=00:16:56.15 bitrate=1057.5kbits/s dup=0 drop=50 speed=0.997x
其中参数解释如下:

frame 编码的帧数量
fps 每秒编码的帧数
q 质量因子
size 视频和音频编码后的大小
time 输出帧的显示时间
bitrate 输出视频的帧率
dup 输入帧dupliate的数量
drop 输入帧drop的个数
speed 编码速度

当视频直播推流时,一般要保持speed的状态为1x。否则就是推流速度慢,造成视频播放卡顿。
如果因为本地机器的网络问题,导致视频推流速度小于1x,则可以尝试降低视频的画面大小(分辨率)和帧率;降低数据量。