【发布时间】:2013-08-18 08:18:07
【问题描述】:
我正在我的 android 设备上捕获帧缓冲区,但解码无法以正确的分辨率工作。
我发现我可以使用以下方法获取 bbp 和屏幕分辨率:
ioctl -rl 28 /dev/graphics/fb0 17920
此命令返回:
返回缓冲区: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
我有小端格式:
- 最后四个字节 (20) 是 bbp 的数量32。
- 前四个字节是屏幕宽度 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
还有这两张图片:
我的原始文件有 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 宽度。以及如何为其他分辨率发现这个神奇的数字。
【问题讨论】:
-
我在我的 LG400 (Android 2.3.6) 上发现了同样的问题。奇怪的是监控工具(android-sdk/tools/monitor)截取了一个很好的 256px 宽的屏幕截图。所以我猜这个监控工具知道如何确定真正的帧缓冲区宽度,但我还没有找到。
标签: android ffmpeg framebuffer