2014-05-19 22 views
1

我使用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。但我不知道如何讓自己的方式。請幫幫我!

回答

0

如果你想下載的媒體播放後,你不能做到這一點的:

pReply = mgr.get(request); 

使用「完成」信號QNetworkAccessManager。 無效QNetworkAccessManager::finished (QNetworkReply * reply)

不要忘了,當你初始化你QMediaPlayer,你應該使用QMediaPlayer::StreamPlayback

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

,我發現這一點,也許你有一個bug與你的Qt版本:

Link

+0

我想下載緩衝的音樂不下載後下載。所以完成的信號可能不是我找到的。並且該錯誤不影響我的版本 - 5.2。如果我只是傳遞網址,它會發揮完美。而'QMediaPlayer :: StreamPlayback'標誌將會很有用。我會嘗試。 – zzy

+0

最後,你的建議沒有奏效。 – zzy