ffmpeg를 사용하여 AMF 메타데이터를 MP4에 포함

ffmpeg를 사용하여 AMF 메타데이터를 MP4에 포함

시간이 지정된 텍스트 메타데이터를 MP4 파일에 수동으로 포함할 수 있습니까? 메타데이터가 포함된 TTML/SRT 파일이 있습니다. 비디오/오디오 트랙에 아무 작업도 수행하지 않고 텍스트 데이터를 삽입하면 됩니다.

우리는 라이브 스트리밍에 사용하는 Wowza 스트리밍 엔진의 플러그인을 사용하여 메타데이터 주입을 수행하곤 했습니다.

내가 해야 할 일은 Wowza를 통해 비디오를 실행하지 않고 미리 녹음된 MP4 파일에 메타데이터를 수동으로 삽입하는 것입니다.

여기에 그러한 비디오 파일이 하나 있습니다.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

나는 ffmpeg트릭을 수행하는 데 사용할 수 있는 stackoverflow의 도움을 찾았습니다.

그래서 명령을 실행합니다.

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(이 말이 올바른 용어인가요?).

답변1

문제는 다음과 같습니다. FFmpeg에는 특정 AMF(Action Message Format) 다중화기/인코더가 없습니다. 적어도 현재는 없습니다.진실그것을 사용하여 생성하는 방법"amf0" 데이터 스트림Wowza의 결과를 반영하기 위해 출력 파일에 추가하세요.

현재 스크립트가 수행하는 작업은 SRT 파일에 있는 모든 데이터를 가져와 비디오에 다중화하는 것입니다.부제3GPP Timed Text(mov_text) 형식으로 스트리밍합니다.

이것이 예상한 결과라면(스택 오버플로에서 얻은 정보에 따라) 의도한 대로 작동하는 것입니다. 그러나 현재 스크립트는 -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를 사용해 볼 수도 있습니다.메타데이터demuxer/muxer를 사용하여 AMF 데이터를 기존 파일에서 읽을 수 있는지 확인한 다음 다시 형식화하고 새 비디오로 다중화할 수 있습니다. 자세한 내용은 다음에서 확인할 수 있습니다.http://ffmpeg.org/ffmpeg-all.html#Metadata-1

관련 정보