我使用QMediaPlayer
播放在線mp3,我想在緩衝區完成時下載整個mp3數據。但唯一的功能是setMedia(const QMediaContent & media, QIODevice * stream = 0)
。從Qt獲取流數據QMediaPlayer
而流指針用於放入數據。所以我嘗試使用QReply
作爲它的參數,並且絕對失敗。
QNetworkRequest request;
request.setUrl((QUrl(source)));
pReply = mgr.get(request);
setMedia(QUrl(),pReply);
mgr
是QNetworkAccessManager,source是mp3的在線地址。
我的問題是:有什麼方法可以獲取音樂數據? setMedia
可以做到嗎?
-------------------------- Update ----------------
我連接回復的readReady
信號,並在第一時間把它寫入setMedia
,答覆有東西要讀。但QMediaPlayer
返回QMediaPlayer::ResourceError
錯誤。
P.S.我添加了QMediaPlayer::StreamPlayback
標誌。
------------------------ update --------------------- -----------------
我發現爲什麼我的代碼不工作。 setMedia
函數調用DirectShowPlayerService::load
慣性。 而且還有一個線路檢查這樣的:
else if (stream && (!stream->isReadable() || stream->isSequential())) {
m_pendingTasks = 0;
m_graphStatus = InvalidMedia;
m_error = QMediaPlayer::ResourceError;
}
isSequential()
對於有DOC:
布爾QIODevice中:: isSequential()const的[虛] 返回true,如果該設備是連續的;否則返回false。
順序設備,與隨機訪問設備不同,沒有開始,結束,大小或當前位置的概念,並且它們不支持查找。報告數據可用時,您只能從設備讀取數據。 順序設備的最常見示例是網絡套接字。在Unix上,諸如/ dev/zero和fifo管道之類的特殊文件是連續的。
另一方面,普通文件支持隨機訪問。他們既有規模又有現在的位置,他們也支持在數據流中尋找前進和後退。普通文件不是連續的。
最後,在這種情況下網絡回覆無法使用。 :-(
所以我的進一步研究可能是:如何劑量Qt處理與此網絡套接字。有什麼方法可以獲取數據?
------------------更新----------------------
It似乎QMediaPlayer
是基於GStreamer
,並有一種方法來下載源代碼的評論中的數據。但我沒有使用GStreamer
,所以我很難用Qt的下載功能。
而我發現的唯一有用的信息是:QMediaPlayer API for download the playing stream。但我不知道如何讓自己的方式。請幫幫我!
我想下載緩衝的音樂不下載後下載。所以完成的信號可能不是我找到的。並且該錯誤不影響我的版本 - 5.2。如果我只是傳遞網址,它會發揮完美。而'QMediaPlayer :: StreamPlayback'標誌將會很有用。我會嘗試。 – zzy
最後,你的建議沒有奏效。 – zzy