En utilisant avconv, lors du remuxage vers MKV, existe-t-il un moyen de corriger les fichiers d'entrée AVI compressés?

11

En raison de bogues de compatibilité entre le serveur Plex et les téléviseurs Panasonic, le seul moyen de le faire fonctionner correctement est de tout remuxer vers MKV, de 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

Avec les lignes de gotcha pertinentes é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 pour décompresser les trames B (ou construire un plan temporel VBR? En avons-nous besoin dans avconv?)

Existe-t-il un moyen de le faire, comme dans avidemux?

RoboJ1M
la source

Réponses:

8

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 diriger le format mp4 entre des instances avconv: "[mp4 @ 0x80846c0] muxer ne prend pas en charge la sortie non recherchée"

rmsr
la source
Merci, je vais l'essayer ce soir. Je me demande s'il y a une commande qui agit comme un tampon? Attend la fin de l'écriture de la commande dans stdin avant de tout transmettre à stdout. Avec recherche sur stdout. Ce serait pratique. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
1
Le message d'erreur que j'ai ajouté est spécifiquement lié à la tentative d'utilisation de canaux avec avconv, car les canaux sont intrinsèquement non recherchables. Le mieux que l'on puisse faire est de localiser temp.mp4 sur un tmpfs ou un système de fichiers en mémoire similaire. / dev / shm / est un bon candidat pour cela, si l'on a assez de RAM.
rmsr
En ce qui concerne la tuyauterie, vous pouvez probablement le faire avec des tuyaux nommés aka fifo. Ayez une recherche pour mkfifo. Essentiellement, vous utilisez un fichier comme stockage temporaire pour stout.
Sparhawk
Cette solution fonctionne également pour ffmpeg
c97
8

À partir de ce ticket # 1979 sur ffmpeg bugtracker, la solution la plus simple consiste à corriger ce bogue ou à l'ajouter manuellement -fflags +genptsà la ligne de commande.

C'est à dire le 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
erik
la source
1
Cela me donne toujours la même erreur: /
Felix
fonctionne pour moi avec la avconvversion 0.8.16, jusqu'à ce qu'il affiche une étrange Can't write packet with unknown timestampà la fin du fichier. Bizarre.
malat
2
Assurez-vous qu'il -fflagsest utilisé comme option d'entrée: il doit précéder votre -i input. Mais cela n'aurait probablement pas fonctionné du tout si vous n'aviez pas mis +genptsau bon endroit.
Peter Cordes
Cela fonctionne aussi bien avec avconv9.18-6: 9.18-0ubuntu0.14.04.1
Elder Geek
2

Merci à Andreas Cadhalpun a ffmpegmaintenant 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
malat
la source