关于截取相机的预览帧,有谁成功做过?

vnking 2015-03-19 09:12:47
我在做一个人体侧身拍的项目,一个手机在侧面预览,同时一个手机在正面展示侧身的预览图。需要将侧面相机的预览图截图一帧发到正面展示的手机上。

用到的方法是:



// 【获取视频预览帧的接口】
Camera.PreviewCallback mJpegPreviewCallback = new Camera.PreviewCallback()
{
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// 传递进来的data,默认是YUV420SP的
// TODO Auto-generated method stub
Log.i("DEBUG", "going into onPreviewFrame size = " + data.length + ", height = " + mPreviewHeight + ", width = " + mPreviewWidth + ", busy = " + (mBusy?"yes":"no"));
if( mBusy ) return;
mBusy = true;
byte[] tmp = new byte[data.length];
System.arraycopy(data, 0, tmp, 0, data.length);
Message msg = new Message();
msg.what = 3721;
msg.obj = tmp;
handler.sendMessage(msg);
} // endonPriview
};



截出来的图片贴到一个ImageView上,结果是一团糟。



private void myHandleMessage(Message msg) {
if(msg.what == 3721) {
byte[] data = (byte[]) msg.obj;
try {

final YuvImage image = new YuvImage(data, ImageFormat.NV21, mPreviewWidth, mPreviewHeight, null);
ByteArrayOutputStream os = new ByteArrayOutputStream(data.length);
if(image.compressToJpeg(new Rect(0, 0, mPreviewWidth, mPreviewHeight), 100, os)) {
byte[] tmp = os.toByteArray();
Bitmap bmp = BitmapFactory.decodeByteArray(tmp, 0, tmp.length);
mImageView.setImageBitmap(bmp);
mImageView.bringToFront();
}
mBusy = false;
} catch (Exception e) {
Log.v("System.out", e.toString());
} // endtry

}
}



请高手帮忙诊断一下,问题出现在哪里?
...全文
180 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
vnking 2015-03-20
  • 打赏
  • 举报
回复
引用 5 楼 inquisitive_plus 的回复:
[quote=引用 4 楼 vnking 的回复:] 呵呵,搞好了,跟上述代码没有关系,而是多执行了 mCamera.startPreview(); 一次是打开相机后,执行一次。在设置callback后又执行一次,前一次其实不需要。
晕,隐藏代码……[/quote] 不好意思,简单的地方容易忽略!
windfury_plus 2015-03-19
  • 打赏
  • 举报
回复
引用 2 楼 vnking 的回复:
查看logcat,其实没有显示busy=yes的情况,说明处理图片的速度快过下一次截图。 估计是数据格式的问题,但是没有办法验证它。
以前试过 if( mBusy ) return; mBusy = true; 这逻辑,下面就是用YuvImage image = new YuvImage(data, ImageFormat.NV21, mPreviewWidth, mPreviewHeight, null); 这样的直接生成图片,然后就是一个有点雪花的图片 而用按钮判断,就能得到一个合格的图片(不过由于没任何处理,效果很不好)
vnking 2015-03-19
  • 打赏
  • 举报
回复
引用 1 楼 inquisitive_plus 的回复:
输出下前后的data是否一致 扫了一眼感觉应该没问题,最多图片变形 也可能是

if( mBusy ) return;
        mBusy = true;
如果只取预览开始的第一帧,可能有问题,估计是camera在初始化,图像还不是很清晰 我建议通过按钮来获取某一帧图画 用个标志位,按下按钮就为true,截取一帧后变为false……这样的笨方法,试试
查看logcat,其实没有显示busy=yes的情况,说明处理图片的速度快过下一次截图。 估计是数据格式的问题,但是没有办法验证它。
windfury_plus 2015-03-19
  • 打赏
  • 举报
回复
输出下前后的data是否一致 扫了一眼感觉应该没问题,最多图片变形 也可能是

if( mBusy ) return;
        mBusy = true;
如果只取预览开始的第一帧,可能有问题,估计是camera在初始化,图像还不是很清晰 我建议通过按钮来获取某一帧图画 用个标志位,按下按钮就为true,截取一帧后变为false……这样的笨方法,试试
windfury_plus 2015-03-19
  • 打赏
  • 举报
回复
引用 4 楼 vnking 的回复:
呵呵,搞好了,跟上述代码没有关系,而是多执行了 mCamera.startPreview(); 一次是打开相机后,执行一次。在设置callback后又执行一次,前一次其实不需要。
晕,隐藏代码……
vnking 2015-03-19
  • 打赏
  • 举报
回复
引用 3 楼 inquisitive_plus 的回复:
[quote=引用 2 楼 vnking 的回复:] 查看logcat,其实没有显示busy=yes的情况,说明处理图片的速度快过下一次截图。 估计是数据格式的问题,但是没有办法验证它。
以前试过 if( mBusy ) return; mBusy = true; 这逻辑,下面就是用YuvImage image = new YuvImage(data, ImageFormat.NV21, mPreviewWidth, mPreviewHeight, null); 这样的直接生成图片,然后就是一个有点雪花的图片 而用按钮判断,就能得到一个合格的图片(不过由于没任何处理,效果很不好)[/quote] 呵呵,搞好了,跟上述代码没有关系,而是多执行了 mCamera.startPreview(); 一次是打开相机后,执行一次。在设置callback后又执行一次,前一次其实不需要。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧