从Qt QMediaPlayer获取流数据

时间:2014-05-19 11:58:20

标签: qt gstreamer qmediaplayer

我使用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 。但我不知道如何找到自己的方式。请帮帮我!

1 个答案:

答案 0 :(得分:0)

如果您想下载媒体并在之后播放,则无法执行此操作:

pReply = mgr.get(request);

使用"完成" QNetworkAccessManager的信号。 无效QNetworkAccessManager::finished ( QNetworkReply * reply )

不要忘记,在初始化QMediaPlayer时,您应该使用QMediaPlayer::StreamPlayback

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

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

Link