Betten Sie AMF-Metadaten mit ffmpeg in MP4 ein

Betten Sie AMF-Metadaten mit ffmpeg in MP4 ein

Ist es möglich, zeitgesteuerte Textmetadaten manuell in MP4-Dateien einzubetten? Ich habe eine TTML-/SRT-Datei mit den Metadaten. Ich muss nur die Textdaten einbetten, ohne etwas mit den Video-/Audiospuren zu tun.

Früher haben wir die Metadateneinfügung mithilfe eines Plug-Ins der Wowza-Streaming-Engine durchgeführt, die wir für Live-Streaming verwenden.

Was ich tun muss, ist, die Metadaten manuell in aufgezeichnete MP4-Dateien einzufügen, ohne das Video über Wowza laufen zu lassen.

Hier ist eine solche Videodateidas wurde von Wowza verarbeitet:

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

Mithilfe von Stackoverflow habe ich etwas gefunden, mit dem ich ffmpegden Trick machen kann.

Also führe ich den Befehl aus

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

und wenn ich ausführe ffmpeg -i out.mp4, erhalte ich Folgendes:

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

Wie Sie sehen, ist der Text mit einem anderen Codec eingebettet (ist das der richtige Begriff?). Außerdem sehe ich auch keine Audiospur.

Ich hoffe, meine Frage ist klar genug. Ich brauche eine Möglichkeit, Metadaten (von srt/ttml) in ein MP4-Video einzubetten. Sie sollten im amfFormat eingebettet werden (ist das noch einmal der richtige Begriff?)

Antwort1

Hier ist das Problem: FFmpeg hat keinen speziellen AMF (Action Message Format) Muxer/Encoder -- zumindest derzeit nicht -- also gibt es keineWAHRMöglichkeit, es zu verwenden, um eine„amf0“ Datenstromin Ihrer Ausgabedatei, um die Ergebnisse von Wowza widerzuspiegeln.

Was Ihr aktuelles Skript macht, ist, alle Daten aus Ihrer SRT-Datei zu nehmen und sie in Ihr Video alsUntertitelStream in einem 3GPP Timed Text-Format (mov_text).

Wenn dies das erwartete Ergebnis ist (gemäß den Informationen, die Sie von Stack Overflow erhalten haben), funktioniert es wie vorgesehen. Ihr aktuelles Skript lässt den Audiostream jedoch aufgrund fehlender -mapParameter fallen, die immer dann benötigt werden, wenn versucht wird, aus zwei oder mehr Eingabedateien zu muxen. Sie sollten es wie folgt ändern:

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

Wenn Sie Ihre Metadaten in einen Untertitel-Stream übertragenist nichtwas Sie beabsichtigt haben, könnten Sie versuchen, FFmpeg'sMetadatenDemuxer/Muxer, um zu prüfen, ob Ihre AMF-Daten aus einer vorhandenen Datei gelesen, dann neu formatiert und in neue Videos muxed werden können. Details finden Sie unterhttp://ffmpeg.org/ffmpeg-all.html#Metadata-1

verwandte Informationen