我有一组视频存储在各种多媒体容器中,如 AVI、MP4、MKV 等,我想确定我可以将它们存储在哪个容器中而无需重新编码(以避免质量损失)。我想使用avconv
快速将流直接复制到新的容器格式,如avconv -i <input-file> -c:a copy -c:v copy <output file>
. 有没有人做过任何测试来确定容器效率?
为了清楚起见,我说的是多媒体容器,如 AVI、Matroska 等,而不是编解码器,因为我不想重新编码。
编辑:为了进一步阐明“容器效率”,我指的是开销最小的容器(容器框架使用的浪费字节)。
对于测试用例,我通过 Torrent(摧毁所有行星)从互联网档案馆下载了一个无版权视频。由于它在不同的多媒体容器中包含许多不同比特率的文件,我选择了质量最高的版本 Destroy_All_Planets.mpeg,它在 30 fps 时为 720x480 和一个 MPEG2 视频流,视频比特率约为 3000 kbps(每个最大 6000 kbps)
mediainfo
和以 48000 Hz 采样的 AC-3 音频流,比特率为 192 kbps。我尝试转换为我能找到的所有多媒体容器类型。使用命令avconv infile -c:a copy -c:v copy outfile
AVI 尝试似乎已默认为未压缩,并且显然已重新编码(或解压缩),因为大小大幅增加并调整为 90fps,比特率为 15.9 Mbps。其他几个容器未能接受数据输入,并且可以在结果中看到文件大小为 0。根据这个测试的结果,MP4 和 MOV 容器似乎是最有效的(并列第一),而 Matroska 容器稳居第三。测试的所有其他多媒体容器导致实际尺寸超过源材料。为了全面披露,应该注意的是,在这种情况下,转换为 mkv 也失败了,我得到了错误,
Can't write packet with unknown timestamp
我之前通过在输入文件之前添加解决了这个问题,-fflags +genpts
这是此处概述的解决方法。在这种情况下,它产生了一个可播放的文件,我试过的播放器都无法确定其持续时间。在这种情况下,将之前转换的 mp4 转换为 mkv 效果很好。另一项测试得出以下结果:之前的测试包括一个带字幕的 mpeg,这次没有嵌入字幕,Matroska 容器的文件大小最小。它还具有成为测试容器中最灵活的优点,几乎可以支持当前可用的任何视频、音频或字幕格式。