5

Androidデバイスでフレームバッファをキャプチャしていますが、正しい解像度でデコードが機能していません。

次を使用してbbpと画面の解像度を取得できることがわかりました。

ioctl -rl 28 /dev/graphics/fb0 17920

このコマンドは次を返します:

return buf:f0 00 00 00 40 01 00 00 f0 00 00 00 80 02 00 00 00 00 00 00 00 00 00 00 20 00 00 00

リトルエンディアン形式では、次のようになります。

  • 最後の4バイト(20)は、bbp32の数です
  • 最初の4バイトは画面幅0xF0= 240
  • バイト5〜8は、画面の高さ0x0140 = 320

次のコマンドを使用してfb(Galaxy 5)をデコードしようとしました:

./ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 240x320 -i fb0 -f image2 -vcodec png image%d.png

そして、私はこの警告を受けました:

無効なバッファサイズ、パケットサイズ40960 <予想される長さ307200ストリーム#0:0のデコード中にエラーが発生しました:引数が無効です

そしてこの2つの画像:

ここに画像の説明を入力してください ここに画像の説明を入力してください

私の生ファイルは655.360バイトですが、次の式を使用すると、正しく期待される値は614.400バイトです。

fileSize = xres * yres * bpp / 8 * numberOfFrames

fileSize = 240 * 320 * 32/8 * 2(androidはダブルフレームバッファーを使用)= 614.400

驚いたことに、ffmpegの幅のサイズを256に変更して655.360バイトに一致させ、機能しました(一種、右側に16の余分なピクセルがあります!次の画像を取得しました:

ここに画像の説明を入力してください ここに画像の説明を入力してください

だから私の質問は、私の画面解像度が240の場合、なぜ256幅を使用する必要があるのか​​ということです。そして、他の解像度でこのマジックナンバーを見つける方法。

4

1 に答える 1

7

線のサイズを計算するには、line_lengthを使用する必要があります。

+-------------------------+----+
|                         |    |
|                         |    | 
|<-------- XRES --------->|    | = Xres is display resolution
|                         |    |
|                         |    |
|<------- LINE LENGTH -------->| = Memory Size per line
|                         |    |
|                         |    |
+-------------------------+----+
                      ^      ^
                      |      |
  display on screen --+      +----> This is stride

右側のパディングは「ストライド」と呼ばれます (ストライド = (ピクセル単位のラインの長さ) - 幅)。ディスプレイの解像度が 8 の倍数でない場合、多くのデバイスはフレームバッファでこのストライドを持っていました。

したがって、式は次のとおりです。

fileSize = line_length * yres * numberOfFrames

line_length はメモリ サイズ (ピクセル サイズではない) であるため、bpp/8 で乗算しないでください。

line_lengthを取得するには、次のようにFBIOGET_VSCREENINFO (0x4600 - 17922) ではなく、FBIOGET_FSCREENINFO (0x4602 - 17922)を使用する必要があります。

ioctl -rl 50 /dev/graphics/fb0 17922

私のGalaxy Nexusは次のように戻ります:

return buf: 6f 6d 61 70 66 62 00 00 00 00 00 00 00 00 00 00 00 00 a0 ac 00 00 00
01 00 00 00 00 00 00 00 00 02 00 00 00 01 00 01 00 00 00 00 00 80 0b 00 00 00 00
                                                               ^_________^

私の Galaxy Nexus には line_length: 2944 (0xb80) があります。

于 2013-08-18T00:12:19.577 に答える