如何用FFmpeg基于文件名或元数据给视频设置时间码(适配Premiere)
基于文件名或元数据用FFmpeg批量设置时间码方案
一、直接从文件名提取时间设置时间码
完全可以实现,核心是通过脚本解析文件名中的时间字符串,转换成FFmpeg支持的HH:MM:SS:FF格式时间码(最后两位为帧计数,默认补00,可根据视频帧率调整),再批量调用FFmpeg处理。
示例脚本
Windows 批处理(处理当前目录下所有MOV文件)
@echo off setlocal enabledelayedexpansion for %%f in (*.mov) do ( :: 提取文件名前19位的时间字符串(格式:2023-03-08 12.59.59) set "timestr=%%~nf" set "timestr=!timestr:~0,19!" :: 转换为FFmpeg支持的时间码格式:HH:MM:SS:00 set "timecode=!timestr:~11,8!" set "timecode=!timecode:.=:!:00" :: 执行FFmpeg命令,保留原编码、移除数据流、设置时间码 ffmpeg -i "%%f" -map 0 -map -0:d -c copy -timecode !timecode! "output_%%f" ) endlocal
Linux/macOS Shell 脚本
for f in *.mov; do # 提取文件名前19位的时间字符串 timestr="${f:0:19}" # 转换为HH:MM:SS:00格式时间码 timecode="${timestr:11:8}" timecode="${timecode//./:}:00" ffmpeg -i "$f" -map 0 -map -0:d -c copy -timecode "$timecode" "output_$f" done
注:如果视频帧率不是25fps,需将帧位(最后两位)调整为对应帧率的合法范围(如30fps用00-29)。
二、从元数据读取日期设置时间码
若已用exiftool将文件名写入视频的创建/修改日期元数据,可通过ffprobe提取元数据时间,再转换为时间码代入FFmpeg命令批量处理。
批量处理脚本(Linux/macOS)
for f in *.mov; do # 提取元数据中的创建时间 creation_time=$(ffprobe -v error -show_entries format_tags=creation_time -of default=noprint_wrappers=1:nokey=1 "$f") # 转换为HH:MM:SS:00格式时间码 timecode="${creation_time:11:8}:00" ffmpeg -i "$f" -map 0 -map -0:d -c copy -timecode "$timecode" "output_$f" done
三、关键注意事项
- 时间码格式必须严格遵循
HH:MM:SS:FF,帧计数超出对应帧率范围会触发FFmpeg报错。 - 批量操作前建议先用单个文件测试脚本,避免批量出错。
timecode参数会直接覆盖视频原有时间码。
内容的提问来源于stack exchange,提问作者marven
相关产品推荐
相关产品推荐

