需要 QMediaPlayer 播放内存中的 mp3 数据
Posted
技术标签:
【中文标题】需要 QMediaPlayer 播放内存中的 mp3 数据【英文标题】:Need QMediaPlayer to play mp3 data in memory 【发布时间】:2015-08-14 10:00:14 【问题描述】:我想许多应用程序都需要小的音频剪辑,因此我希望 QT 支持在内存片中播放 mp3。也许将 mp3 数据解码为内存中的 wav 数据可能是一种解决方案,但这需要时间先解码所有数据。对于实时应用,这不是一个好主意。将 mp3_data 存储在文件中并要求 QMediaPlayer 播放也没有意义,性能无法接受。
这是我在谷歌多次搜索后的代码,包括***:
m_buffer.setBuffer(&mp3_data_in_memory);
m_player.setMedia(QMediaContent(), &m_buffer);
m_player.play();
其中 m_buffer 是一个 QBuffer 实例,而 mp3_data_in_memory 是一个 QByteArray ; m_player 是一个 QMediaPlayer 实例。
我得到一些信息,这里的代码在 MacOS 和 ios 上不起作用,但我现在在 android 上运行。
有人有安卓系统的解决方案吗?非常感谢。
【问题讨论】:
【参考方案1】:您的代码将不起作用,因为 media
属性 requires 是一个有效的 QMediaContent
实例:
将此属性设置为 null QMediaContent 将导致播放器 丢弃与当前媒体源相关的所有信息,并 停止与该媒体相关的所有 I/O 操作。
也没有办法告诉QMediaPlayer
数据的格式,你只是在上面转储原始数据。原则上QMediaResource
可以保存这个信息,但是它需要一个url,没有它就被认为是null。
您可能已经猜到了,QMediaPlayer
和相关的类是高级构造,不是为这类事情设计的。您需要使用QAudioDecoder
来实际解码原始数据,并将输出通过管道传输到QAudioOutput
以听到它。
【讨论】:
非常感谢您的帮助。但是让 QAudioDecoder 在 Android、iOS 和桌面上工作并不走运。我最终选择了mpg123解码输出到QAudioOutput。以上是关于需要 QMediaPlayer 播放内存中的 mp3 数据的主要内容,如果未能解决你的问题,请参考以下文章
解决PyQt5 QMediaPlayer播放mp3后占用的问题
在 Qt 和 C++ 中改变 mp3 速度 [QMediaPlayer]
QMediaPlayer.setPosition 如何适用于 mp3?