Usando o avconv, ao remuxar para o MKV, existe uma maneira de corrigir arquivos de entrada AVI compactados?

11

Devido a erros de compatibilidade entre o servidor Plex e as TVs Panasonic, a única maneira de fazê-lo funcionar corretamente é remuxar tudo para o MKV, copiar diretamente todos os fluxos (vídeo, áudio, legenda)

Parece bastante simples:

avconv -i "input.avi" -c copy "output.mkv"

Exceto:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:00:59 with gcc 4.6.3
[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.4.1 (build 2117/release)
  Duration: 00:27:38.52, start: 0.000000, bitrate: 1173 kb/s
    Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 640x352 [PAR 1:1 DAR 20:11], 25 tbr, 25 tbn, 25 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 132 kb/s
File 'output.mkv' already exists. Overwrite ? [y/N] y
Output #0, matroska, to 'output.mkv':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: mpeg4, yuv420p, 640x352 [PAR 1:1 DAR 20:11], q=2-31, 1k tbn, 25 tbc
    Stream #0.1: Audio: libmp3lame, 48000 Hz, stereo, 132 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press ctrl-c to stop encoding
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

Com as linhas de pegada relevantes sendo:

[mpeg4 @ 0x8422140] Invalid and inefficient vfw-avi packed B frames detected#
<snip>
[matroska @ 0x8422cc0] Can't write packet with unknown timestamp
av_interleaved_write_frame(): Invalid argument

Não vejo uma opção para descompactar os quadros B (ou criar um mapa de tempo VBR? Precisamos deles no avconv?)

Existe uma maneira de fazer isso, como no avidemux?

RoboJ1M
fonte

Respostas:

8

Uma solução alternativa é converter primeiro em .mp4:

avconv -i input.avi -c copy temp.mp4
avconv -i temp.mp4 -c copy output.mkv
rm temp.mp4

Infelizmente, não se pode simplesmente canalizar o formato mp4 entre instâncias avconv: "[mp4 @ 0x80846c0] muxer não suporta saída não procurável"

rmsr
fonte
Obrigado, vou experimentá-lo esta noite. Gostaria de saber se existe um comando que funciona como um buffer? Aguarda a conclusão da gravação do comando stdin antes de passar tudo para o stdout. Com busca no stdout. Isso seria útil. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
11
A mensagem de erro que eu anexei está especificamente relacionada à tentativa de usar pipes com avconv, pois eles são inerentemente não procuráveis. O melhor a fazer é localizar o temp.mp4 em um tmpfs ou em um sistema de arquivos na memória semelhante. / dev / shm / é um bom candidato para isso, se houver RAM suficiente.
RMSR
Em relação à tubulação, você provavelmente pode fazê-lo com pipes nomeados, também conhecidos como fifo. Tenha uma pesquisa para mkfifo. Essencialmente, você usa um arquivo como armazenamento temporário para stout.
Sparhawk #
Esta solução também funciona para ffmpeg
c97 23/01
8

A partir deste ticket # 1979, no ffmpeg bugtracker, a solução mais simples é corrigir esse bug ou adicioná-lo manualmente -fflags +genptsà linha de comando.

Ou seja, mudar

ffmpeg -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv

para

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
erik
fonte
11
Isso ainda me dá o mesmo erro: /
Felix
funciona para mim com a avconvversão 0.8.16, até que seja exibido um ímpar Can't write packet with unknown timestampno final do arquivo. Esquisito.
malat
2
Certifique-se de que -fflagsseja usado como uma opção de entrada: ela deve ser anterior à sua -i input. Mas provavelmente não teria funcionado se você não tivesse colocado +genptsno lugar certo.
Pedro Cordes
Isso funciona bem com o avconv9.18-6: 9.18-0ubuntu0.14.04.1 também
Elder Geek
2

Graças a Andreas Cadhalpun ffmpegagora tem um novo filtro: mpeg4_unpack_bframes(veja ref ). Isso permitirá que você se livrar da mensagem: Invalid and inefficient vfw-avi packed B frames detected.

O uso é tão simples quanto:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
malat
fonte