FFmpeg对音视频倍速处理
常见的倍速播放方式包含跳帧播放与不跳帧播放,两种方式FFmpeg均可支持,跳帧处理方式的用户体验要差些,本文重点介绍不跳帧的倍速播放而非丢帧。
1、atempo音频倍速处理
atempo是在FFmpeg中用来处理倍速的音频处理滤镜,能够控制音频播放速度的快与慢,这个滤镜只有一个参数:tempo,将这个参数的值设置为浮点型,取值范围从0.5到2,0.5则是原来速度的一半,调整为2则是原来速度的2倍速。
- 半速处理
ffmpeg -i input.wav -filter_complex "atempo=tempo=0.5" -acodec aac output.aac
输出信息如下
Input #0, wav, from 'input.wav':
Duration: 00:03:43.00, bitrate: 1411 kb/s
Stream #0:0: Audio: dts (DTS-ES) ([1][0][0][0] / 0x0001), 44100 Hz, 6.1, fltp, 1411 kb/s
Stream mapping:
Stream #0:0 (dca) -> atempo
atempo -> Stream #0:0 (aac)
Press [q] to stop, [?] for help
[aac @ 0x7f8af700da00] Using a PCE to encode channel layout "6.1"
Output #0, adts, to 'output.aac':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Audio: aac (LC), 44100 Hz, 6.1, fltp, 463 kb/s
Metadata:
encoder : Lavc58.35.100 aac
size= 25168kB time=00:07:25.96 bitrate= 462.3kbits/s speed=22.9x
video:0kB audio:25036kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.524513%
从内容中可以看出,output的总时长是input的2倍,音频效果是源音频速度的一半。
- 2倍速处理
ffmpeg -i input.wav -filter_complex "atempo=tempo=2.0" -acodec aac output.aac
输出信息如下
Input #0, wav, from 'input.wav':
Duration: 00:03:43.00, bitrate: 1411 kb/s
Stream #0:0: Audio: dts (DTS-ES) ([1][0][0][0] / 0x0001), 44100 Hz, 6.1, fltp, 1411 kb/s
Stream mapping:
Stream #0:0 (dca) -> atempo
atempo -> Stream #0:0 (aac)
Press [q] to stop, [?] for help
[aac @ 0x7fcf9d81b600] Using a PCE to encode channel layout "6.1"
Output #0, adts, to 'output.aac':
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Audio: aac (LC), 44100 Hz, 6.1, fltp, 463 kb/s
Metadata:
encoder : Lavc58.35.100 aac
size= 6301kB time=00:01:51.52 bitrate= 462.8kbits/s speed=17.2x
video:0kB audio:6268kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.524273%
从以上内容中可以看到,output的总时长是input的二分之一,音频效果比源音频速度快一倍。
2、setpts视频倍速处理
在FFmpeg的视频处理滤镜中,通过setpfs能够控制视频速度的快与慢,这个滤镜只有一个参数:expr,这个参数可用来描述视频的每一帧的时间戳。
- 半速处理
ffmpeg -re -i input.mp4 -filter_complex "setpts=PTS*2" output.mp4
命令行执行后输出如下信息
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.19.100
Duration: 00:00:30.32, start: 0.000000, bitrate: 397 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 480x208 [SAR 16:15 DAR 32:13], 261 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 (h264) -> setpts (graph 0)
setpts (graph 0) -> Stream #0:0 (libx264)
Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Output #0, mp4, to 'output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 480x208 [SAR 16:15 DAR 32:13], q=-1--1, 25 fps, 12800 tbn, 25 tbc (default)
Metadata:
encoder : Lavc58.35.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
frame= 1511 fps= 50 q=-1.0 Lsize= 1600kB time=00:01:00.32 bitrate= 217.3kbits/s dup=755 drop=0 speed=1.98x
如上输出内容所示,output的时长是input的duration的2倍,播放效果会看到速度比原视频慢一半的效果,但音频速度不变。
- 2倍速处理
ffmpeg -i input.mp4 -filter_complex "setpts=PTS/2" output.mp4
命令行执行后FFmpeg输出如下信息
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf56.19.100
Duration: 00:00:30.32, start: 0.000000, bitrate: 397 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 480x208 [SAR 16:15 DAR 32:13], 261 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream mapping:
Stream #0:0 (h264) -> setpts (graph 0)
setpts (graph 0) -> Stream #0:0 (libx264)
Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Output #0, mp4, to 'output.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 480x208 [SAR 16:15 DAR 32:13], q=-1--1, 25 fps, 12800 tbn, 25 tbc (default)
Metadata:
encoder : Lavc58.35.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
frame= 380 fps=190 q=-1.0 Lsize= 1112kB time=00:00:30.30 bitrate= 300.7kbits/s dup=0 drop=376 speed=15.2x
如上信息所示,输出的time的时长与输入的duration仍然相同,是因为音频时长没有变,但是视频的时长实际上只有原来的一半,视频的播放速度比源视频快一倍。

网友评论