You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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 : Timecode

Other #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 : Yes

Other #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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:05:19