

スマートフォンには通信制限というものがあってこの通信制限にひっかかるとサーバーからの画像の転送が著しく遅くなり、体感速度がかなり悪くなってしまいます。

そこで、サーバー側でスマートフォンとの通信速度（スマートフォン側からみたダウンロード速度）を測定して、基準値（例えば通信速度が100kbs以下）の場合は荒い画像を送信するなどして体感速度を上げたいと思っています。

サーバー側でスマートフォンとの通信速度を知ることができれば可能なのですが  
そもそもサーバー側でスマートフォンとの通信速度を知ることは可能なんでしょうか？

調べた感じでは `ping` コマンド `-s` オプションなどで送信するパケットサイズを調整することが可能であったり、
スマートフォン側からサーバー側のサイズの大きいダミーファイルをダウンロードさせて通信速度を調べるなどが考えられますが、ユーザーにサイズの大きいファイルをダウンロードさせると通信料を余計に消費させることにもなりかねず、なるべく通信料を抑えた方法でユーザーのスマートフォン側の通信速度を調べることはできませんか？


CC BY-SA 3.0
2016-03-06T21:32:18.777
22869
2020-04-25T18:23:46.457
2016-03-07T10:23:31.970
5505
5505
question
network
通信先のスマートフォンが通信制限がかかっているか判断するには？　通信制限時には荒い画像を送信して体感速度を上げたい


画像のロード完了時間で切り替えてみては？  
例えば、3秒以内でロード完了のコールバックを受け取るか否かで判断するみたいな..


CC BY-SA 3.0
2016-03-07T06:42:32.183
22880
2016-03-07T06:42:32.183
14679
22869
answer


自己回答です

クライアントの帯域幅でサーバーから送信するデータのサイズを調整することはYouTubeなどの動画サイトではすでに行われているようです。通信中の帯域幅を監視することで適切なデータのサイズがわかるはずです。

YouTubeにはクライアントの帯域幅で動画の画質が自動で切り替わるという機能が全世界のユーザーに無料で提供されており、YouTubeの動画のようにクライアントの帯域幅を通信中はクライアントからのレスポンスとして返して帯域幅を動的にサーバーに伝え続けるということでユーザーに狭い帯域幅でデータを送信する手段となりそうです。

> YouTube ではできるだけ快適な環境で動画をご覧いただくため、動画の画質が接続速度（帯域幅）に応じて標準解像度（240p や  
>  360p）から高解像度（720p や 1080p）まで調整されます。動画をご覧になるときに画質が変わることがあるのは、このためです。
>
> 出典 | <https://support.google.com/youtube/answer/91449?hl=ja>


CC BY-SA 3.0
2016-03-11T15:50:05.710
23030
2016-03-11T15:50:05.710
5505
22869
answer


静止画の質問だと思ったので回答しませんでしたが、動画であれば次のようになっています。仕組みは幾つかあるのですがAppleが提唱して標準化されたHTTP
Live Stream (HLS)方式について書きます。

プレーヤは動画を再生する前にマニフェストファイル(例:.m3u8の拡張子)を読み込みます。このファイルには、動画のビットレート、エンコード方式、画面のサイズなどの組み合わせで決定される複数のURLが含まれています。通常ビットレートで高中低の3つくらいを含めます。

[code]

    #EXTM3U 
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000,CODECS="vp8,vorbis",RESOLUTION=240x135
    http://example.com/low.m3u8 
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000,CODECS="vp8,vorbis",RESOLUTION=640x360
    http://example.com/mid.m3u8 
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000,CODECS="vp8,vorbis",RESOLUTION=1280x720
    http://example.com/hi.m3u8
    
[/code]

そのURLに従って次のマニフェストファイル(拡張子.m3u8)を読み込みます。このファイルには動画をぶつ切りにしたセグメントファイル(例:.tsとか、下の例では.webmの拡張子)のURLが複数入っています。

[code]

    #EXTM3U
    #EXT-X-MEDIA-SEQUENCE:0
    #EXT-X-TARGETDURATION:10
    #EXTINF:10,
    http://media.example.com/segment1.webm
    #EXTINF:10,
    http://media.example.com/segment2.webm
    #EXTINF:10,
    http://media.example.com/segment3.webm
    #EXT-X-ENDLIST
    
[/code]

１つのセグメントはキーフレーム（画面全体の画像）が先頭に入っていて、あとは差分が続き、適宜キーフレームが挿入されています。これでどのファイルから再生してもOKだし、シークも素早くできるわけです。

プレーヤーはあるセグメントを再生中にそれに続くセグメントを次々と読み込みます。もしダウンロードスピードが再生に追いつかない場合は、最初のマニフェストに出てきたより低いビットレートのファイル群に切り替えます。

従ってサーバー側ではクライアント側の通信状況を知る必要はなく、ビットレートの変更はすべてクライアント側で行っています。一般に動画サイトもライブストリーミングもCDNを使って配信しますが、CDNはファイルのコピーを提供するだけなので、そもそもクライアントの状態を知ることはできません。（厳密に言えばCDNアクセスログをリアルタイムで解析して配信品質の監視は行っていますが、個別のプレーヤーのビットレート制御のためではありません）


CC BY-SA 4.0
2016-03-12T00:38:49.480
23037
2020-04-25T18:23:46.457
2020-04-25T18:23:46.457
7837
7837
22869
answer