動画は何GBになる?|解像度・bpp・fpsとCPU・GPUの計算
動画ファイルは小さいのに、処理中のメモリが大きくなるのはなぜでしょうか。保存時の圧縮量と、処理する画像の大きさは別です。画素数から非圧縮の量を計算し、転送と計算のどこに時間がかかるかを見ていきます。
事例:1280×720の画像を毎秒30枚処理する
カメラ1台が1280×720画素、RGB合計24bpp、30fpsの画像を出力します。画素の間や行末の追加領域がない非圧縮の配置とします。1MB=10⁶B、1GB=10⁹B、1B=8bitです。
CPUの処理は1枚8ms。GPUの計算は1枚2msですが、入力と結果の転送、処理の起動も必要です。GPUを使う方が速いか、必要な時間をすべて足して確かめます。
- 1. 復号・展開
- 2. メモリ上で処理
- 3. GPUへ転送
圧縮ファイルのサイズと、展開後の画素データを区別します。
1枚は何Byte? bppの読み方から確認する
画素数×1画素当たりのbit数÷8で、非圧縮のByte数を求めます。1280×720×24÷8=2,764,800B、つまり2.7648MBです。24bppはRGB各成分の合計であり、さらに3倍する必要はありません。
- 解像度
横と縦の画素数です。両方を2倍にすると、画素数と同じ形式での容量は4倍になります。
- bpp
bits per pixel。1画素を表すbit数です。色成分ごとのbit数が示されている場合は、合計を確認します。
- fps
frames per second。毎秒の画像枚数です。1枚の量に掛けると毎秒のデータ量になります。
RGBのほかにアルファ値を持つ32bppなら、1枚は1280×720×32÷8=3,686,400Bです。色の深さ、色差の間引き、配置の余白など、実際の形式が異なれば式の前提も変わります。
対象 | 式 | 結果 |
|---|---|---|
1枚・24bpp | 1280×720×24÷8 | 2.7648MB |
毎秒30枚 | 2.7648×30 | 82.944MB/s |
必要帯域 | 82.944×8 | 663.552Mbps |
60秒の量 | 82.944×60÷1000 | 4.97664GB |
保存の容量と、回線の速さを混ぜていない?
60秒で約4.98GBという値は量です。毎秒663.552Mbpsという値は速さです。GBとGbps、MB/sとMbpsを区別してから比較します。MiB・GiBの指定なら1024を基準に換算し、10進の単位と混ぜません。
4台なら非圧縮の帯域は663.552×4=2,654.208Mbps=2.654208Gbpsです。1Gbps回線には入りません。プロトコルのヘッダ、再送、同時に使う他の通信を加えると必要量は増えます。
圧縮動画のビットレートが示されていれば、保存・通信はその値で計算します。一方、復号後の画像バッファは非圧縮の形式で見積もります。圧縮率は内容や方式で変わるため、常に一定とは置けません。
GPUの2msだけを比べると、何を見落とす?
入力転送の実効速度を400MB/sとします。入力は2.7648MBなので、転送は2.7648÷400×1000=6.912msです。出力0.1MBの転送は0.25ms、起動などの追加時間は0.8msとします。
処理を直列に行うなら、GPU側の合計は6.912+2+0.25+0.8=9.962msです。CPUの8msより遅くなります。GPU内のメモリ速度と、CPUからGPUへの転送速度を混同しないことが大切です。
この事例は直列処理です。重ね合わせる構成では別の測定が必要です。
転送が4000MB/sなら、0.6912+2+0.025+0.8=3.5162msとなり、同じ前提ではGPUが速くなります。転送量、データの置き場所、処理のまとめ方によって結果が変わるため、名前だけで選びません。
30fpsなら、毎回33.3ms以内で済めばよい?
30fpsの画像は約33.3msごとに到着します。同じ処理を1枚ずつ直列で続けるなら、平均の処理がこれを超えると滞留します。ただし、1枚の許容遅延が10msなら、33.3ms以内でも要求を満たしません。
処理量と、1枚が完了するまでの時間は別です。複数枚をまとめると転送・起動の負担は減らせますが、まとまるまでの待ちが増えます。転送と計算を重ねるには、対応する機器と処理の独立性が必要です。
メモリには入力だけでなく出力、一時領域、処理中の複数枚も置きます。容量、転送、演算を別々に確認し、画質、応答時間、同時カメラ数の要求を満たす構成を選びます。
小さな関数で、単位の変換を固定する
def raw_frame_bytes(width, height, bpp):
values = (width, height, bpp)
if any(type(v) is not int or v <= 0 for v in values):
raise ValueError("positive integers required")
if bpp % 8 != 0:
raise ValueError("byte-aligned pixels required")
return width * height * (bpp // 8)
frame = raw_frame_bytes(1280, 720, 24)
print(frame) # 2764800この関数は画素単位でByte境界にそろう形式に限定します。1bit画像や行末の余白を持つ画像には、その配置に合う別の計算が必要です。入力の形式を明示すると、式を使える範囲が分かります。
演習1:1枚の容量
条件:1280×720画素、RGB合計24bpp、余白なしです。
問い:1枚のByte数を答えてください。
解答例:2,764,800Bです。
根拠:1280×720×24÷8です。
誤答の理由:24をByte数として掛けると8倍になり、RGBをさらに3倍すると色成分を二重に数えます。
演習2:4台分の帯域
条件:上の画像を各カメラが30fpsで出し、カメラは4台です。
問い:非圧縮の必要帯域をGbpsで答えてください。
解答例:2.654208Gbpsです。
根拠:2.7648×30×8×4÷1000です。
誤答の理由:台数を掛け忘れると、回線の見積りが1台分になります。
演習3:60秒を保存する
条件:1台の非圧縮画像が毎秒82.944MBです。
問い:60秒分の容量をGBで答えてください。
解答例:4.97664GBです。
根拠:82.944×60=4,976.64MBを1000で割ります。
誤答の理由:1024で割ってGBと書くと、単位の定義が式と一致しません。
演習4:32bppへ変える
条件:解像度とfpsは同じで、24bppから32bppへ変えます。
問い:1枚の容量と毎秒の量を答えてください。
解答例:3.6864MB、110.592MB/sです。
根拠:1枚の量は24bppのときの32/24倍で、毎秒30枚です。
誤答の理由:画素数が変わらないから容量も同じという判断は、画素の表現量を見落とします。
演習5:GPUの実時間
条件:入力6.912ms、計算2ms、出力0.25ms、起動0.8msを直列に行います。CPUは8msです。
問い:どちらが速いですか。
解答例:GPUは9.962msで、CPUの方が1.962ms速いです。
根拠:直列の時間をすべて足して比較します。
誤答の理由:計算時間だけを比べると、転送にかかる時間が抜けます。
演習6:解像度と圧縮
条件:縦横をそれぞれ2倍にし、bppとfpsは同じです。
問い:非圧縮量と、圧縮後の量の変化を説明してください。
解答例:非圧縮量は4倍。圧縮後の量は同じ比率とは限らず、方式や画像内容の条件が必要です。
根拠:画素数は2×2倍ですが、圧縮率は別の条件です。
誤答の理由:解像度の一方しか掛けないと2倍になり、圧縮率を固定すると根拠のない推定になります。
出典と仕様を確認する
NVIDIA:CUDA Best Practices Guide
関連テーマを続けて学ぶ
次におすすめの学習
編集・検証について
編集・検証:IT資格ラボ編集部
IPAが公開する試験要綱・シラバス・過去問題と、各技術の公式資料を優先して内容を確認しています。制度変更や誤りを確認した場合は、記事を見直して更新します。
編集方針・情報源・訂正方針を見る