web-dev-qa-db-fra.com

Avec avconv, lors du remuxage en MKV, existe-t-il un moyen de réparer les fichiers d'entrée AVI compressés?

En raison de problèmes de compatibilité entre le serveur Plex et les téléviseurs Panasonic, le seul moyen de le faire fonctionner correctement consiste à tout transférer en MKV, à copier directement tous les flux (vidéo, audio, sous-titres).

Semble assez simple:

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

Sauf:

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

Les lignes à prendre étant:

[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

Je ne vois pas d’option permettant de décompresser les images B (ou de créer un timemap VBR? Avons-nous besoin de ceux-ci dans avconv?)

Y a-t-il un moyen de faire cela, comme dans avidemux?

9
RoboJ1M

Une solution de contournement consiste à convertir d'abord en .mp4:

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

Malheureusement, on ne peut pas simplement acheminer le format mp4 entre les instances avconv: "[mp4 @ 0x80846c0] muxer ne prend pas en charge les sorties non recherchées"

8
rmsr

A partir de ce ticket # 1979 sur ffmpeg bugtracker , la solution la plus simple est de corriger ce bogue ou d’ajouter manuellement -fflags +genpts à la ligne de commande.

C'est à dire. changement

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

à

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
7
erik

Merci à Andreas Cadhalpun ffmpeg a maintenant un nouveau filtre: mpeg4_unpack_bframes (voir ref ). Cela vous permettra de vous débarrasser du message: Invalid and inefficient vfw-avi packed B frames detected.

L'utilisation est aussi simple que:

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