FFMPEG:以毫秒为单位嵌入当前时间到视频中

ste*_*esu 8 video ffmpeg

我想使用 FFMPEG将计算机的本地时间(以毫秒单位)嵌入到流中。

我可以使用 drawtext 以秒为单位嵌入本地时间,如下所示:

ffmpeg -i <input> -vf "drawtext=text='%{localtime\:%T}'" -f flv <output>
Run Code Online (Sandbox Code Playgroud)

查看 drawtext 的文档,做一些测试,并在谷歌上搜索,似乎localtime并且gmtime不提供毫秒 - 只是几秒钟。但是pts选项确实有毫秒:

ffmpeg -i <input> -vf "drawtext=text='%{pts\:hms}'" -f flv <output>
Run Code Online (Sandbox Code Playgroud)

我还发现它pts支持偏移量,所以我能够使用这样的东西来显示本地时间(有点):

ffmpeg -i <input> -vf "drawtext=text='%{pts\:hms\:$(date +%s.%N)}'" -f flv <output>
Run Code Online (Sandbox Code Playgroud)

这有两个问题:

  1. 它显示了类似17499:17:29的时间......我找到了一种(相当复杂的)方法来解决这个问题
  2. 当您第一次运行 ffmpeg 命令时,它使用服务器的当前时间作为偏移量——而不是 ffmpeg 实际开始解码视频时的服务器当前时间。我注意到 ffmpeg 有大约 2 秒的启动时间,导致时钟关闭大约 2 秒

有没有办法修改我的解决方案,或者一个完全独立的解决方案,可以将服务器本地时间(以毫秒为单位)嵌入到流中?

Gya*_*yan 8

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
Run Code Online (Sandbox Code Playgroud)

首先,通过将时基强制为默认 AVTB,传入时间戳表示为微秒精度10e-6

其次,设置一个新的 PTS,它包括减少到毫秒的原始 PTS 和左移(十进制)三位数字。为此,添加了挂钟的毫秒组件。RTCTIME 在 setpts 中可用,并返回一个微秒精度的整数。

第三,文本字符串由三部分组成。第一个是本地时间,它被格式化为 YMDHMS 字符串并返回第二个精度。然后用一个点来划分毫秒。在第三个中,t返回小数秒。毫秒分量被提取并打印为整数。