【发布时间】:2017-06-29 07:50:36
【问题描述】:
案例 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)
文档:
void 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 播放加载到内存中的声音以避免此问题?
【问题讨论】:
标签: c++ qt qmediaplayer