如何使用 ffmpeg 嵌入当前时间?

如何使用 ffmpeg 嵌入当前时间?

我正在使用ffmpegteemplayer通过 SSH 进行简单的视频直播和录像。现在,我想将当前(服务器)时间嵌入到流中。格式并不重要,理想情况下是YYYY-MM-DD HH:MM:SS.

我找到了如何建议以下命令:

ffmpeg -f video4linux2 -input_format mjpeg -s 1280x720 -i /dev/video0 \
-vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: \
text='%{localtime\:%T}': [email protected]: x=7: y=700" -vcodec libx264 \
-preset veryfast -f mp4 -pix_fmt yuv420p -y output.mp4

但使用-vf这部分会导致我出现以下错误:

[NULL @ 0x55e4ef96b2a0] Unable to find a suitable output format for 'text=%{localtime:%T}:'
text=%{localtime:%T}:: Invalid argument

我也尝试过命令(Q中的第三个代码块),只是为了测试它,但它也失败了:

[Parsed_drawtext_0 @ 0x55fb2862a940] Both text and text file provided. Please provide only one
[AVFilterGraph @ 0x55fb28629fc0] Error initializing filter 'drawtext' with args 'text=%{pts:hms:1553359336.166336638}'

最后我还发现问题,并尝试了它,稍微修改了一下(这显示了我的完整命令,我只调整了-vf过去两个示例中的选项):

ffmpeg  -r 20 -s 640x480 -f video4linux2 -i /dev/video0 -vf "drawtext=fontsize=90:fontcolor=white: fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf: text='%{localtime\:%X}'" -f avi -

这给我带来了以下错误:

[NULL @ 0x55ae61d051a0] Unable to find a suitable output format for 'fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf:'
fontfile=/usr/share/fonts/TTF/DejaVuSans.ttf:: Invalid argument

修改我发现的内容这里有点:

-vf drawtext="fontfile='/usr/share/fonts/cantarell/Cantarell-Light.otf':fontsize=14:fontcolor=white:shadowcolor=black:shadowx=2:shadowy=1:text='%H-%M-%S':x=8:y=8"

向我展示:

[Parsed_drawtext_0 @ 0x55e36db2aa40] Stray % near 'H-%M-%S'

请注意,使用此评论只是文本(例如text='test')工作正常..
添加1-4 \s 前面的 s%表示错误或效果没有变化。

我的ffmpeg版本:ffmpeg version 3.2.12-1~deb9u1在 Debian 机器上。
它已与drawtext 库一起编译并存在于ffmpeg -filters.

答案1

好的,我已经在其中找到了解决方案FFmpeg 过滤器文档

10.52.2 文本扩展

如果扩展设置为 strftime,则过滤器会识别提供的文本中的 strftime() 序列并相应地扩展它们。检查 strftime() 的文档。此功能已弃用。

虽然它说This feature is deprecated.,但这对我来说效果很好。这是我的最终结果-vf

-vf drawtext="expansion=strftime:fontfile='/usr/share/fonts/cantarell/Cantarell-Light.otf':fontsize=14:fontcolor=white:shadowcolor=black:shadowx=2:shadowy=1:text='%Y-%m-%d\ %H\\\\:%M\\\\:%S':x=8:y=8"

请注意,无论如何,这四个人\\\\都是逃跑所必需的:。要逃离这个空间,一个\就足够了。结果将如下所示:

例子

答案2

第一个选项text='%{localtime\\:T}'效果很好。 OP 的引言放错了地方,他…… 'text=...'。您会注意到,在后续示例中,他在正确的位置添加了单引号。

相关内容