FFMPEG: 将当前时间(以毫秒为单位)嵌入视频

10
我希望使用FFMPEG将计算机的本地时间毫秒级嵌入到流中。
我可以使用drawtext将本地时间以秒为单位嵌入,如下所示:
ffmpeg -i <input> -vf "drawtext=text='%{localtime\:%T}'" -f flv <output>

研究了一些文档、进行了一些测试,并在谷歌上搜索后,发现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>

这个方法有两个问题:

  1. 在时间显示上,它会显示类似于17499:17:29的内容……我找到了(相当复杂的)解决方法。
  2. 它使用服务器当前时间在你第一次运行 ffmpeg 命令时作为偏移量——而不是 ffmpeg 实际开始解码视频时的服务器当前时间。我注意到 ffmpeg 大约需要启动 2 秒钟,导致时钟偏差大约为 2 秒。

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

2个回答

10

使用

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 函数,以及 eif 文本扩展用于 drawtext,因为我不知道这是如何工作的 :) 但它确实有效! - stevendesu
1
将 "fix drawtext=text='%{localtime}.%{eif:1Mt-1Ktrunc(t1K):d}'" 修改为 "drawtext=text='%{localtime}.%{eif:1Mt-1Ktrunc(t1K):d:3}'" 可以使显示正确到小数点后三位。 - nico_lab
@nico_lab 感谢您的修复!但请注意:格式化已经吞掉了一些 *.. 通过代码格式化进行修复:text='%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d\:3}' - Stefan Krüger s-light
在macOS上使用ffmpeg 6.0似乎没有任何作用。 - undefined
没关系,时间戳只是在黑色背景上看不见。可以用 xy 来改变位置。drawtext=text='%{localtime}.%{eif\:1M*t-1K*trunc(t*1K)\:d}':x=100:y=100:fontsize=20 - undefined
@Gyan 有没有办法我可以设置一个特定的日期和时间(包括毫秒)作为文本序列的开始? - undefined

0

根据gyan的回答,我想在起始位置包含毫秒组件。但是如果我尝试“扩展”纪元以包括毫秒组件,我得不到任何结果。

所以- gmtime\:'165261638830'\ 不起作用
但是gmtime\:'1652616388'\可以。

ffmpeg -i video.mp4 
    -i Jose.wav 
    -c:v ffv1 
    -c:a aac 
    -vf "transpose=1,
    settb=AVTB,
    setpts='trunc(PTS/1K)*1K+st(1,trunc(RTCTIME/1K))-1K*trunc(ld(1)/1K)',
    drawtext='
        fontfile=c\:/Windows/Fonts/courbd.ttf:
        fontsize=36:
        fontcolor=red:
        text=%{pts\:
            gmtime\:
            '165261638830'\}.%{eif\:
                1M*t-1K*trunc(t*1K)\:
                d}'" 
    output.mkv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接