【问题标题】:Converting video formats and copying tags with ffmpeg使用 ffmpeg 转换视频格式和复制标签
【发布时间】:2012-07-27 05:00:58
【问题描述】:

我一直在尝试将我在相机上拍摄的一些视频转换为压缩格式,以节省一些存储空间。我想出了如何使用 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]

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

【问题讨论】:

    标签: ffmpeg metadata


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我正在尝试这个,它重新编码了整个文件——这是预期的吗?是否有可能只插入元数据的开关?顺便说一句,我想要的是使用ffmpegffprobe 读取视频信息(帧高、宽度、速率等),并将其保存到视频文件元数据中。
    • 不,重新编码不是预期的。 -c copy 应该复制。
    • 我不知道它是否在重新编码,tbh,但我看到的是它一分钟一分钟地爬过整个视频。这是-c copy 应该做的吗?顺便说一句,我发现我的问题不在于文件中缺少元数据,而是 Windows 不会像使用 mp4 那样从其文件系统中的 mkv 文件中读取元数据。 Shark007 编解码器解决了这个问题(并且可能给我带来了其他问题)。
    【解决方案2】:

    使用“-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]
    

    输出.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]
    

    【讨论】:

      【解决方案3】:

      看看the documentation on dumping and loading metadata:

      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
      

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

      【讨论】:

      • 这似乎应该可以工作,但是当我提取元数据时,没有提取 creation_time 标记。这就是保存到文件中的所有内容,这也可以解释为什么 map_meta_data 选项不起作用:;FFMETADATA1 encoder=CanonMVI06
      • @Scott 确实可能。虽然它完全不优雅并且不应该是必要的,但尝试使用 ffprobe 和 grep 来获取创建时间,然后使用-metadata直接在输出中设置它?
      • 这仍然不太奏效,但它为我指明了正确的方向。当我运行 ffmpeg 命令说 stfptime 不可用时,我终于注意到一条消息得到输出(我一直在尝试在 Windows 上执行此操作)。事实证明,由于该库在 Windows 上不可用,因此日期从未放入元数据中。因此,我尝试在 stfptime 可用的 Linux 中转换我的视频,并且 map_metadata 和 ffmetadata 选项都可以将 creation_time 标签保存到视频元数据中。
      • 最后一个命令不起作用。因为你没有告诉 ffmpeg 它应该选择哪个元数据。您需要使用 -map_metadata 1 选择第二个输入作为元数据。
      猜你喜欢
      • 2021-07-20
      • 2014-07-09
      • 2010-12-26
      • 2023-03-26
      • 2012-03-23
      • 2012-02-20
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多