如何通过FFmpeg读取源视频Timecode并实现正确的TC Burn-In?
需要创建能正确显示源视频原生Timecode(TC)的烧入效果,当前使用的FFmpeg命令如下:
-filter_complex "[0:1][0:2] amerge" -preset ultrafast -vf scale=960:540:in_range=tv:out_range=pc,"drawtext=\timecode='00\:00\:00\:00':timecode_rate=25:x=(w-tw)/2:y=h-(2*lh):fontcolor=white@1:fontsize=30:box=1:boxcolor=black@0.6" -c:v libx264 -pix_fmt yuv420p -crf 27 -c:a aac -ar 48000 -b:a 128k
当前命令的烧入时码固定从00:00:00:00开始,但目标是使用视频文件自身的起始TC(测试文件起始TC为10:00:00:00,MediaInfo检测数据如下):
Other #1
ID : 1-Material
Type : Time code
Format : MXF TC
Frame rate : 25.000 FPS
Time code of first frame : 10:00:00:00
Time code of last frame : 10:02:34:20
Time code settings : Material Package
Time code, stripped : Yes
Title : TimecodeOther #2
ID : 0-Source
Type : Time code
Format : MXF TC
Frame rate : 25.000 FPS
Time code of first frame : 10:00:00:00
Time code of last frame : 10:02:34:20
Time code settings : Source Package
Time code, stripped : YesOther #3
Type : Time code
Format : SMPTE TC
Muxing mode : SDTI
Frame rate : 25.000 FPS
Time code of first frame : 10:00:00:00
1. 提取源视频的起始时码
先通过ffprobe提取视频文件的原生起始TC,执行命令:
ffprobe -v error -select_streams v:0 -show_entries stream_tags=timecode -of default=noprint_wrappers=1:nokey=1 你的输入文件名.mxf
执行后会直接输出源视频的起始时码(比如本次测试的10:00:00:00)。
2. 修改FFmpeg命令实现原生TC烧入
将提取到的起始TC替换drawtext滤镜中的timecode参数值,调整后的完整命令示例:
ffmpeg -i 你的输入文件名.mxf -filter_complex "[0:1][0:2]amerge[a]" -vf "scale=960:540:in_range=tv:out_range=pc,drawtext=timecode='10\:00\:00\:00':timecode_rate=25:x=(w-tw)/2:y=h-(2*lh):fontcolor=white@1:fontsize=30:box=1:boxcolor=black@0.6" -map 0:v -map "[a]" -c:v libx264 -pix_fmt yuv420p -crf 27 -c:a aac -ar 48000 -b:a 128k -preset ultrafast 输出文件名.mp4
- 注意:如果在shell环境中使用双引号包裹滤镜字符串,时码中的冒号需要用
\:转义;若用单引号包裹滤镜字符串,则无需转义。 - 命令中通过
-map明确指定视频流和合并后的音频流,避免自动选流出现异常。
3. 批量处理自动化脚本
如果需要批量处理多个文件,可以编写shell脚本实现自动提取TC并烧入:
#!/bin/bash # 用法:./tc_burn.sh 输入文件名.mxf INPUT="$1" # 提取起始TC START_TC=$(ffprobe -v error -select_streams v:0 -show_entries stream_tags=timecode -of default=noprint_wrappers=1:nokey=1 "$INPUT") # 执行FFmpeg命令 ffmpeg -i "$INPUT" -filter_complex "[0:1][0:2]amerge[a]" -vf "scale=960:540:in_range=tv:out_range=pc,drawtext=timecode='$START_TC':timecode_rate=25:x=(w-tw)/2:y=h-(2*lh):fontcolor=white@1:fontsize=30:box=1:boxcolor=black@0.6" -map 0:v -map "[a]" -c:v libx264 -pix_fmt yuv420p -crf 27 -c:a aac -ar 48000 -b:a 128k -preset ultrafast "${INPUT%.mxf}_tc_burn.mp4"
保存为tc_burn.sh,赋予执行权限后,直接传入输入文件即可自动处理。
内容的提问来源于stack exchange,提问作者filmeschneider

