Android preview processing while video recording

时间秒杀一切 提交于 2019-11-28 20:54:27

Eureka! The trick is to attach your PreviewCallback in the surfaceChanged(...) SurfaceHolder.Callback! After doing this, you'll continue to get preview frame data after a MediaRecorder is running!

For example:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    mCamera.setPreviewCallback(new PreviewCallback() {
            public void onPreviewFrame(byte[] _data, Camera _camera) {
                Log.d("onPreviewFrame-surfaceChanged",String.format("Got %d bytes of camera data", _data.length));
            }
        });

}

you cannot access the video stream while recording, onPreviewFrame will not get called once you start recording. Oddly, onPreviewFrame does not seem to get called after you record either...

You just add tag to your manifest file .Thus it will work.Sample code shown below.

eg:-

   </application>
    <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    ***<uses-feature android:name="android.hardware.camera" />***
</manifest>
iKushal

if you are using os 2.2 or higher then use this method your prepare failed and other exception will removed

 public boolean startRecording() {
    try {
        camera.unlock();

        mediaRecorder = new MediaRecorder();
        mediaRecorder.setCamera(camera);
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mediaRecorder.setProfile(CamcorderProfile
                .get(CamcorderProfile.QUALITY_HIGH));

        File tempFile = new File(getOutputMediaFile(MEDIA_TYPE_VIDEO)
                .toString());

        mediaRecorder.setOutputFile(tempFile.getPath());
        mediaRecorder.setVideoFrameRate(videoFramesPerSecond);
        mediaRecorder.setVideoSize(surfaceView.getWidth(),
                surfaceView.getHeight());
        mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
        mediaRecorder.setMaxFileSize(maxFileSizeInBytes);
        mediaRecorder.prepare();
        mediaRecorder.start();

        return true;
    } catch (IllegalStateException e) {
        Log.e(TAG, e.getMessage());
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        Log.e(TAG, e.getMessage());
        e.printStackTrace();
        return false;
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!