在某些手机中获取到的视频frame数据(原始数据RGBX,使用minicap 获取安卓视频流),转yuv/h264播放时会花屏。
使用HexFiend(mac下)软件查看RBGX二进制原始文件,发现一段数据后会出现一段00000000的数据(192字节,不同手机可能不一样),将此数据删除后再转视频流,播放是正常的。
研究jpg的源码,发现原来是显卡和CPU的内存对齐长度不一致导致的,竖屏的时候,显卡的frame从720对齐到768,所以就出现48*4=192字节的00000000,192不是固定值,跟分辨率有关的,显卡为了加速运算,自动扩充到他的对齐规则。
修改minicap:
struct Frame stride,根据其来操作
SY_Rgb32ToI420((unsigned char*)frame->data, frame->width, frame->height, frame->stride, m_yuvBuf)
Rgb32ToI420的时候pos计算修改如下 跳过无效内容
curPos = (row * stride + col) * bpp;
网友评论