来自电影元数据的ffmpeg和时间码

来自电影元数据的ffmpeg和时间码,ffmpeg,Ffmpeg,我想添加到由数码摄像机制作的电影中。此时间码在摄影机中播放时可见,一些提取和可视化EXIF元数据的工具也会显示它们 我很少尝试配置ffmpeg,但只成功地添加了当前PC时间,而不是文件中的时间 ffmpeg -y -i S1480002.MP4 -vf "drawtext=fontfile=arial.ttf :expansion=normal: text=%{metadata\\:creation_time}: \ x=(w-tw)/2: y=h-(2*lh): fontcolor=white

我想添加到由数码摄像机制作的电影中。此时间码在摄影机中播放时可见,一些提取和可视化EXIF元数据的工具也会显示它们

我很少尝试配置ffmpeg,但只成功地添加了当前PC时间,而不是文件中的时间

ffmpeg -y -i S1480002.MP4 -vf "drawtext=fontfile=arial.ttf :expansion=normal: text=%{metadata\\:creation_time}: \ x=(w-tw)/2: y=h-(2*lh): fontcolor=white@0.8" output.mp4

我需要从输入文件元数据中提取创建时间。ffprobe这次显示,但ffmpeg不显示。

元数据和创建时间之间的冒号必须转义才能正常工作。试试
text=%{metadata\metadata\u:creation\u time}:

我想你一定就是我在ffmpeg用户邮件列表上回答的那个人。。。我终于想出了一个用脚本实现这一点的黑客方法,使用ffprobe。我不是一个真正的shell程序员,所以请原谅我这里有些东西真的很愚蠢。我刚刚从几十篇stackoverflow帖子中拼凑出来,它可以在视频右下角的2秒到7秒之间覆盖一个格式化的创建日期

我的文件中的创建日期似乎是GMT,所以我不得不将它们转换为CDT。。。也许这对你有帮助。这适用于Mac OSX 10.10.5,您可能需要在其他平台上调整一些内容:

#!/bin/bash

for CURRENT_FILE in *.mov; do
    CREATION_TIME=`ffprobe -v quiet "$CURRENT_FILE" -print_format compact -show_entries format_tags=creation_time`

    # in the format like: "format|tag:creation_time=2015-12-08 16:13:13"
    CDATE=${CREATION_TIME:(25)}

    SECONDS=`TZ="Europe/London" date -j -f "%Y-%m-%d %T" "$CDATE" +%s`
    MY_TIME=`TZ="America/Chicago" date -r $SECONDS +"%Y-%m-%d %I:%M %p"`

    ffmpeg -i "$CURRENT_FILE" -vf "drawtext=enable='between(t,2,7)':fontfile=/Library/Fonts/Microsoft/Arial.ttf:fontcolor=white:fontsize=64:text=\'${MY_TIME}\':x=main_w-(text_w+64):y=main_h-(text_h*2)" -acodec copy -y "../output/$CURRENT_FILE"

done

我最终实现了这一点,但我尝试使用concat组装视频,音频关闭,视频播放太慢。我整天都在搞这个,我几乎放弃了。视频处理对我的cro magnon大脑来说太难了。

首先,确保你的文件中有你想用ffmpeg可以理解的方式使用的标签。像这样:

ffprobe-i file.jpg-显示输入帧

这将输出如下内容:

.
.
.
[FRAME]
media_type=video
stream_index=0
key_frame=1
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=1
pkt_duration_time=0.040000
pkt_pos=N/A
pkt_size=40439
width=501
height=493
pix_fmt=yuvj420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]
在这个特定的示例中,文件中没有创建时间(CreateDate),因此ffmpeg将无法为您做任何事情

但是现在假设您有一个包含所需元数据的文件。然后,输出将是,例如:

.
.
.
[FRAME]
media_type=video
stream_index=0
key_frame=1
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_duration=1
pkt_duration_time=0.040000
pkt_pos=N/A
pkt_size=40681
width=501
height=493
pix_fmt=yuvj420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
TAG:XResolution=     72:1      
TAG:YResolution=     72:1      
TAG:ResolutionUnit=    2
TAG:DateTime=2015:12:17 19:28:47
TAG:YCbCrPositioning=    1
TAG:ExifVersion= 48,  50,  49,  48
TAG:DateTimeDigitized=2015-01-01 00:00:00
TAG:ComponentsConfiguration=  1,   2,   3,   0
TAG:FlashpixVersion= 48,  49,  48,  48
TAG:ColorSpace=65535
TAG:PixelXDimension=      0
TAG:PixelYDimension=      0
[/FRAME]
在这里,您可以看到前缀为
标记:
的行。这些是ffmpeg喜欢的台词。有了这些,您可以使用:

ffmpeg-f image2-pattern_-type glob-framerate 20-i“myfiles*.jpg”-filter_complex”drawtext='fontfile=/usr/share/font/truetype/msttcorefonts/Arial.ttf:fontsize=32:fontcolor=yellow:borderw=2:bordercolor=black:x=10:y=10:text=%{元数据\:datetimedigized}''out.avi

把它分成几部分:

-f图像2

使用“image2”文件解复用器

-pattern\u type glob-i“myfiles*.jpg”

获取与全局模式“myfiles*.jpg”匹配的所有文件

drawtext=

启用“drawtext”过滤器

fontfile=/usr/share/font/truetype/msttcorefonts/Arial.ttf

要使用的字体

fontsize=32

字体大小

fontcolor=yellow

字体颜色

borderw=2

在文本周围画一个2px的边框

bordercolor=黑色

边界将是黑色的

x=10

从视频左侧开始文本10px

y=10

从视频顶部开始文本10px

text=%{元数据\:日期时间数字化}

要渲染的文本,在本例中,该文本将取自源文件中包含的“DateTimeDigited”元数据

“out.avi”

输出文件名


好了,就这样。希望有帮助

对不起,对我的情况没有帮助。我想完全这样做。。。你有没有想过?但是,我使用手动编译的ffmpeg v2.0作为pts和gmtime可用的视频过滤器。很酷-谢谢!在玩了几个小时后,我最终还是放弃了。我正在尝试自动编译带有时间戳的每月延时我家安全/婴儿摄像头运动触发器…是的,您是对的,这在ffmpeg文档中有描述,但我的问题是如何将这些标记添加到文件中?TAG:SomeTag=一些文本您似乎想更改(即设置)标记。。。如果是这样,那么你的问题应该重新表述。如果您想在输入视频上绘制一个标记,那么我的回答应该会对您有所帮助。请澄清。