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幅を使用する必要があるのかということです。そして、他の解像度でこのマジックナンバーを見つける方法。