
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.