Czy podczas remuxingu do MKV za pomocą avconv można naprawić spakowane pliki wejściowe AVI?

11

Ze względu na błędy kompatybilności między serwerem Plex a telewizorami Panasonic, jedynym sposobem, aby działał dobrze, jest remux wszystko do MKV, proste kopiowanie wszystkich strumieni (wideo, audio, napisy)

Wydaje się dość proste:

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

Z wyjątkiem:

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

Odpowiednie linie gotcha to:

[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

Nie widzę opcji rozpakowania ramek B (lub zbudowania mapy czasowej VBR? Czy potrzebujemy tych w avconv?)

Czy jest na to sposób, jak w avidemux?

RoboJ1M
źródło

Odpowiedzi:

8

Obejściem tego problemu jest konwersja do formatu .mp4:

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

Niestety nie można po prostu przesyłać strumieniowo formatu mp4 między instancjami avconv: „[mp4 @ 0x80846c0] multiplekser nie obsługuje wyjścia niewidocznego”

rmsr
źródło
Dzięki, wypróbuję to dziś wieczorem. Zastanawiam się, czy istnieje polecenie, które działa jak bufor? Czeka na zakończenie pisania polecenia stdin, a następnie przekazuje je na stdout. Z szukaniem na stdout. To by się przydało. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
1
Dołączony przeze mnie komunikat o błędzie dotyczy konkretnie próby użycia potoków z programem avconv, ponieważ potoki są z natury niewidoczne. Najlepsze, co możesz zrobić, to zlokalizować temp.mp4 w systemie plików tmpfs lub podobnym systemie plików w pamięci. / dev / shm / jest dobrym kandydatem do tego, jeśli ma wystarczającą ilość pamięci RAM.
rmsr
Jeśli chodzi o orurowanie, prawdopodobnie możesz to zrobić za pomocą nazwanych potoków zwanych fifo. Wyszukaj mkfifo. Zasadniczo używasz pliku jako tymczasowego magazynu dla grubego.
Sparhawk
To rozwiązanie działa również w przypadku ffmpeg
c97
8

Począwszy od tego biletu # 1979 w ffmpeg Bugtracker najprostszym rozwiązaniem jest naprawienie tego błędu lub ręczne dodanie -fflags +genptsgo do wiersza poleceń.

Tj. Zmiana

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

do

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
erik
źródło
1
Nadal daje mi ten sam błąd: /
Felix
działa dla mnie z avconvwersją 0.8.16, dopóki nie wyświetliło się nieparzyste Can't write packet with unknown timestampna końcu pliku. Dziwne.
Środa
2
Upewnij się, że -fflagsjest używana jako opcja wprowadzania: musi przejść przed Twoim -i input. Ale prawdopodobnie nie zadziałałoby, gdybyś nie postawił +genptswe właściwym miejscu.
Peter Cordes,
Działa to również dobrze z avconv9.18-6: 9.18-0ubuntu0.14.04.1
Elder Geek
2

Dzięki Andreas Cadhalpun ffmpegma teraz nowy filtr: mpeg4_unpack_bframes(patrz ref ). Pozwoli to, aby pozbyć się tego komunikatu: Invalid and inefficient vfw-avi packed B frames detected.

Użycie jest tak proste, jak:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
malat
źródło