- ベストアンサー
HTTPストリーミングによるデータの取得方法
QuickTime のようなHTTPストリーミングを行うアプリの開発を検討しております。 おそらく、MFCのWinInetクラスを使って実装可能と思うのですが、QucikTimeは、サーバからダウンロードしたデータを取得しながら再生していますが、同様にデータを一括取得ではなく、取得しながら逐次的にデータを処理するようなしくみを実現する方法について、ご教示いただければと思います。もしありましたら、サンプルプログラムをお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> (1) UINT nRead = pFile->Read(szBuff, 1023) > は、ダウンロードが完了しなくても1023バイト受信したら、即時データが読み込めるということでよろしいでしょうか。 その通りです。再掲になりますが、TCP/IPの通信には「ダウンロードが完了」なんて概念はありません。 サーバー側から送られてきたデータを、その場ですぐに順次受け取っていくことしか出来ないのです。 (逆に「ダウンロードが完了してからデータを全部受け取る」方が面倒なぐらい) > (2) //read file... > の部分は、 > nRead = pFile->Read(szBuff, 1023); > と置き換えればいいでしょうか。 そうです。それと、受け取ったデータの処理を、Read後に書く必要があります。
その他の回答 (1)
- mtaka2
- ベストアンサー率73% (867/1179)
TCP/IPの「通信プログラム」としては、ダウンロードもストリーミング再生も違いはありません。 TCP/IPでの通信では、送信側で送ったデータが 受信側にいきなり全て現れるのではなく、 細切れにされたデータが次々と届くようになってます。 例えば、 http://msdn.microsoft.com/ja-jp/library/sb35xf67(VS.80).aspx に、WinInet のサンプルプログラムがありますが、 そのプログラムでは、最大1023バイトの受信を繰り返すようになってます。 そうやって受け取ったデータの取り扱い方法で、 ・ダウンロード: 受け取ったら逐次ファイルに追記保存していく ・ストリーミング: 受け取ったら逐次表示していく といった違いは出てくるのですが、受信手順は変わりません。。
補足
早速のご回答ありがとうございます。 提示いただいたサンプルプログラムの、 UINT nRead = pFile->Read(szBuff, 1023); while (nRead > 0) { //read file... } で確認させていただきたいのですが、 (1) UINT nRead = pFile->Read(szBuff, 1023) は、ダウンロードが完了しなくても1023バイト受信したら、即時データが読み込めるということでよろしいでしょうか。 (2) //read file... の部分は、 nRead = pFile->Read(szBuff, 1023); と置き換えればいいでしょうか。
お礼
とても参考になりました。ありがとうございました。