在 Qt 和 C++ 中改变 mp3 速度 [QMediaPlayer]

Posted

技术标签:

【中文标题】在 Qt 和 C++ 中改变 mp3 速度 [QMediaPlayer]【英文标题】:Changin mp3 speed in Qt and C++ [QMediaPlayer] 【发布时间】:2015-10-12 18:42:09 【问题描述】:

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

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

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

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

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

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

提前致谢!

【问题讨论】:

【参考方案1】:

截至目前(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

【讨论】:

以上是关于在 Qt 和 C++ 中改变 mp3 速度 [QMediaPlayer]的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中呈现 Qm 问题

在编译c++代码时出现如下错误: 望速度解答,很急。。谢谢!

在 translations.qrc 文件中读取翻译器文件 .ts/.qm

如何修改Qt标准对话框的文字

如何评价QML?

Qt WindowMaximize 不改变几何(C++)