使用avconv重新混合为MKV时,是否有办法修复打包的AVI输入文件?


11

由于Plex服务器和Panasonic电视之间的兼容性错误,使其正常工作的唯一方法是将所有内容重新混合到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中?

Answers:


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]多路复用器不支持不可搜索的输出”


谢谢,我今晚尝试一下。我想知道是否有一个像缓冲区一样的命令?等待命令完成对stdin的写入,然后再将其全部传递给stdout。与在stdout上查找。那将很方便。avconv -i xxx | buf | avconv -i stdin xxx
RoboJ1M 2013年

1
我附加的错误消息与尝试在avconv中使用管道特别相关,因为管道本质上是不可搜索的。最好的办法是将temp.mp4放在tmpfs或类似的内存文件系统上。如果一个人有足够的RAM,那么/ dev / shm /是一个很好的选择。
rmsr

关于管道,您可以使用命名管道(也称为fifo)来完成。搜索mkfifo。本质上,您将文件用作烈性黑啤酒的临时存储。
Sparhawk

此解决方案也适用于ffmpeg
c97,22:

8

ffmpeg bugtracker票证#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

适用于avconv0.8.16版,直到Can't write packet with unknown timestamp文件末尾显示为奇数为止。奇怪的。
malat 2015年

2
确保-fflags将其用作输入选项:它必须在之前-i input。但是,如果您没有放在+genpts正确的位置,可能根本不会起作用。
彼得·科德斯

这也可以在avconv9.18-6:9.18-0ubuntu0.14.04.1上正常使用
Elder Geek

2

感谢Andreas Cadhalpun ffmpeg现在有了新的过滤器:(mpeg4_unpack_bframes请参阅ref)。这将使您摆脱消息:Invalid and inefficient vfw-avi packed B frames detected

用法很简单:

ffmpeg -i INPUT.avi -codec copy -bsf:v mpeg4_unpack_bframes OUTPUT.avi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.