ストリーミングってなんだろう
RustでTCPサーバーを書いているときに,自分がストリーミングとバッファというものをしっかりとわかっていないことに気づいてしまいました。
なので,ストリーミングについてしっかりと理解しようと思います。
間違っているところがあったら教えてもらえると嬉しいです。
ダウンロードとストリーミングの違い
動画などを再生する際に,データをダウンロードしてから再生する方法と,ストリーミングでデータを受け取りながら再生する方法があります。
ダウンロード
データを一度PCにダウンロードしてから動画を再生します。
一度PCの内部ストレージに動画を保存して,保存した動画を再生する方式です。保存してから再生を行うので,動画をダウンロードしきるまでは再生することができません。一旦ダウンロードしてしまえば,保存されたデータが削除されない限りはオフラインでも動画を再生することができます。
ストリーミング
データを少しずつ受け取りながら動画を再生していきます。
内部ストレージにデータを保存せず,バッファと呼ばれる領域にデータを少し読み込んではそのデータを再生します。
このストリーミングについて詳しく書いていきます。
バッファとは
バッファ(buffer)というのは,緩衝器という意味を持ち,ストリームのデータを一時的にメモリに保管しておくときに使います。
なので,バッファというのは要するにメモリのことです。
このバッファに保管されている値を読み込むことをRead,それに対してバッファに値を書き込むことをWriteと言い,プログラムでバッファを用いる時によく出てきます。
動画を再生する際は,まず再生ボタンが押されたときに,サーバーからクライアントのバッファにデータが読み込まれます。
バッファがいっぱいになるまでデータが溜まったら再生が始まります。
そして,バッファに溜まった動画データを読み込んで再生(消費)しながらサーバーからデータをストリームで読み込み,それをバッファに書き込んでいきます。
そして,またバッファが満タンになったら満タンになったデータを動画として再生していきます。
こうすることで,少ない待ち時間で途切れ途切れにならないように動画を再生することができます。このとき,データはパケットと呼ばれる小さいデータのつつみのようなものに格納されて送信されるようになっており,このパケットにはtimestampなどのヘッダ情報などが含まれていたりします。
フラッシュ(flush)とは
バッファを扱っていると,フラッシュ(flush)という言葉をよく見かけます。
バッファは満タンにならないとWriteされないようになっています。なので,ファイルなどからストリームでデータを書き込む際に,バッファが満タンにならないのにWriteの処理しかプログラムに書いていないと,ちゃんとバッファの中身がファイルに書き込まれるかが定かではありません。
ここで,明示的にFlushを行うと,バッファの中身が満タンになっていなくてもファイルにバッファの中身を書き込んでくれます。
このFlushで,中身をちゃんと書き込んでくれることを保証します。
参考リンク
https://dream.jp/mb/tips_m/wifi15.html
http://www.s-cradle.com/developer/sophiaframework/sf_reference/sec.stream.buffer.html
https://xtech.nikkei.com/it/pc/article/NPC/20060810/245616/
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1445&forum=12