midi to ogg - 管道失真

时间:2014-07-08 21:53:11

标签: audio ffmpeg pipeline sox

我正在尝试将midi文件转换为ogg或mp3。最终这将发生在Linux网络服务器上,但目前我正在使用Windows 7机器。我使用胆怯将midi转换为wav,然后使用sox或ffmpeg将wav转换为ogg / mp3。

当我使用中间文件时,该过程正常(在下面的第一行,timidity创建file.wav)

timidity.exe file.mid -Ow
sox.exe file.wav file.ogg

但是,当我尝试将胆怯输出传递到sox(如下所示)时,生成的文件ogg可怕地失真

 timidity.exe file.mid -Ow -o - | sox.exe -t wav - file.ogg

我收到警告

 sox.exe WARN wav: Premature EOF on .wav input file

当我用ffmpeg(以及相应的命令行选项)替换sox时,或者当我用mp3替换ogg作为输出格式时,我也会遇到相同的失真问题。

那么我做错了什么?

谢谢,

克里斯

1 个答案:

答案 0 :(得分:2)

关于警告本身,你没有做错任何事。您可能还会看到胆怯的警告,其内容类似于

Warning: -: Illegal seek: Can't make valid header

在胆怯手册页中解释了发生了什么:

  

如果输出定向到不可搜索的文件,或者在关闭文件之前TiMidity ++被中断,则文件头将在RIFF和数据块长度字段中包含0xffffffff。

请注意,RIFF是通常由其文件扩展名.wav调用的编码格式。当胆怯写入RIFF文件时,它不知道文件的长度,因此它会在标题中写入一些占位符垃圾并继续写入数据。当它完成数据时,它知道文件的长度,因此它返回到文件的开头并在标题中写入垃圾。当你写一个管道时,它无法返回并重写任何东西:下游程序必须处理占位符垃圾。同样来自胆怯手册页:

  

流行的声音转换实用程序sox能够读取这些格式错误的文件,因此您可以直接将数据传输到sox,以便即时转换为其他格式。

因此,你提到的消息。 Sox告诉你,厨师准备了错误的文件但是SOX很快就吃了,因为SOX不是很好吃。 Sox显然是被动攻击性的。谁知道?

您可以忽略这些警告消息,因为现在他们正在告诉您已经知道的事情。或者,您可以使用原始格式并明确告诉他们如何在彼此之间良好地发挥作用:

timidity file.midi -Or1Ssl -s44.1 -o- | sox -t raw -b 16 -e signed -r 44.1k -c 2 - file.ogg

对于失真,可能部分是由Windows系统上音频库中的怪癖引起的。我注意到问题中的管道,没有.exe扩展,产生的输出在linux系统上没有明显的失真。在管道中使用定义明确的原始格式也可能有助于解决这个问题。

请注意,对于Ogg输出,您现在可以直接从胆怯中获取:

timidity file.midi -o file.ogg -Ov