Gui*_*tro 5 android ffmpeg framebuffer
我正在我的Android设备上捕获帧缓冲,但解码不能正确解析.
我发现我可以使用以下方式获得bbp和屏幕资源:
ioctl -rl 28 /dev/graphics/fb0 17920
Run Code Online (Sandbox Code Playgroud)
此命令返回:
返回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 00 00 00 00
我用little-endian格式:
我尝试使用以下命令解码fb(Galaxy 5):
./ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 240x320 -i fb0 -f image2 -vcodec png image%d.png
Run Code Online (Sandbox Code Playgroud)
我得到了这个警告:
缓冲区大小无效,数据包大小40960 <预期长度307200解码流#0时出错:0:无效参数
这两个图像:

我的原始文件有655.360字节,但正确的值是614.400字节,使用以下公式:
fileSize = xres*yres*bpp/8*numberOfFrames
fileSize = 240*320*32/8*2(android使用双帧缓冲区)= 614.400
令我惊讶的是,我将ffmpeg上的宽度大小更改为256以匹配655.360字节并且工作(有一种,右侧有16个额外的pxs!我得到了以下图像:

所以我的问题是为什么我必须使用256宽度,如果我的屏幕分辨率是240.如何发现这个神奇的数字为其他分辨率.
您应该使用line_length来计算线的大小.
+-------------------------+----+
| | |
| | |
|<-------- XRES --------->| | = Xres is display resolution
| | |
| | |
|<------- LINE LENGTH -------->| = Memory Size per line
| | |
| | |
+-------------------------+----+
^ ^
| |
display on screen --+ +----> This is stride
Run Code Online (Sandbox Code Playgroud)
右边的填充称为"stride"(stride =(line_length in pixel) - width).如果显示分辨率不是8的倍数,许多设备在帧缓冲区中有这个步幅.
所以公式是:
fileSize = line_length*yres*numberOfFrames
不要将它与bpp/8相乘,因为line_length是内存大小(不是像素大小).
以检索的line_length你应该使用FBIOGET_FSCREENINFO(0x4602 - 17922),而不是FBIOGET_VSCREENINFO(0x4600 - 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
^_________^
Run Code Online (Sandbox Code Playgroud)
我的Galaxy Nexus有line_length:2944(0xb80).
| 归档时间: |
|
| 查看次数: |
2773 次 |
| 最近记录: |