我有一个延时视频(如果重要的话,由GoPro生成(,每5秒有一个图像。我想把时间戳编码到上面。以前我用过这样的命令来在中刻录时间戳
# Convert the date to EPOCH. This will be used to set the time for the draw text
# method.
EPOCH=$(date --date="${STARTDATE}" +%s)
# we assume that the STARTDATE is in UTC 0000, Zulu time, GMT and that we want
# to convert it to the local time on the computer.
ffmpeg -i "${INPUT}" -vf drawtext="fontsize=30:fontcolor=yellow:text='%{pts:localtime:${EPOCH}}':x=(w-text_w) - 10:y=(h-text_h) - 10" -vcodec libx265 -crf 28 "${OUTPUT}"
问题是,这一进展产生的时间戳就像是一个正常的视频,在30分钟的时间间隔上打上了25秒的印记。我想要的是与时间间隔相匹配的时间戳。
我看了绘图文档。我认为rate
可能是关键,但1/5
和150
都会产生这样的错误:
Parsed_drawtext_0 @ 0x10c607370] Failed to parse expression: (h-text_h) - 10 r=1/5
我想我可能需要乘以当前帧的值来获得正确的时间,但我不知道如何做到这一点。
pts
函数将只使用存储的时间戳。您必须在提取文本过滤器之前修改时间戳,然后恢复原始值,即
setpts=PTS*10,drawtext=...,setpts=PTS/10
其中因子CCD_ 5是帧之间的实时性与其在延时视频中的显示间隔的比率。
我们的初中在水培实验室每10分钟有一个树莓派捕捉帧。
我使用以下命令从每张照片的元数据中提取图像文件的创建时间,并将其刻录在我的时间间隔的左上角——假设你的时钟是正确的,那就可以了!
ffmpeg -y -r 24 -export_path_metadata 1 -pattern_type glob -i './*-00Z.jpg' -vf "drawtext=fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf:x=20:y=20:fontsize=40:fontcolor=yellow:text='%{metadata:DateTime:def_value}'" -c:v libx264 video-file.mp4
生成的视频如下所示:学生水培实验室延时的样本帧,在左上角中显示时间戳