サイレント写真

1979 ワード

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のクラスが提供されます.
このように,写真を撮る必要がある場合には,フレームデータを1フレーム取ればよいが,実際に写真を撮るAPIを呼び出すことなく,無音撮影を実現する.