需要 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?

无法从其他线程播放 QMediaPlayer

哪些视频文件可以在 Android 上播放 QMediaPlayer?

QMediaPlayer 在 Ubuntu 16.04 / Qt 5.6 上不播放任何内容