Incruste metadatos AMF en MP4 con ffmpeg

Incruste metadatos AMF en MP4 con ffmpeg

¿Es posible incrustar manualmente metadatos de texto cronometrados en archivos MP4? Tengo un archivo TTML/SRT con los metadatos. Solo necesito incrustar los datos de texto sin hacer nada con las pistas de video/audio.

Solíamos inyectar metadatos usando un complemento en el motor de transmisión Wowza que usamos para la transmisión en vivo.

Lo que debo hacer es inyectar manualmente los metadatos en archivos MP4 pregrabados sin ejecutar el video a través de Wowza.

Aquí hay uno de esos archivos de video.que fue procesado por 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

Con la ayuda de stackoverflow, encontré que puedo usar ffmpegpara hacer el truco.

Entonces ejecuto el comando

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

y si lo ejecuto ffmpeg -i out.mp4me sale esto:

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

Ahora, como puede ver, el texto está incrustado con un códec diferente (¿es este el término correcto?). Además, tampoco veo una pista de audio.

Espero que mi pregunta sea lo suficientemente clara. Necesito una forma de incrustar metadatos (de srt/ttml) en un video MP4; debería estar incrustado en amfformato (nuevamente, ¿es este el término correcto?)

Respuesta1

Aquí está el problema: FFmpeg no tiene un muxer/codificador AMF (formato de mensaje de acción) específico, al menos no actualmente, por lo que no hayverdaderomanera de usarlo para crear unflujo de datos "amf0"en su archivo de salida para reflejar los resultados de Wowza.

Lo que hace su secuencia de comandos actual es tomar cualquier dato presente en su archivo SRT y mezclarlo en su video como unsubtitulartransmitir en formato de texto cronometrado 3GPP (mov_text).

Si este es el resultado que esperas (según la información que obtuviste de Stack Overflow), entonces está funcionando según lo previsto. Sin embargo, su secuencia de comandos actual está interrumpiendo la transmisión de audio debido a la falta de -mapparámetros, que son necesarios siempre que se intenta realizar una mezcla de dos o más archivos de entrada. Deberías cambiarlo a lo siguiente:

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

Si descarga sus metadatos en una secuencia de subtítulosno eslo que pretendías, puedes intentar usar FFmpegmetadatosdemuxer/muxer para ver si sus datos AMF se pueden leer desde un archivo existente, luego reformatearlos y mezclarlos en nuevos videos. Los detalles se pueden encontrar enhttp://ffmpeg.org/ffmpeg-all.html#Metadata-1

información relacionada