ffmpeg: empacotando H264 @ MPEGTS em Smooth Streaming

0

Eu tenho um (bastante grande) conjunto de arquivos que é todo H264 em um contêiner MPEG TS . Devido a restrições de tempo, eu preciso reempacotar este conteúdo em streaming suave sem transcodificá-lo (a transcodificação demoraria muito).

Eu tenho tentado descobrir como fazer isso com o ffmpeg, já que ele parece ter 2 muxers diferentes que podem estar prontos para a tarefa. Eu tentei tanto o muxer 'smoothstreaming' quanto o muxer 'ismv', mas com ambos eu estou encontrando problemas.

ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out

Com isso, recebo o seguinte erro:

ffmpeg version N-79695-g675cfb2 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.1 (Debian 5.3.1-14) 20160409
  configuration: 
  libavutil      55. 23.100 / 55. 23.100
  libavcodec     57. 38.100 / 57. 38.100
  libavformat    57. 35.100 / 57. 35.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 44.100 /  6. 44.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  0.101 /  2.  0.101
Input #0, mpegts, from 'input.mpg':
  Duration: 01:28:41.98, start: 2.040000, bitrate: 2500 kb/s
  Program 1 
    Stream #0:0[0x1e1]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 fps, 25 tbr, 90k tbn
    Stream #0:1[0x1e2](eng): Audio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, stereo, s16p, 192 kb/s
[smoothstreaming @ 0x2616340] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    Last message repeated 1 times
[smoothstreaming @ 0x2616340] No bit rate set for stream 0
Output #0, smoothstreaming, to 'ss_out':
  Metadata:
    encoder         : Lavf57.35.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 16:11 DAR 20:11], q=2-31, 25 fps, 25 tbr, 50 tbn
    Stream #0:1(eng): Audio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, stereo, 192 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

A outra coisa que tentei é empacotá-lo com o ffmpeg no ismv:

ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv

Isso funciona bem até agora, mas eu preciso da ferramenta ismindex para criar os arquivos de manifesto, mas isso falha:

ismindex -n ss_out ss_out.ismv

Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)

Há algo que estou fazendo de errado ou há algo errado com meu arquivo de entrada?

    
por Sartsj 03.05.2016 / 11:32

1 resposta

0

Então, das duas soluções possíveis que pensei ter na minha pergunta, as duas podem funcionar, mas elas têm um resultado final diferente.

ISMV muxer + ismindex

O que eu precisava era de um conjunto de arquivos do lado do servidor (.ism, .ismc, .ismv). Para conseguir isso, acabei fazendo as seguintes duas coisas:

ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv

O comando acima copia os fluxos de vídeo sem transcodificá-los, transcodifica o áudio no AAC (embora pareça que o ffmpeg e o ismindex não se importam com o áudio MP2) e o compacta em um .ismv.

ismindex -n ss_out ss_out.ismv

A ferramenta ismindex pode então criar os arquivos .ism e .ismc que eu preciso.

Os arquivos que recebi foram passíveis de fluir pelo IIS com o Media Services.

Smoothxing muxer

Eu também fiz o muxer 'smoothstreaming' funcionar no final, o truque era que ele precisava de um arquivo .ismv como entrada também. Então eu corri o mesmo comando ffmpeg acima, primeiro, depois do qual eu poderia usar o ffmpeg novamente para reempacotá-lo com o muxer 'smoothstreaming'.

O problema que tive com essa solução, porém, é que ela resulta nos arquivos necessários para que um servidor web convencional faça um fluxo suave. por isso, os fragmentos de vídeo são divididos e os metadados por pedaço. Que é normalmente tratado pelo servidor de streaming.

    
por 04.05.2016 / 15:09