ffmpeg: empacotando H264@MPEGTS em Smooth Streaming

ffmpeg: empacotando H264@MPEGTS em Smooth Streaming

Eu tenho um conjunto (bastante grande) de arquivos que é tudoH264em umMPEGTSrecipiente. Devido a restrições de tempo, preciso reempacotar esse conteúdo em um streaming suave, sem transcodificá-lo (a transcodificação levaria muito tempo).

Tenho tentado descobrir como fazer isso com o ffmpeg, pois parece ter dois muxers diferentes que podem estar à altura da tarefa. Eu tentei o muxer 'smoothstreaming' e o muxer 'ismv', mas com ambos estou tendo problemas.

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

Com isso, recebo o seguinte erro:

versão ffmpeg N-79695-g675cfb2 Copyright (c) 2000-2016 os desenvolvedores do FFmpeg
  construído com gcc 5.3.1 (Debian 5.3.1-14) 20160409
  configuração:
  libavutil 55.23.100 / 55.23.100
  libavcodec 57.38.100 / 57.38.100
  formato libav 57.35.100 / 57.35.100
  dispositivo libav 57.0.101 / 57.0.101
  filtro libav 6.44.100 / 6.44.100
  libswscale 4.1.100 / 4.1.100
  libswresample 2.0,101 / 2.0,101
Entrada #0, mpegts, de 'input.mpg':
  Duração: 01:28:41,98, início: 2,040000, taxa de bits: 2.500 kb/s
  Programa 1
    Stream #0:0[0x1e1]: Vídeo: h264 (Principal) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 fps, 25 tbr, 90 mil tbn
    Stream #0:1[0x1e2](eng): Áudio: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, estéreo, s16p, 192 kb/s
[smoothstreaming @ 0x2616340] O uso de AVStream.codec para passar parâmetros de codec para muxers está obsoleto, use AVStream.codecpar.
    Última mensagem repetida 1 vez
[smoothstreaming @ 0x2616340] Nenhuma taxa de bits definida para o fluxo 0
Saída #0, smoothstreaming, para 'ss_out':
  Metadados:
    codificador: Lavf57.35.100
    Stream #0:0: Vídeo: 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): Áudio: mp2 (i[0][0][0] / 0x0069), 48000 Hz, estéreo, 192 kb/s
Mapeamento de fluxo:
  Transmissão #0:0 -> #0:0 (cópia)
  Transmissão #0:1 -> #0:1 (cópia)
Não foi possível escrever o cabeçalho para o arquivo de saída #0 (parâmetros de codec incorretos?): Argumento inválido

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

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

Isso funciona bem até agora, mas preciso da ferramenta ismindex para criar os arquivos de manifesto, mas 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 errado ou talvez haja algo errado com meu arquivo de entrada?

Responder1

Portanto, das 2 soluções possíveis que pensei ter na minha pergunta, ambas podem funcionar, mas têm um resultado final diferente.

Muxer ISMV + ismindex

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

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 em AAC (embora pareça que ffmpeg e ismindex também não se importam com o áudio MP2) e o empacota em um .ismv.

ismindex -n ss_out ss_out.ismv

A ferramenta ismindex pode então criar os arquivos .ism e .ismc necessários.

Os arquivos que obtive foram transmitidos por meio do IIS com serviços de mídia.

Muxer de streaming suave

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

O problema que tive com esta solução é que ela resulta nos arquivos necessários para um servidor da web convencional fazer um streaming suave. portanto, os fragmentos de vídeo são divididos e os metadados por bloco. O que normalmente é feito pelo servidor de streaming.

informação relacionada