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 的文档,进行一些测试,并四处搜索,似乎 localtimegmtime 不提供毫秒 - 只是几秒钟。然而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 返回小数秒。毫秒分量被提取并打印为整数。

【讨论】:

我必须阅读您使用的 stld 函数,以及 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:将当前时间(以毫秒为单位)嵌入到视频中的主要内容,如果未能解决你的问题,请参考以下文章

以毫秒为单位偏移当前系统时间到时区 GMT

如何以毫秒为单位获取firebase服务器的当前时间戳?

如何以毫秒为单位获取当前时间?

Lua - 当前时间(以毫秒为单位)

如何在 PHP 中以毫秒为单位获取当前时间?

如何像 Java 一样获取自 1970 年以来的当前时间戳(以毫秒为单位)