1

QMediaPlayer用来播放在线 mp3,我想在缓冲区完成后下载整个 mp3 数据。但与它相关的唯一功能是setMedia(const QMediaContent & media, QIODevice * stream = 0).

流指针用于放入数据。所以我尝试使用QReply它作为它的参数。它绝对失败了。

QNetworkRequest request;
request.setUrl((QUrl(source)));
pReply = mgr.get(request);
setMedia(QUrl(),pReply);

mgr是 QNetworkAccessManager,source 是 mp3 的在线 url 。

我的问题是:有没有办法获取音乐数据?是setMedia可以做到的吗?

- - - - - - - - - - - - - 更新 - - - - - - - -

我连接了回复的信号,并在第一时间readReady将其放入该回复有一些要阅读的内容。但返回错误。setMediaQMediaPlayerQMediaPlayer::ResourceError

PS我添加了QMediaPlayer::StreamPlayback标志。

- - - - - - - - - - - - 更新 - - - - - - - - - - - - - -------------

我找到了为什么我的代码不起作用。setMedia函数调用DirectShowPlayerService::load惯性。并且有这样的线路检查:

else if (stream && (!stream->isReadable() || stream->isSequential())) {
    m_pendingTasks = 0;
    m_graphStatus = InvalidMedia;
    m_error = QMediaPlayer::ResourceError;
}

因为isSequential()有文档:

bool QIODevice::isSequential() const [virtual] 如果此设备是连续的,则返回 true;否则返回假。

与随机访问设备相反,顺序设备没有开始、结束、大小或当前位置的概念,也不支持查找。只有当设备报告数据可用时,您才能从设备中读取。顺序设备最常见的例子是网络套接字。在 Unix 上,诸如 /dev/zero 和 fifo 管道之类的特殊文件是连续的。

另一方面,常规文件确实支持随机访问。它们既有大小又有当前位置,还支持在数据流中向后和向前搜索。常规文件是不连续的。

最后,网络回复不能在这种情况下使用。:-(</p>

所以我的进一步研究可能是: Qt 如何处理网络套接字。有什么方法可以获取数据吗?

- - - - - - - - - 更新 - - - - - - - - - - -

好像QMediaPlayer是基于GStreamer并且有办法下载源代码的注释中的数据。但是我没有使用过GStreamer,所以我很难使用Qt的下载功能。

我发现的唯一有用的信息是:QMediaPlayer API 用于下载播放流。但我不知道该怎么做。请帮我!

4

1 回答 1

0

如果你想下载你的媒体并播放,你不能这样做:

pReply = mgr.get(request);

使用 的“完成”信号QNetworkAccessManager。空白QNetworkAccessManager::finished ( QNetworkReply * reply )

不要忘记,当你初始化你的QMediaPlayer,你应该使用QMediaPlayer::StreamPlayback

QMediaPlayer* player = new QMediaPlayer(0, QMediaPlayer::StreamPlayback);

我发现了这个,也许你的 Qt 版本有一个错误:

关联

于 2014-05-19T13:00:19.123 回答