1

以前はQMediaPlayerオンライン mp3 を再生していましたが、バッファが完了したら mp3 データ全体をダウンロードしたいと考えています。しかし、それに関連する唯一の機能はsetMedia(const QMediaContent & media, QIODevice * stream = 0).

また、ストリーム ポインタを使用してデータを挿入します。だから私QReplyはその引数として使用しようとします.そしてそれは絶対に失敗します.

QNetworkRequest request;
request.setUrl((QUrl(source)));
pReply = mgr.get(request);
setMedia(QUrl(),pReply);

mgrQNetworkAccessManager で、source は mp3 のオンライン URL です。

私の質問は: 音楽データを取得する方法はありますか? setMediaできますか?

- - - - - - - - - - - - - アップデート - - - - - - - -

私は返信の信号を接続し、返信に何か読むものがある最初の時間readReadyにそれを入れますが、エラーを返します。setMediaQMediaPlayerQMediaPlayer::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。私を助けてください!

4

1 に答える 1