从 Qt QMediaPlayer 获取流数据

Posted

技术标签:

【中文标题】从 Qt QMediaPlayer 获取流数据【英文标题】:Get stream data from Qt QMediaPlayer 【发布时间】:2014-05-19 11:58:19 【问题描述】:

我使用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信号并在第一时间将其放入setMedia,回复有内容可读取。但是QMediaPlayer返回QMediaPlayer::ResourceError错误。

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

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

我找到了我的代码不起作用的原因。 setMedia 函数调用 DirectShowPlayerService::load inertal。 并且有这样的线路检查:

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

isSequential() 有文档:

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

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

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

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

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

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

貌似QMediaPlayer是基于GStreamer的,源码的评论里有下载数据的方法。但是我没用过GStreamer,所以很难使用下载功能与 Qt。

我发现的唯一有用信息是:QMediaPlayer API for download the playing stream 。但我不知道该怎么做。请帮帮我!

【问题讨论】:

【参考方案1】:

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

pReply = mgr.get(request);

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

别忘了,当你初始化你的QMediaPlayer时,你应该使用QMediaPlayer::StreamPlayback

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

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

Link

【讨论】:

我想下载缓冲的音乐,下载后不播放。所以完成的信号可能不是我找到的。而且这个错误对我的版本没有影响——5.2。如果我只是将 url 传递给它,它就完美了。 QMediaPlayer::StreamPlayback 标志将很有用。我会试试的。

以上是关于从 Qt QMediaPlayer 获取流数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt5 中使用 QMediaPlayer 播放流时使用代理? [复制]

Qt 之QMediaPlayer类详解

Qt 之QMediaPlayer类详解

使用 Qt 流式传输

如何从 QT 中的 RTSP 流中解析 ONVIF 元数据?

如何在 Qt (QMediaPlayer) 上上传 Mp3 文件?