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

使用ffmpeg转换视频格式和复制标签,ffmpeg,metadata,Ffmpeg,Metadata,为了节省一些存储空间,我一直在尝试将我在相机上拍摄的一些视频转换成压缩格式。我知道了如何使用ffmpeg将视频转换为我想要的格式,但我还没有弄清楚的是如何复制元数据。我想复制视频拍摄时的原始元数据,最重要的是在创建时。我尝试过使用-map\u meta\u data 0:0选项运行ffmpeg,但这似乎不起作用。有什么想法吗 看起来我想复制的数据在视频的格式部分。使用带有show_format选项的ffprobe,我得到以下输出: [FORMAT] filename=video.AVI nb_s

为了节省一些存储空间,我一直在尝试将我在相机上拍摄的一些视频转换成压缩格式。我知道了如何使用ffmpeg将视频转换为我想要的格式,但我还没有弄清楚的是如何复制元数据。我想复制视频拍摄时的原始元数据,最重要的是在创建时。我尝试过使用-map\u meta\u data 0:0选项运行ffmpeg,但这似乎不起作用。有什么想法吗

看起来我想复制的数据在视频的格式部分。使用带有show_format选项的ffprobe,我得到以下输出:

[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]
我想将这两个标签复制到我的新视频中。

看一下:

FFmpeg能够将媒体文件中的元数据转储到一个简单的UTF-8编码的类似INI的文本文件中,然后使用元数据muxer/demuxer将其加载回

该过程可能如下所示:

# 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

我现在没有元数据完整的视频可供测试,但类似的东西应该可以使用。

使用-map\u metadata 0:g复制所有全局元数据

0表示输入0。g表示全局元数据

这是我的ffprobe结果。享受吧

input.mp4

输出.mp4


要将所有元数据全局、视频、音频写入文件,请使用

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
要添加文件中的所有元数据,请使用

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

这看起来应该是可行的,但是当我提取元数据时,并没有提取创建时间标签。这就是保存到文件中的所有内容,这也可以解释为什么map_meta_data选项不起作用:;FFMETADATA1编码器=CanonMVI06@Scott确实可能。虽然这完全不雅观,也不必要,但我尝试过使用ffprobe和grep来获取创建时间,然后直接在输出中使用设置?这仍然不太管用,但它为我指明了正确的方向。当我运行ffmpeg命令时,我终于注意到一条消息正在输出,该消息说stfptime不可用。我一直在尝试在Windows上执行此操作。事实证明,由于该库在Windows上不可用,因此日期从未被放入元数据中。因此,我尝试在Linux中转换视频,其中stfptime可用,map_元数据和ffmetadata选项都可以将创建时间标记保存到视频元数据中。最后一个命令不起作用。因为您没有告诉ffmpeg它应该选择哪种元数据。您需要使用-map\u metadata 1来选择第二个输入作为元数据。我正在尝试此操作,它会重新编码整个文件,这是预期的吗?是否存在只插入元数据的切换?顺便说一句,我想用ffmpeg或ffprobe读取视频信息帧的高度、宽度、速率等,并将其保存到视频文件元数据中。不,不需要重新编码-我不知道它是否在重新编码,tbh,但我看到的是它在整个视频中一分钟一分钟地爬行。这就是-c拷贝应该做的吗?顺便说一句,我发现我的问题不是文件中缺少元数据,而是Windows没有像mp4那样从其文件系统中的mkv文件本机读取元数据。Shark007编解码器修复了这一问题,并可能给我带来其他问题。