以前は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
PSQMediaPlayer::StreamPlayback
フラグを追加しました。
- - - - - - - - - - - - アップデート - - - - - - - - - - - - - -------------
コードが機能しない理由がわかりました。setMedia
関数呼び出しinertal DirectShowPlayerService::load
。そして、次のような行チェックがあります。
else if (stream && (!stream->isReadable() || stream->isSequential())) {
m_pendingTasks = 0;
m_graphStatus = InvalidMedia;
m_error = QMediaPlayer::ResourceError;
}
isSequential()
ドキュメントがあるため:
bool QIODevice::isSequential() const [virtual] このデバイスがシーケンシャルの場合は true を返します。それ以外の場合は false を返します。
シーケンシャル デバイスは、ランダム アクセス デバイスとは対照的に、開始、終了、サイズ、または現在の位置の概念がなく、シークをサポートしていません。データが利用可能であると報告された場合にのみ、デバイスから読み取ることができます。シーケンシャル デバイスの最も一般的な例は、ネットワーク ソケットです。Unix では、/dev/zero や fifo パイプなどの特殊ファイルはシーケンシャルです。
一方、通常のファイルはランダム アクセスをサポートしています。これらにはサイズと現在位置の両方があり、データ ストリーム内での前後のシークもサポートしています。通常のファイルはノンシーケンシャルです。
とうとうネットワークリプライはこの状態では使えません。:-(</p>
したがって、私のさらなる研究は、Qt がネットワーク ソケットをどのように処理するかということです。データを取得する方法はありますか?
- - - - - - - - - アップデート - - - - - - - - - - -
にQMediaPlayer
基づいてGStreamer
いるようで、ソースコードのコメントにデータをダウンロードする方法がありますGStreamer
。
そして、私が見つけた唯一の有用な情報は次のとおりです。再生中のストリームをダウンロードするためのQMediaPlayer API。私を助けてください!