2

我正在尝试开发一个小应用程序,您可以在其中加载 mp3 文件并以可变速度播放它!(我知道它已经存在:-))

我正在使用 Qt 和 C++。我已经有了基本的播放器,但我对速率问题感到困惑,因为我想在不停止播放的情况下平滑地更改速率(就像在 Mixxx 中一样)!如果我更改值并在声音中产生间隙,QMediaPlayer 总是会停止。我也不希望音调改变!

我已经找到了一个叫做“SoundTouch”的东西,但现在我完全不知道如何处理它,如何处理我的 mp3 数据以及如何将它传送给播放器!“SoundTouch”库能够做我想做的事,我是从主页上的示例中得到的。

  • 如何导入 mp3 文件,以便使用 SoundTouch 功能对其进行处理
  • 如何播放 SoundTouch 功能的输出?(也许 QMediaPlayer 可以完成这项工作?)
  • 这些东西是如何现场完成的?我猜我必须做某种流?所以我可以在播放过程中改变速度并继续播放而没有间隙。在我的脑海中,它必须是位于数据和播放器之间的东西,所有数据都必须实时通过,后面有一个小缓冲区(20-50 毫秒左右),以避免在处理未来数据时出现间隙。

任何帮助表示赞赏!只要我可以继续使用 Qt/C++,我也愿意接受任何其他解决方案,然后是“SoundTouch”!

(第二件事:我想查看波形概览以及移动其中的一部分(围绕歌曲的实际位置),因此我还可以使用有关如何获取波形数据的提示)

提前致谢!

4

1 回答 1

2

截至目前(Qt 5.5),仅使用 QMediaPlayer 是不可能的。您需要执行以下操作:

  • 使用 GStreamer、FFMpeg 或(新)QAudioDecoder 解码音频:http://doc.qt.io/qt-5/qaudiodecoder.html -这将为您提供原始 PCM 流;

  • 将 SoundTouch 或其他一些库应用于此原始数据以更改音高。如果 GPL 可以,请查看http://nsound.sourceforge.net/examples/index.html,如果您开发专有的东西,STK 可能是更好的选择:https ://ccrma.stanford.edu/software/ stk/

  • 使用 QAudioOutput 将修改后的数据输出到音频设备。

该策略尽可能多地使用 Qt,并为您带来最佳的平台覆盖率(尽管由于它不支持 QAudioOutput,您仍然会失去 Android)

于 2016-01-09T07:58:44.570 回答