我有源声音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
我希望两个文件都是相同的,并且无法弄清楚它们为什么会以不同的方式出现,但最重要的是,为什么一个文件可以播放而另一个文件不可播放?
答案 0 :(得分:2)
通过对这两个AIFF编码文件的标题进行比较,您可以发现它们在第一行的3-4列不同
xxd audio.aiff | head
没有管道
00000000: 464f 524d 0199 9040 4149 4643 4656 4552 FORM...@AIFCFVER
<强>管道强>
00000000: 464f 524d 0000 0000 4149 4643 4656 4552 FORM....AIFCFVER
根据AIFF的文件规范,此位置的数据应为ckDataSize
,它指定块的数据部分的大小。由于管道版本的值为零,我最好的猜测是通过使用管道,ffmpeg无法事先正确地确定输出流的数据大小,因此它留空,使编码文件有些格式不正确。
flac
等几个工具可以通过使用--ignore-chunk-sizes
等选项来解决这些格式错误的标头,无论如何都能正确读取文件,但我建议尽可能避免在媒体文件转换过程中使用管道。