我使用QMediaPlayer
播放在线mp3,我想在缓冲完成时下载整个mp3数据。但唯一与之相关的功能是setMedia(const QMediaContent & media, QIODevice * stream = 0)
。
流指针用于输入数据。所以我尝试使用QReply
作为它的arg.And绝对失败。
QNetworkRequest request;
request.setUrl((QUrl(source)));
pReply = mgr.get(request);
setMedia(QUrl(),pReply);
mgr
是QNetworkAccessManager,source是mp3的在线网址。
我的问题是:有没有办法获取音乐数据? setMedia
能做到吗?
--------------------------更新----------------
我连接了回复的readReady
信号,并在第一次回复有问题时将其放入setMedia
。但是QMediaPlayer
会返回QMediaPlayer::ResourceError
错误。
P.S。我添加了QMediaPlayer::StreamPlayback
标志。
------------------------更新---------------------- ----------------
我发现为什么我的代码不起作用。
setMedia
函数调用DirectShowPlayerService::load
惯性。
并且有这样的行检查:
else if (stream && (!stream->isReadable() || stream->isSequential())) {
m_pendingTasks = 0;
m_graphStatus = InvalidMedia;
m_error = QMediaPlayer::ResourceError;
}
对于isSequential()
,有doc:
bool QIODevice :: isSequential()const [virtual] 如果此设备是顺序的,则返回true;否则返回false。
与随机访问设备相比,顺序设备没有开始,结束,大小或当前位置的概念,并且它们不支持搜索。您只能在报告数据可用时从设备读取数据。 顺序设备最常见的示例是网络套接字。在Unix上,/ dev / zero和fifo管道等特殊文件是顺序的。
另一方面,常规文件支持随机访问。它们具有大小和当前位置,并且还支持在数据流中向后和向前搜索。常规文件是非连续的。
最后,在这种情况下不能使用网络回复。 - (
所以我的进一步研究可能是:Qt如何处理网络套接字。有没有办法获取数据?
------------------更新----------------------
似乎QMediaPlayer
基于GStreamer
,并且有一种方法可以在源代码的评论中下载数据。但我还没有使用{{1}所以我很难在Qt上使用下载功能。
我发现只有有用的信息是:QMediaPlayer API for download the playing stream 。但我不知道如何找到自己的方式。请帮帮我!
答案 0 :(得分:0)
如果您想下载媒体并在之后播放,则无法执行此操作:
pReply = mgr.get(request);
使用"完成" QNetworkAccessManager
的信号。
无效QNetworkAccessManager::finished ( QNetworkReply * reply )
不要忘记,在初始化QMediaPlayer
时,您应该使用QMediaPlayer::StreamPlayback
QMediaPlayer* player = new QMediaPlayer(0, QMediaPlayer::StreamPlayback);
我发现了这个,也许你的Qt版本有一个错误: