问题 使用ffmpeg转换视频格式和复制标签


我一直在尝试将我在相机上拍摄的一些视频转换为压缩格式,以节省一些存储空间。我想出了如何使用ffmpeg将视频转换为我想要的格式,但我无法弄清楚的是如何复制元数据。我想复制视频拍摄时的原始元数据(最重要的是创建时间)。我尝试使用-map_meta_data 0:0选项运行ffmpeg,但这似乎不起作用。有任何想法吗?

在这种情况下,我想复制的数据看起来像是视频的格式部分。使用ffprobe和show_format选项,我得到这个输出:

[FORMAT]
filename=video.AVI
nb_streams=2
format_name=avi
format_long_name=AVI format
start_time=0.000000
duration=124.565421
size=237722700
bit_rate=15267331
TAG:creation_time=2012-02-07 12:15:27
TAG:encoder=CanonMVI06
[/FORMAT]

我想将这两个标签复制到我的新视频中。


4388
2017-07-29 01:59


起源



答案:


看一下 有关转储和加载元数据的文档

FFmpeg能够将媒体文件中的元数据转储为简单的UTF-8编码的类似INI的文本文件,然后使用元数据复用器/解复用器将其加载回来。

该过程可能如下所示:

# First extract metadata
ffmpeg -i original.mov -f ffmetadata metadata.txt
# Next, transcode, including extracted metadata
ffmpeg -i original.mov -f ffmetadata -i metadata.txt compressed.mp4

我现在没有要测试的元数据视频,但是这样的东西应该可行。


6
2017-07-29 04:35



这似乎应该有效,但是当我提取元数据时,不会提取creation_time标记。这就是保存到文件中的所有内容,这也可以解释为什么map_meta_data选项不起作用: ;FFMETADATA1 encoder=CanonMVI06 - Scott
@Scott确实可能。虽然它完全不优雅且不应该是必要的,但尝试使用ffprobe和grep来获取创建时间,然后使用它直接在输出中设置它 -metadata? - blahdiblah
这仍然没有奏效,但它指出了我正确的方向。当我运行ffmpeg命令表示stfptime不可用时,我终于注意到输出了一条消息(我一直试图在Windows上这样做)。事实证明,由于该库在Windows上不可用,因此日期永远不会放入元数据中。因此,我尝试在可以使用stfptime的Linux中转换我的视频,并且map_metadata和ffmetadata选项都用于将creation_time标记保存到视频元数据中。 - Scott
最后一个命令不起作用。因为你没有告诉ffmpeg它应该选择哪个元数据。您需要使用-map_metadata 1来选择第二个输入作为元数据。 - Wang


答案:


看一下 有关转储和加载元数据的文档

FFmpeg能够将媒体文件中的元数据转储为简单的UTF-8编码的类似INI的文本文件,然后使用元数据复用器/解复用器将其加载回来。

该过程可能如下所示:

# First extract metadata
ffmpeg -i original.mov -f ffmetadata metadata.txt
# Next, transcode, including extracted metadata
ffmpeg -i original.mov -f ffmetadata -i metadata.txt compressed.mp4

我现在没有要测试的元数据视频,但是这样的东西应该可行。


6
2017-07-29 04:35



这似乎应该有效,但是当我提取元数据时,不会提取creation_time标记。这就是保存到文件中的所有内容,这也可以解释为什么map_meta_data选项不起作用: ;FFMETADATA1 encoder=CanonMVI06 - Scott
@Scott确实可能。虽然它完全不优雅且不应该是必要的,但尝试使用ffprobe和grep来获取创建时间,然后使用它直接在输出中设置它 -metadata? - blahdiblah
这仍然没有奏效,但它指出了我正确的方向。当我运行ffmpeg命令表示stfptime不可用时,我终于注意到输出了一条消息(我一直试图在Windows上这样做)。事实证明,由于该库在Windows上不可用,因此日期永远不会放入元数据中。因此,我尝试在可以使用stfptime的Linux中转换我的视频,并且map_metadata和ffmetadata选项都用于将creation_time标记保存到视频元数据中。 - Scott
最后一个命令不起作用。因为你没有告诉ffmpeg它应该选择哪个元数据。您需要使用-map_metadata 1来选择第二个输入作为元数据。 - Wang


使用“-map_metadata 0:g”复制全部 全球 元数据。

0表示输入#0。 g意味着 全球 元数据。

这是我的ffprobe结果。请享用!

input.mp4

[FORMAT]
filename=input.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=60.560500
size=190252680
bit_rate=25132246
probe_score=100
TAG:major_brand=mp42
TAG:minor_version=1
TAG:compatible_brands=mp42avc1
TAG:creation_time=2016-05-14 10:01:17
[/FORMAT]

output.mp4

[FORMAT]
filename=output.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=60.632000
size=38636429
bit_rate=5097826
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:creation_time=2016-05-14 01:01:17
TAG:encoder=Lavf57.36.100
[/FORMAT]

4
2018-05-21 08:25





将所有元数据(全局,视频,音频)写入文件使用

ffmpeg -i in.mp4 -c copy -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata in.txt

要从文件中添加所有元数据,请使用

ffmpeg -i in.mp4 -f ffmetadata -i in.txt -c copy -map_metadata 1 out.mp4

0
2018-05-29 08:57