У меня есть интересная задача, которую, я думаю, можно решить с помощью ffmpeg. Мне отправляют первые несколько сотен килобайт файла (mov/prores или h.264) и кусок размером 1-2 мегабайта из того же файла ближе к его концу. Мне нужно демультиплексировать большую часть, вытаскивая аудио в виде файла WAV для последующей обработки.

Я попытался объединить эти первые несколько сотен k в последующий раздел (команды оболочки bash), а затем демодулировать результат. Однако это понятно, что приводит к повторным ошибкам invalid frame header (полный вывод приведен ниже).

Поскольку у меня есть доступ к началу файла, запуск ffprobe -i в этом разделе работает нормально. Я надеялся использовать эту информацию для «форсирования» формата при демультиплексировании последней части. Однако я явно не передаю достаточно параметров, чтобы заставить ffmpeg демультиплексировать аудио:

    $ ffmpeg -f mov -i prores_last_2_megs.mov output_audio.wav
ffmpeg version 2.8.6 Copyright (c) 2000-2016 the FFmpeg developers
  built with Apple LLVM version 7.0.2 (clang-700.1.81)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.6 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fbb6c804200] moov atom not found
prores_last_2_megs.mov: Invalid data found when processing input

Ниже приведен вывод из попытки демультиплексирования с использованием первых 150 Кб оригинального файла и патча 4 Мб позже в этом файле:

ffmpeg -ss 00:00:00 -i prores_first_150k_and_last_4_megs.mov -to 00:00:02 -c copy -avoid_negative_ts 1 cut.mov
ffmpeg version 2.8.6 Copyright (c) 2000-2016 the FFmpeg developers
      built with Apple LLVM version 7.0.2 (clang-700.1.81)
      configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.6 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
      libavutil      54. 31.100 / 54. 31.100
      libavcodec     56. 60.100 / 56. 60.100
      libavformat    56. 40.101 / 56. 40.101
      libavdevice    56.  4.100 / 56.  4.100
      libavfilter     5. 40.101 /  5. 40.101
      libavresample   2.  1.  0 /  2.  1.  0
      libswscale      3.  1.101 /  3.  1.101
      libswresample   1.  2.101 /  1.  2.101
      libpostproc    53.  3.100 / 53.  3.100
    [prores @ 0x7fee0880be00] invalid frame header
        Last message repeated 20 times
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fee08808000] decoding for stream 0 failed
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fee08808000] Could not find codec parameters for stream 0 (Video: prores (apch / 0x68637061), none(bt709), 1920x1080, 124460 kb/s): unspecified pixel format
    Consider increasing the value for the 'analyzeduration' and 'probesize' options
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'prores_first_150k_and_last_4_megs.mov':
      Metadata:
        major_brand     : qt
        minor_version   : 537199360
        compatible_brands: qt
        creation_time   : 2015-11-03 10:23:58
        timecode        : 2332:32:21;21
      Duration: 00:04:02.44, start: 0.000000, bitrate: 136 kb/s
        Stream #0:0(eng): Video: prores (apch / 0x68637061), none(bt709), 1920x1080, 124460 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 2997 tbc (default)
        Metadata:
          creation_time   : 2015-11-03 10:23:58
          handler_name    : Apple Alias Data Handler
          encoder         : Apple ProRes 422 (HQ)
        Stream #0:1(eng): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, stereo, s16, 1536 kb/s (default)
        Metadata:
          creation_time   : 2015-11-03 10:23:58
          handler_name    : Apple Alias Data Handler
        Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default)
        Metadata:
          creation_time   : 2015-11-03 10:23:58
          handler_name    : Apple Alias Data Handler
          timecode        : 2332:32:21;21
    File 'cut.mov' already exists. Overwrite ? [y/N] y
    [mov @ 0x7fee09800000] Codec for stream 0 does not use global headers but container format requires global headers
    [mov @ 0x7fee09800000] Codec for stream 1 does not use global headers but container format requires global headers
    Output #0, mov, to 'cut.mov':
      Metadata:
        major_brand     : qt
        minor_version   : 537199360
        compatible_brands: qt
        timecode        : 2332:32:21;21
        encoder         : Lavf56.40.101
        Stream #0:0(eng): Video: prores (apch / 0x68637061), none, 1920x1080, q=2-31, 124460 kb/s, 29.97 fps, 29.97 tbr, 11988 tbn, 2997 tbc (default)
        Metadata:
          creation_time   : 2015-11-03 10:23:58
          handler_name    : Apple Alias Data Handler
          encoder         : Apple ProRes 422 (HQ)
        Stream #0:1(eng): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, stereo, 1536 kb/s (default)
        Metadata:
          creation_time   : 2015-11-03 10:23:58
          handler_name    : Apple Alias Data Handler
    Stream mapping:
      Stream #0:0 -> #0:0 (copy)
      Stream #0:1 -> #0:1 (copy)
    Press [q] to stop, [?] for help
    frame=   21 fps=0.0 q=-1.0 Lsize=    4011kB time=00:00:01.49 bitrate=21911.0kbits/s
    video:3727kB audio:281kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.056156%

Я мог бы срезать заголовок более разумно (например, для prores, разрезать от головы до атома mdia , а затем объединить с последней частью, как только я определю, как разрезать это на правильной границе кадра ...

Итак, если бы вам дали первые несколько сотен килограммов и последующие 2-мегабайтные фрагменты из середины видеофайла, как бы вы извлекли аудио wav? Спасибо!

0