案例 1.我设法用 QMediaPlayer 播放声音,如下所示:
QMediaPlayer* media = new QMediaPlayer();
media->setMedia("sound.mp3");
media->play();
案例2。如果我将声音加载到内存中并像这样播放它,一切都很好:
QFile file("sound.mp3");
file.open(QIODevice::ReadOnly);
QByteArray* arr = new QByteArray(file.readAll());
file.close();
QBuffer* buffer = new QBuffer(arr);
buffer->open(QIODevice::ReadOnly);
buffer->seek(0);
QMediaPlayer* media = new QMediaPlayer();
media->setMedia(QMediaContent(), buffer);
media->play();
问题是当我尝试播放不是真实声音的文件时,例如file.txt
. 在第一种情况下,玩家立即停止。在第二种情况下,玩家保持状态PlayingState
( QMediaPlayer::BufferedMedia
, QMediaPlayer::NoError
)
文档:
无效 QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream = Q_NULLPTR)
设置当前媒体源。
如果提供了流;将从中读取媒体数据,而不是解析媒体源。在这种情况下,媒体源仍可用于解析有关媒体的附加信息,例如 mime 类型。流必须是开放且可读的。
将媒体设置为空 QMediaContent 将导致播放器丢弃与当前媒体源相关的所有信息并停止与该媒体相关的所有 I/O 操作。
因此,如果我使用media->setMedia(QMediaContent(), buffer);
媒体播放器,则由于 QMediaContent 为空,因此媒体播放器将从内存中读取数据而无需附加信息作为 mime 类型。由于缺少 mime 类型,可能 mediaplayer 仍处于 PlayingState,试图播放内存中加载的文本文件。
所以我尝试将有效的 QMediaContent 与加载的数据结合使用......结果相同:媒体播放器保持在 PlayingState 中而没有任何错误。
media->setMedia(QMediaContent(QUrl::fromLocalFile(QFileInfo(s).absoluteFilePath())), buffer);
如何使用 QMediaPlayer 播放加载到内存中的声音以避免此问题?