Gibt es bei Verwendung von avconv beim Remuxen auf MKV eine Möglichkeit, gepackte AVI-Eingabedateien zu reparieren?

11

Aufgrund von Kompatibilitätsfehlern zwischen dem Plex-Server und den Fernsehgeräten von Panasonic besteht die einzige Möglichkeit, die Funktion zu verbessern, darin, alles auf MKV zu remuxen und alle Streams (Video, Audio, Untertitel) direkt zu kopieren.

Scheint einfach genug:

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

Außer:

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

Mit den relevanten Gotcha-Zeilen:

[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

Ich kann keine Option zum Entpacken der B-Frames sehen (oder eine VBR-Zeitkarte erstellen? Benötigen wir diese in avconv?)

Gibt es eine Möglichkeit, dies zu tun, wie in Avidemux?

RoboJ1M
quelle

Antworten:

8

Eine Problemumgehung besteht darin, zuerst in .mp4 zu konvertieren:

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

Leider kann man das mp4-Format nicht einfach zwischen avconv-Instanzen leiten: "[mp4 @ 0x80846c0] muxer unterstützt keine nicht durchsuchbare Ausgabe"

rmsr
quelle
Danke, ich werde es heute Abend ausprobieren. Ich frage mich, ob es einen Befehl gibt, der wie ein Puffer wirkt. Wartet, bis der Befehl zum Schreiben an stdin abgeschlossen ist, bevor alles an stdout übergeben wird. Mit Suche auf stdout. Das wäre praktisch. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
1
Die von mir angehängte Fehlermeldung bezieht sich speziell auf den Versuch, Pipes mit avconv zu verwenden, da Pipes von Natur aus nicht durchsuchbar sind. Das Beste, was Sie tun können, ist, temp.mp4 auf einem tmpfs oder einem ähnlichen speicherinternen Dateisystem zu finden. / dev / shm / ist ein guter Kandidat dafür, wenn man genug RAM hat.
rmsr
In Bezug auf Rohrleitungen können Sie dies wahrscheinlich mit Named Pipes oder Fifo tun. Suche nach mkfifo. Im Wesentlichen verwenden Sie eine Datei als temporären Speicher für Stout.
Sparhawk
Diese Lösung funktioniert auch für ffmpeg
c97
8

Ab diesem Ticket # 1979 bei ffmpeg Bugtracker besteht die einfachste Lösung darin, diesen Fehler zu beheben oder manuell -fflags +genptszur Befehlszeile hinzuzufügen .

Dh ändern

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

zu

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
erik
quelle
1
Dies gibt mir immer noch den gleichen Fehler: /
Felix
funktioniert bei mir mit avconvVersion 0.8.16, bis Can't write packet with unknown timestampam Ende der Datei eine ungerade angezeigt wird . Seltsam.
Malat
2
Stellen Sie sicher, dass -fflagses als Eingabeoption verwendet wird: Es muss vor Ihrem gehen -i input. Aber wahrscheinlich hätte es überhaupt nicht funktioniert, wenn Sie nicht +genptsan der richtigen Stelle platziert hätten.
Peter Cordes
Dies funktioniert gut mit avconv9.18-6: 9.18-0ubuntu0.14.04.1
Elder Geek
2

Dank Andreas Cadhalpun hat ffmpegjetzt neuer Filter: mpeg4_unpack_bframes(siehe Ref ). Auf diese Weise können Sie die Nachricht entfernen : Invalid and inefficient vfw-avi packed B frames detected.

Die Verwendung ist so einfach wie:

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