FFMPEG:将当前时间(以毫秒为单位)嵌入到视频中
Posted
技术标签:
【中文标题】FFMPEG:将当前时间(以毫秒为单位)嵌入到视频中【英文标题】:FFMPEG: embed current time in milliseconds into video 【发布时间】:2018-05-12 14:38:00 【问题描述】:我想使用 FFMPEG 将计算机的本地时间以毫秒为单位嵌入到流中。
我可以像这样使用 drawtext 以秒为单位嵌入当地时间:
ffmpeg -i <input> -vf "drawtext=text='%localtime\:%T'" -f flv <output>
查看 drawtext 的文档,进行一些测试,并四处搜索,似乎 localtime
和 gmtime
不提供毫秒 - 只是几秒钟。然而pts
选项确实有毫秒:
ffmpeg -i <input> -vf "drawtext=text='%pts\:hms'" -f flv <output>
我还发现pts
支持偏移量,所以我可以使用这样的东西来显示当地时间(有点):
ffmpeg -i <input> -vf "drawtext=text='%pts\:hms\:$(date +%s.%N)'" -f flv <output>
这有两个问题:
-
当时它显示类似
17499:17:29
的内容...我找到了一种(相当复杂的)方法来解决这个问题
它使用服务器的当前时间您第一次运行 ffmpeg 命令时作为偏移量——而不是 ffmpeg 实际开始解码视频的服务器当前时间。我注意到 ffmpeg 的启动时间大约为 2 秒,导致时钟关闭了大约 2 秒
有没有办法修改我的解决方案,或者完全独立的解决方案,可以将服务器本地时间(以毫秒为单位)嵌入到流中?
【问题讨论】:
【参考方案1】:使用
ffmpeg -i input
-vf "settb=AVTB,
setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',
drawtext=text='%localtime.%eif\:1M*t-1K*trunc(t*1K)\:d'"
-f flv out
首先,通过将时基强制为默认 AVTB 10e-6
,将传入时间戳表示为微秒精度。
其次,设置一个新的 PTS,它包括原始 PTS 减少到毫秒和左移(十进制)三位数字。为此,添加了挂钟的毫秒组件。 RTCTIME 在 setpts 中可用,并返回一个微秒精度的整数。
第三,文本字符串由三部分组成。第一个是本地时间,格式为 Y-M-D-H-M-S 字符串并返回第二个精度。然后是一个点来划分毫秒。在第三个中,t
返回小数秒。毫秒分量被提取并打印为整数。
【讨论】:
我必须阅读您使用的st
和 ld
函数,以及 drawtext 的 eif
文本扩展,因为我不知道它是如何工作的 :)但它有效!
修复 drawtext=text='%localtime.%eif\:1Mt-1Ktrunc(t*1K)\:d'" 为 drawtext= text='%localtime.%eif\:1Mt-1Ktrunc(t*1K)\:d\:3'" 正确显示小数点后三位。
@nico_lab 感谢修复!但请注意:格式已经吃掉了一些*
.. 已修复代码格式:text='%localtime.%eif\:1M*t-1K*trunc(t*1K)\:d\:3'
以上是关于FFMPEG:将当前时间(以毫秒为单位)嵌入到视频中的主要内容,如果未能解决你的问题,请参考以下文章