Como converter um mpeg2 em um mp4 streamable ou fragmentado?

5

Estou tentando converter arquivos mpg (mpeg2) gravados pelo mythtv em arquivos mp4 streamable . A conversão para um mp4 é simples, no entanto, o arquivo inteiro deve ser convertido antes de poder ser usado. Mesmo usando ferramentas de conversão que colocam o "mov atom" no início do arquivo para streaming rápido, é necessário que todo o mp4 seja codificado antes que isso aconteça.

Eu li no avconv docs que "O muxer mov / mp4 / ismv suporta a fragmentação". que pode colocar um átomo mov "falso" no início do arquivo e, em seguida, coloca um novo em cada quadro-chave em todo o arquivo para que o vídeo possa ser transmitido enquanto está sendo transcodificado ou se a conversão for interrompida.

Acredito que tenha seguido as instruções do avconv ( link ) sobre como converter um arquivo, mas continue recebendo erros que indicam que o codificador não entende os parâmetros. Abaixo está meu comando e a saída de erro que ele gera. Eu tenho esgotado o google e a mim mesmo procurando por respostas e aparecendo em branco, então qualquer ajuda seria muito apreciada.

Sistema executando o Ubuntu 12.04x64 com a versão avconv 0.8.1-4: 0.8.1-0ubuntu1.

Comando:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -c:a copy output.mp4

Erro:

[mp4 muxer @ 0x36772e0] [Eval @ 0x7fffeddb69b0] Undefined constant or missing '(' in 'frag_keyframe'
[mp4 muxer @ 0x36772e0] Unable to parse option value "frag_keyframe+empty_moov"
[mp4 muxer @ 0x36772e0] Error setting option movflags to value frag_keyframe+empty_moov.
Output #0, mp4, to 'output.mp4':
    Stream #0.0: Video: libx264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=-1--1, 90k tbn, 29.97 tbc
    Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, 384 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> libx264)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?)

Eu tentei muxers diferentes (-f parâmetros como h264, etc) e tinha outros erros como o movflag não era nem suportado (lógico).

Estou perdendo um pacote, dependência ou apenas o ponto? Agradecemos antecipadamente.

    
por Scrubb 09.05.2012 / 20:02

2 respostas

2

Existe um bug arquivado na libav sobre esse problema exato. Depressivamente, parece não ser abordado. Acho melhor considerar o avconv uma boa ferramenta de codificação, mas não uma boa ferramenta de encapsulamento.

A melhor maneira de fazer isso é usar o MP4Box do GPAC . É um utilitário que parece estar preocupado principalmente com o encapsulamento de fluxos de mídia em arquivos mp4. Não faz en / de / transcoding, por exemplo. Se você instalar o GPAC no Ubuntu, você pode dizer:

MP4Box -add non-streamable.mp4 new-shiny-streamable.mp4

MP4Box por padrão torna os arquivos mp4 fluentes:

  

A partir da versão 0.2.4, o MP4Box sempre armazena o arquivo com intercalação de 0,5 segundo e meta-dados no início, tornando-o adequado para o fluxo HTTP. ( source )

    
por automatthias 09.09.2012 / 18:25
0

Veja aqui : é um guia ffmpeg, mas aplica-se igualmente bem à avconv.

Eu não sei sobre a criação de arquivos para streaming, mas o erro pode ser porque você está perdendo uma predefinição, e possivelmente também uma configuração de qualidade (embora eu acredite que o avconv usa o crf 23 como padrão, se não houver outra configuração de qualidade é fornecida). Experimente:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -preset medium -c:a copy output.mp4

As predefinições são: ultra rápidas, super rápidas, muito velozes, rápidas, rápidas, médias, lentas, lentas e muito lentas. As predefinições mais rápidas fornecem codificações mais rápidas, mas arquivos maiores, enquanto as mais rápidas têm arquivos menores, mas demoram mais para serem feitas. Não há diferença de qualidade entre os diferentes presets. Há também uma predefinição 'placebo', mas isso é uma piada dos desenvolvedores do x264 e deve ser ignorado.

Se não funcionar, você pode tentar usar:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -crf 20 -preset medium -c:a copy output.mp4

20 é completamente arbitrário, escolha qualquer configuração crf que funcione melhor para você. Inferior = melhor qualidade de imagem, mas tamanho de arquivo maior. De acordo com esse guia, você provavelmente deve usar entre 18 e 28 anos.

    
por evilsoup 07.12.2012 / 16:25