Cortando arquivos MP4 de multi-bitrate para o Helix Server com FFmpeg

2

Estamos usando o Helix Server para distribuir conteúdo Video On Demand (com taxa múltipla) entre nosso público. Isso significa que há um arquivo MP4 que contém vários fluxos de vídeo e um fluxo de áudio. A fonte dos nossos arquivos MP4 é o Helix Producer (codifica o vídeo bruto em um arquivo MP4).

O Helix Server reconhece os vários fluxos de vídeo diferentes no arquivo, se usarmos o arquivo MP4 diretamente do Helix Producer. Saída do FFprobe para ele:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '..\..\validate140225095504.mp4':
  Metadata:
    major_brand     : 3gr6
    minor_version   : 0
    compatible_brands: 3gr63gp63gg63gp5isom
    creation_time   : 2014-02-25 08:55:04
  Duration: 01:35:54.14, start: 0.000000, bitrate: 1051 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 285 kb/s, 23.80 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      handler_name    : Video Stream
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 47 kb/s (default)
    Metadata:
      handler_name    : Audio Stream
    Stream #0:2(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 653 kb/s, 23.80 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
      handler_name    : Video Stream
    Stream #0:3(und): Data: none (rtp  / 0x20707472), 17 kb/s (default)
    Metadata:
      handler_name    : Video Stream
    Stream #0:4(und): Data: none (rtp  / 0x20707472), 8 kb/s (default)
    Metadata:
      handler_name    : Audio Stream
    Stream #0:5(und): Data: none (rtp  / 0x20707472), 31 kb/s (default)
    Metadata:
      handler_name    : Video Stream
Unsupported codec with id 0 for input stream 3
Unsupported codec with id 0 for input stream 4
Unsupported codec with id 0 for input stream 5

No entanto, precisamos cortar o arquivo - usamos o FFmpeg para manter os vários fluxos de vídeo:

ffmpeg.exe -i ..\..\validate140225095504.mp4 -map 0:0 -map 0:1 -map 0:2 -acodec copy -vcodec copy -ss 00:30:00 -t 00:03:00 -movflags faststart+rtphint out.mp4

Aqui é onde nosso problema começa. O Helix Server não reconhece mais os diferentes fluxos de vídeo e oferece apenas o primeiro ao cliente. FFprobe me diz o seguinte sobre o novo arquivo:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.34.101
  Duration: 00:03:00.00, start: 0.000000, bitrate: 2096 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 286 kb/s, 23.87 fps, 25 tbr, 16k tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 47 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 568x320, 655 kb/s, 23.87 fps, 25 tbr, 16k tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:3(eng): Data: none (rtp  / 0x20707472), 335 kb/s
    Metadata:
      handler_name    : HintHandler
    Stream #0:4(eng): Data: none (rtp  / 0x20707472), 3 kb/s
    Metadata:
      handler_name    : HintHandler
    Stream #0:5(eng): Data: none (rtp  / 0x20707472), 762 kb/s
    Metadata:
      handler_name    : HintHandler
Unsupported codec with id 0 for input stream 3
Unsupported codec with id 0 for input stream 4
Unsupported codec with id 0 for input stream 5

Já experimentei uma quantidade considerável de combinações de todas as opções -movflags e opções -rtpflag. Mas nenhum deles ajudou.

Eu ainda tentei definir o major_brand com mp4box:

mp4box -brand 3gr6 out.mp4

e para criar as faixas de dicas com o mp4box:

mp4box -hint out.mp4

Mas estou preso.

Alguém tem experiência com o Helix Server em combinação com arquivos MP4 com várias taxas de bits? Ou existem outras maneiras de cortar e concatenar arquivos MP4?

    
por Florian 17.03.2014 / 15:17

1 resposta

1

você está mapeando apenas as 3 primeiras faixas.

ffmpeg.exe -i ..\..\validate140225095504.mp4 -map 0:0 -map 0:1 -map 0:2 ...

Normalmente, deve funcionar, mas você já tentou mapear todas as 5 faixas?

Também notei que os metadados foram alterados no seu arquivo de saída.

Original: handler_name    : Video Stream
Output:   handler_name    : VideoHandler

O mesmo para faixas de áudio. Tente usar -map_metadata e defina-os como no arquivo original.

    
por 03.07.2014 / 08:10