MKVに再多重化するときにavconvを使用して、パックされたAVI入力ファイルを修正する方法はありますか?


11

PlexサーバーとパナソニックTV間の互換性のバグのため、それをうまく機能させる唯一の方法は、すべてをMKVに再多重化し、すべてのストリーム(ビデオ、オーディオ、字幕)を直接コピーすることです

十分に単純なようです:

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

例外:

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

関連する落とし穴行は次のとおりです:

[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

Bフレームを解凍するオプションが表示されません(またはVBRタイムマップを作成しますか?avconvに必要ですか?)

avidemuxのように、これを行う方法はありますか?

回答:


8

回避策は、最初に.mp4に変換することです。

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

悲しいことに、avconvインスタンス間で単純にmp4形式をパイプ処理することはできません。「[mp4 @ 0x80846c0] muxerはシーク不可能な出力をサポートしていません」


おかげで、今晩試してみることにします。バッファのように振る舞うコマンドがあるかしら?stdinへのコマンド書き込みが完了するのを待ってから、すべてをstdoutに渡します。stdoutでシークします。それは便利でしょう。avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M 2013年

1
追加したエラーメッセージは、パイプは本質的にシークできないため、avconvでパイプを使用しようとすることに特に関連しています。最善の方法は、tmpfsまたは同様のメモリ内ファイルシステムにtemp.mp4を配置することです。/ dev / shm /は、十分なRAMがある場合、これの良い候補です。
rmsr 2013年

パイピングに関しては、おそらく名前付きパイプ、別名fifoでそれを行うことができます。を検索してくださいmkfifo。基本的に、ファイルをstoutの一時ストレージとして使用します。
スパーホーク2014

このソリューションはffmpegでも機能します
c97 2015年

8

とおりバグトラッカーffmpegの時にこのチケット#1979最も簡単な解決策このバグを修正したために、または手動で追加することで-fflags +genpts、コマンドラインに。

すなわち変更

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

1
これでも同じエラーが発生します:/
Felix

ファイルの最後にavconv奇数が表示されるまで、バージョン0.8.16で動作しCan't write packet with unknown timestampます。変だ。
Malat、2015年

2
-fflags入力オプションとして使用されていることを確認してください:はの前に置く必要があります-i input。しかし+genpts、適切な場所に配置しなければ、おそらくそれはまったく機能しなかっただろう。
Peter Cordes、2015

これはavconv9.18-6:9.18-0ubuntu0.14.04.1でも正常に機能します
オタク

2

Andreas Cadhalpunのおかげで、ffmpeg新しいフィルターが追加されましたmpeg4_unpack_bframesrefを参照)。これにより、メッセージを取り除くことができます:Invalid and inefficient vfw-avi packed B frames detected

使い方は簡単です:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.