如何用FFmpeg添加2秒间隔关键帧并保持原视频码率?
问题描述
需求:为视频添加间隔2秒的关键帧,同时保持原视频码率。
先通过ffprobe查看原视频信息:
ffprobe input-video.mp4 ffprobe version 5.1.2 Copyright (c) 2007-2022 the FFmpeg developers built with Apple clang version 14.0.0 (clang-1400.0.29.102) configuration: --prefix=/usr/local/Cellar/ffmpeg/5.1.2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox libavutil 57. 28.100 / 57. 28.100 libavcodec 59. 37.100 / 59. 37.100 libavformat 59. 27.100 / 59. 27.100 libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input-video.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: mp42mp41 creation_time : 2022-11-23T10:04:47.000000Z Duration: 00:02:00.15, start: 0.000000, bitrate: 16302 kb/s Stream #0:0[0x1](eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 16174 kb/s, 23.98 fps, 23.98 tbr, 24k tbn (default) Metadata: creation_time : 2022-11-23T10:04:47.000000Z handler_name : ?Mainconcept Video Media Handler vendor_id : [0][0][0][0] encoder : AVC Coding Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 125 kb/s (default) Metadata: creation_time : 2022-11-23T10:04:47.000000Z handler_name : #Mainconcept MP4 Sound Media Handler vendor_id : [0][0][0][0]
尝试使用以下FFmpeg命令,但输出视频码率仅为3692 kb/s,与原视频16302 kb/s不符:
ffmpeg -i input-video.mp4 -codec:v libx264 -r 23.976 -force_key_frames "expr:gte(t,n_forced*2)" -c:a copy -y output.mp4
需要修改命令,实现添加2秒间隔关键帧的同时保持原视频码率。
解决方案
原命令未指定视频码率参数,ffmpeg默认使用较低的码率编码,导致输出码率下降。修改时需指定原视频的视频码率,并匹配原视频的编码参数以保证输出更接近原视频:
修改后的命令
ffmpeg -i input-video.mp4 -codec:v libx264 -b:v 16174k -profile:v main -level:v 4.0 -r 23.976 -force_key_frames "expr:gte(t,n_forced*2)" -c:a copy -y output.mp4
参数说明
-b:v 16174k:指定视频码率为原视频的16174 kb/s(从ffprobe输出的Stream #0:0中获取的视频码率),确保输出码率与原视频一致。-profile:v main:匹配原视频的H.264 Main编码profile,避免编码参数差异导致的质量或码率变化。-level:v 4.0:针对1080p@23.98fps的规格指定合适的编码level,这是该分辨率帧率的常用配置。- 保留
-force_key_frames "expr:gte(t,n_forced*2)":确保每2秒插入一个关键帧。 -c:a copy:直接复制原音频流,不重新编码,保证音频质量和码率不变。
额外优化
如果希望更精准匹配原视频的编码参数,可以用ffprobe提取更多原视频的x264参数:
ffprobe -v error -select_streams v:0 -show_entries stream=profile,level,bit_rate -of default=noprint_wrappers=1 input-video.mp4
将提取到的参数加入命令中,能让输出视频的编码特性更接近原视频。
内容的提问来源于stack exchange,提问作者muraliv
相关产品推荐
相关产品推荐

