如何利用FFmpeg自动将output.mp4转换为与example.mp4参数一致的文件?
自动匹配视频参数的实现方案
完全可以通过FFmpeg结合脚本自动化实现将output.mp4转换为与example.mp4参数完全一致的视频,核心思路是先提取参考视频的编码、容器、色彩空间等关键参数,再将这些参数应用到目标视频的转码命令中。
步骤1:提取参考视频(example.mp4)的关键参数
用FFmpeg直接提取所需参数,以下是具体命令:
提取容器品牌参数
ffmpeg -i example.mp4 -hide_banner 2>&1 | grep "major_brand\|minor_version\|compatible_brands"
输出示例:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
提取视频流核心参数
ffmpeg -i example.mp4 -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -E "codec_name\|width\|height\|r_frame_rate\|color_space\|color_transfer\|color_primaries"
输出示例:
codec_name : h264
width : 1920
height : 1080
r_frame_rate : 30/1
color_space : bt709
color_transfer : bt709
color_primaries : bt709
提取音频流参数(如需匹配)
ffmpeg -i example.mp4 -hide_banner -select_streams a:0 -show_streams 2>&1 | grep -E "codec_name\|sample_rate"
输出示例:
codec_name : aac
sample_rate : 48000
步骤2:手动转码(快速验证)
根据提取到的参数,直接构建FFmpeg转码命令。比如用上文的示例参数,命令如下:
ffmpeg -i output.mp4 \ -c:v h264 -colorspace bt709 -color_trc bt709 -color_primaries bt709 \ -r 30/1 -s 1920x1080 \ -major_brand isom -minor_version 512 -compatible_brands "isom,iso2,avc1,mp41" \ -c:a aac -ar 48000 \ matched_output.mp4
- 如果音频参数无需修改,可替换
-c:a aac -ar 48000为-c:a copy直接复制音频流。
步骤3:自动化脚本(一键完成)
如果需要频繁处理这类需求,可以写一个Bash脚本自动提取参数并执行转码,无需手动复制参数:
#!/bin/bash # 配置文件路径 SOURCE_VIDEO="example.mp4" TARGET_VIDEO="output.mp4" OUTPUT_VIDEO="matched_output.mp4" # 提取容器参数 MAJOR_BRAND=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner 2>&1 | grep -oP 'major_brand\s*:\s*\K\w+') MINOR_VERSION=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner 2>&1 | grep -oP 'minor_version\s*:\s*\K\d+') COMPAT_BRANDS=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner 2>&1 | grep -oP 'compatible_brands\s*:\s*\K[\w,]+' | sed 's/ //g') # 提取视频参数 VIDEO_CODEC=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'codec_name\s*:\s*\K\w+') COLOR_SPACE=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'color_space\s*:\s*\K\w+') COLOR_TRC=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'color_transfer\s*:\s*\K\w+') COLOR_PRIMARIES=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'color_primaries\s*:\s*\K\w+') FRAME_RATE=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'r_frame_rate\s*:\s*\K[\d/]+') WIDTH=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'width\s*:\s*\K\d+') HEIGHT=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams v:0 -show_streams 2>&1 | grep -oP 'height\s*:\s*\K\d+') # 提取音频参数 AUDIO_CODEC=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams a:0 -show_streams 2>&1 | grep -oP 'codec_name\s*:\s*\K\w+') AUDIO_SAMPLE_RATE=$(ffmpeg -i "$SOURCE_VIDEO" -hide_banner -select_streams a:0 -show_streams 2>&1 | grep -oP 'sample_rate\s*:\s*\K\d+') # 构建转码命令 BASE_CMD="ffmpeg -i \"$TARGET_VIDEO\" -c:v $VIDEO_CODEC -colorspace $COLOR_SPACE -color_trc $COLOR_TRC -color_primaries $COLOR_PRIMARIES -r $FRAME_RATE -s ${WIDTH}x${HEIGHT} -major_brand $MAJOR_BRAND -minor_version $MINOR_VERSION -compatible_brands \"$COMPAT_BRANDS\"" # 添加音频处理逻辑 if [ -n "$AUDIO_CODEC" ] && [ -n "$AUDIO_SAMPLE_RATE" ]; then BASE_CMD="$BASE_CMD -c:a $AUDIO_CODEC -ar $AUDIO_SAMPLE_RATE" else BASE_CMD="$BASE_CMD -c:a copy" fi BASE_CMD="$BASE_CMD \"$OUTPUT_VIDEO\"" # 执行转码 echo "正在执行转码命令:" echo "$BASE_CMD" eval "$BASE_CMD"
脚本使用方法
- 将脚本保存为
match_video_params.sh - 赋予执行权限:
chmod +x match_video_params.sh - 运行脚本:
./match_video_params.sh
注意事项
- 如果参考视频使用的是特定编码器(如
libx264、libx265),转码时可明确指定(比如-c:v libx264),避免FFmpeg自动选择不匹配的编码器。 - 若视频包含多个音视频流,脚本需调整以适配多流场景,可根据实际需求修改
-select_streams参数。
内容的提问来源于stack exchange,提问作者Martijn Deleij
相关产品推荐
相关产品推荐

