Camera.PreviewCallback
public void onPreviewFrame(byte[] data, Camera camera)
之前由于Camera的preview format只支持:
PixelFormat.YCbCr_420_SP ---> instead ImageFormat.NV21这种图片格式(使用
int format = parameters.getPreviewFormat();
Log.d(TAG, "preview format:"+format);
查看)
使得BitmapFactory.decodeByteArray一直解码不出图片,网上找了半天,后来终于找到了转码的方法,sdk2.2及以上的系统提供了转换接口,yuvimage类的compressToJpeg函数。
使用了它以后,前置摄像头preview的数据可以画在canvas上了,而且和surfaceView里预览的摄像头画面一致,但是把它换成了后置摄像头,canvas画图的花屏图片,出现了花屏现象一般就是使用了preview不支持的size,我跟踪代码,看了看代码:
List<Size> pszize = parameters.getSupportedPreviewSizes();
if (null != pszize && 0 < pszize.size()) {
int height[] = new int[pszize.size()];// 声明一个数组
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < pszize.size(); i++) {
Size size = (Size) pszize.get(i);
int sizeheight = size.height;
int sizewidth = size.width;
height[i] = sizeheight;
map.put(sizeheight, sizewidth);
// Log.d(TAG, "size.width:"+sizewidth+"\tsize.height:"+sizeheight);
}
Arrays.sort(height);
// 设置
// parameters.setPictureSize(map.get(height[0]),height[0]);
parameters.setPreviewSize(map.get(height[1]),height[1]);
}
我是使用摄像头支持的preview size啊,就这样找不出原因。
后来过了两天,我从网上闲逛,看了别人的代码,和这个无关,突发奇想:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
//在视频聊天中,这里传送本地frame数据给remote端
// Log.d(TAG, "camera:"+camera);
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize().height;
...............................
}
远端视频数据也就正确的画出来了。拖了几天的问题,╮(╯▽╰)╭。有哪位大神知道原因,请指导哈