这两个 ffmpeg 文件为什么不同(管道输出和文件输出)?

3
我有一个源音频文件`audio.mp3`,我想将其转换为`audio.aiff`格式。当我执行以下命令时:
`ffmpeg -i audio.mp3 -acodec pcm_s16le -ac 1 -ar 44100 -vn audio.aiff`
我得到一个名为`tim_tum.aiff`的输出文件,它可以播放,并且完全符合我的预期。然而,当我执行以下命令时:
`ffmpeg -i audio.mp3 -acodec pcm_s16le -ac 1 -ar 44100 -vn -f aiff pipe:1 > audio_pipe.aiff`
我得到了一个不可播放的`audio_pipe.aiff`文件,它与原始的`audio.aiff`文件不同,这是通过以下方式证明的:
$ diff audio.aiff audio_pipe.aiff
Binary files audio.aiff and audio_pipe.aiff differ

我希望这两个文件是一样的,但我不知道为什么它们会有所不同,更重要的是,为什么其中一个文件可以播放而另一个不能?

1个回答

3

通过比较这两个AIFF编码文件的头部,您可以观察到它们在第一行的3-4列存在差异。

xxd audio.aiff | head

未经传递

00000000: 464f 524d 0199 9040 4149 4643 4656 4552  FORM...@AIFCFVER

piped

00000000: 464f 524d 0000 0000 4149 4643 4656 4552  FORM....AIFCFVER

根据AIFF文件规范,此位置的数据应为ckDataSize,它指定块中数据部分的大小。由于管道版本的值为零,我猜测使用管道时,ffmpeg无法预先正确确定输出流的数据大小,因此该值为空白,导致编码文件略有缺陷。
flac这样的几个工具可以通过使用选项(如--ignore-chunk-sizes)绕过这些畸形头部,以便正确读取文件,但建议尽可能避免在媒体文件转换期间使用管道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接