使用ffmpeg将AMF元数据嵌入MP4


0

是否可以将定时文本元数据手动嵌入MP4文件中?我有一个带有元数据的TTML / SRT文件。我只需要嵌入文本数据,而无需对视频/音频轨道做任何事情。

我们曾经使用Wowza流媒体引擎上的插件进行元数据注入,该插件用于实时流媒体。

我需要做的是手动将元数据注入预先录制的MP4文件中,而无需通过Wowza运行视频。

这是Wowza处理的一个这样的视频文件:

ffmpeg version 2.4.3-1ubuntu1~trusty6 Copyright (c) 2000-2014 the FFmpeg developers
  built on Nov 22 2014 17:07:19 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --prefix=/usr --extra-version='1ubuntu1~trusty6' --build-suffix=-ffmpeg --toolchain=hardened --extra-cflags= --extra-cxxflags= --libdir=/usr/lib/x86_64-linux-gnu --shlibdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --enable-shared --disable-stripping --enable-avresample --enable-avisynth --enable-fontconfig --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-opengl --enable-x11grab --enable-libxvid --enable-libx265 --enable-libdc1394 --enable-libiec61883 --enable-libzvbi --enable-libzmq --enable-frei0r --enable-libx264 --enable-libsoxr --enable-openal --enable-libopencv
  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1b62a60] multiple fourcc not supported
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'metadata-back.mp4':
  Metadata:
    major_brand     : f4v 
    minor_version   : 0
    compatible_brands: isommp42m4v 
    creation_time   : 2015-04-16 11:12:39
  Duration: 00:00:11.70, start: 0.000000, bitrate: 1373 kb/s
    Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv), 640x480 [SAR 1:1 DAR 4:3], 1352 kb/s, 28.60 fps, 30 tbr, 90k tbn, 60 tbc (default)
    Metadata:
      creation_time   : 2015-04-16 11:12:39
      handler_name    : WowzaStreamingEngine
      encoder         : WowzaStreamingEngine
    Stream #0:1(eng): Audio: speex (spex / 0x78657073), 16000 Hz, mono, s16, 17 kb/s (default)
    Metadata:
      creation_time   : 2015-04-16 11:12:39
      handler_name    : WowzaStreamingEngine
    Stream #0:2(eng): Data: none (amf0 / 0x30666D61), 0 kb/s (default)
    Metadata:
      creation_time   : 2015-04-16 11:12:39
      handler_name    : WowzaStreamingEngine
At least one output file must be specified

我在stackoverflow的帮助下找到了可以用来ffmpeg解决问题的技巧。

所以我运行命令

ffmpeg -i video_without_data.mp4 -i sub.srt -c copy -c:s mov_text -movflags +faststart out.mp4

如果我跑步ffmpeg -i out.mp4,我会得到:

ffmpeg version 2.4.3-1ubuntu1~trusty6 Copyright (c) 2000-2014 the FFmpeg developers
  built on Nov 22 2014 17:07:19 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --prefix=/usr --extra-version='1ubuntu1~trusty6' --build-suffix=-ffmpeg --toolchain=hardened --extra-cflags= --extra-cxxflags= --libdir=/usr/lib/x86_64-linux-gnu --shlibdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --enable-shared --disable-stripping --enable-avresample --enable-avisynth --enable-fontconfig --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-opengl --enable-x11grab --enable-libxvid --enable-libx265 --enable-libdc1394 --enable-libiec61883 --enable-libzvbi --enable-libzmq --enable-frei0r --enable-libx264 --enable-libsoxr --enable-openal --enable-libopencv
  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.4.101
  Duration: 00:00:07.27, start: 0.000000, bitrate: 925 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1366x768 [SAR 1:1 DAR 683:384], 920 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler
At least one output file must be specified

现在您可以看到文本嵌入了其他编解码器(这是正确的术语吗?)。我也看不到音轨。

希望我的问题很清楚。我需要一种将元数据(来自srt / ttml)嵌入到MP4视频中的方法,它应该以amf格式嵌入(同样,这是正确的术语吗?)


您应该包括每个命令的完整控制台输出。不只是细分
llogan 2015年

哦!!。我已经编辑了问题,并添加了整个输出。谢谢@LordNeckbeard。希望能帮助到你!:)
史蒂夫·罗宾逊

Answers:


1

这是问题所在:FFmpeg没有特定的AMF(动作消息格式)混合器/编码器(至少目前没有),因此没有真正的方法使用它在输出文件中创建“ amf0”数据流以进行镜像Wowza的结果。

当前脚本正在做的是获取SRT文件中存在的所有数据,并将其作为3GPP定时文本(mov_text)格式的字幕流混合到视频中。

如果这是您期望的结果(根据您从Stack Overflow获得的信息),那么它可以按预期工作。但是,由于缺少-map参数,您的当前脚本正在丢弃音频流,每当尝试从两个或多个输入文件进行多路复用时,都需要使用这些参数。您应该将其更改为以下内容:

ffmpeg -i video_without_data.mp4 -i sub.srt -map 0:0 -map 0:1 -map 1 -c copy -c:s mov_text -movflags +faststart out.mp4

如果将元数据转储到字幕流中不是您想要的,则可以尝试使用FFmpeg的元数据解复用器/复用器查看是否可以从现有文件中读取AMF数据,然后重新格式化并复用为新的vid。可以在http://ffmpeg.org/ffmpeg-all.html#Metadata-1中找到详细信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.