Menggunakan avconv, saat remuxing ke MKV, apakah ada cara untuk memperbaiki file input AVI yang dikemas?

11

Karena bug kompatibilitas antara server Plex dan TV Panasonic, satu-satunya cara untuk membuatnya bekerja dengan baik adalah remux segalanya ke MKV, salin langsung semua aliran (video, audio, subtitle)

Tampaknya cukup sederhana:

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

Kecuali:

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

Dengan garis gotcha yang relevan adalah:

[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

Saya tidak dapat melihat opsi untuk membongkar frame B (atau membangun timemap VBR? Apakah kita memerlukannya di avconv?)

Apakah ada cara untuk melakukan ini, seperti di avidemux?

RoboJ1M
sumber

Jawaban:

8

Solusinya adalah mengonversi ke .mp4 terlebih dahulu:

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

Sayangnya, kita tidak bisa hanya mem-pipe format mp4 di antara instance avconv: "[mp4 @ 0x80846c0] muxer tidak mendukung output yang tidak dapat dicari"

rmsr
sumber
Terima kasih, saya akan mencobanya malam ini. Saya ingin tahu apakah ada perintah yang bertindak seperti buffer? Menunggu penulisan perintah untuk stdin selesai sebelum meneruskan semua itu ke stdout. Dengan mencari di stdout. Itu akan berguna. avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M
1
Pesan kesalahan yang saya tambahkan secara khusus terkait dengan mencoba menggunakan pipa dengan avconv, karena pipa secara inheren tidak dapat dicari. Yang terbaik dapat dilakukan adalah menemukan temp.mp4 pada tmpfs atau sistem file dalam memori yang serupa. / dev / shm / adalah kandidat yang bagus untuk ini, jika seseorang memiliki cukup RAM.
rmsr
Mengenai perpipaan, Anda mungkin dapat melakukannya dengan pipa bernama alias fifo. Cari mkfifo. Pada dasarnya, Anda menggunakan file sebagai penyimpanan sementara untuk gemuk.
Sparhawk
Solusi ini juga berfungsi untuk ffmpeg
c97
8

Pada tiket ini # 1979 di ffmpeg bugtracker solusi paling sederhana adalah memperbaiki bug ini atau secara manual menambahkan -fflags +genptske baris perintah.

Yaitu berubah

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

untuk

ffmpeg -fflags +genpts -i inputfile_that_cant_be_muxed_into_mkv.ext -c copy out.mkv
erik
sumber
1
Ini masih memberi saya kesalahan yang sama: /
Felix
bekerja untuk saya dengan avconvversi 0.8.16, sampai ditampilkan aneh Can't write packet with unknown timestampdi akhir file. Aneh.
malat
2
Pastikan -fflagsdigunakan sebagai opsi input: itu harus pergi sebelum Anda -i input. Tetapi mungkin itu tidak akan berhasil sama sekali jika Anda tidak menempatkannya +genptsdi tempat yang tepat.
Peter Cordes
Ini berfungsi baik dengan avconv9.18-6: 9.18-0ubuntu0.14.04.1 juga
Penatua Geek
2

Terima kasih kepada Andreas Cadhalpun ffmpegsekarang memiliki filter baru: mpeg4_unpack_bframes(lihat ref ). Ini akan memungkinkan Anda untuk menyingkirkan pesan: Invalid and inefficient vfw-avi packed B frames detected.

Penggunaannya sesederhana:

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