无声拍照

在Android系统中,通过代码控制拍照都会有咔嚓一声,并且这个声音没法通过设置去除或改变,系统没有让拍照无声的接口。

这是由于手机拍照有声音是国际标准,就是为了防止偷pai,正规的Android发布厂商都会有。

换一种思路,相机除了拍照还有录像和预览的功能,拍照和录像都是无可避免有声音的,而通过相机预览是没有声音的。

所以需要研究一下预览模式下,能不能获取当前的图像。通过研究Camera类,发现真的有一个Camera.PreviewCallback的子类。

通过Camera.setPreviewCallback(previewCallback)方法,在相机预览的过程中,

每一帧都会回调到 onPreviewFrame(byte[] data, Camera paramCamera)中,代码如下:

private PreviewCallback previewCallback = new PreviewCallback(){
@Override
public void onPreviewFrame(byte[] data, Camera paramCamera){

Log.i(TAG, "onPreviewFrame");

try {
YuvImage yuvimage = new YuvImage(
data,
ImageFormat.NV21,
paramCamera.getParameters().getPreviewSize().width,
paramCamera.getParameters().getPreviewSize().height,
null);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(
new Rect(0,0,paramCamera.getParameters().getPreviewSize().width,
paramCamera.getParameters().getPreviewSize().height), 80, baos);

FileOutputStream outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", 11111));
outStream.write(baos.toByteArray());
outStream.close();

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
camera.stopPreview();
camera.setPreviewCallback(null);
}
};


当然,每一帧回调,都会有帧数据,这些帧数据就需要自己来编码并存储了。

data字节流默认是YCbCr_420_SP,2.2之前的并没有把这种数据转化的方法,

SDK2.2之后,提供了一个YuvImage的类来转成图片。

这样,在需要拍照的时候,取一帧数据就可以了,并没有真正的调用拍照的API,就实现了无声拍照。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值