Android视频录制应用的细微差别

时间:2011-09-24 20:10:15

标签: android android-camera

我刚刚开始Android开发。我的目标是创建一个Android网络摄像头应用程序。

我从这里获取了基本代码:API Demos 我的修改后的代码包含在下面..

录制发生在点击事件上。但是我第一次点击, logcat显示我无法连接到相机..

09-25 01:29:58.580: WARN/CameraService(27788): CameraService::connect X (pid 27788) rejected (existing client).
09-25 01:29:58.580: ERROR/StagefrightRecorder(27788): Camera connection could not be established.
09-25 01:29:58.580: WARN/AACEncoder(27788): Call stop() when encoder has not started
09-25 01:29:58.580: WARN/AACEncoder(27788): [ 09-25 01:29:58.580 27788:0x6cd9 F/MPEG4Writer ]
09-25 01:29:58.580: WARN/AACEncoder(27788): frameworks/base/media/libstagefright/MPEG4Writer.cpp:2263 mCodecSpecificData
09-25 01:30:01.130: WARN/IMediaDeathNotifier(28022): media server died
09-25 01:30:01.130: WARN/AudioSystem(1351): AudioFlinger server died!
09-25 01:30:01.140: WARN/Camera(28022): ICamera died
09-25 01:30:01.140: WARN/AudioSystem(1351): AudioPolicyService server died!
09-25 01:30:01.140: WARN/Camera(28022): Camera server died!
09-25 01:30:01.150: ERROR/Camera(28022): Error 100
09-25 01:30:02.639: ERROR/AudioService(1351): Media server started.
09-25 01:30:02.639: ERROR/AudioService(1351): Media server died.
09-25 01:30:02.649: WARN/AudioPolicyManagerBase(28039): setPhoneState() setting same state 0

第二次点击开始录制,但是当录制停止时第三次点击,屏幕变黑。虽然第四次点击确实再次开始录制..

所以我不知道两件事......

  1. 为什么第一次点击时相机无法连接?
  2. 为什么停止录制后屏幕会变黑?
  3. 我的修改代码:

    public class blueCam extends Activity implements OnClickListener {
        private Preview mPreview;
        Camera mCamera;
        int numberOfCameras;
        int cameraCurrentlyLocked;
        MediaRecorder recorder;
        boolean recording = false;
        // The first rear facing camera
        int defaultCameraId;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Hide the window title.
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
            // Create a RelativeLayout container that will hold a SurfaceView,
            // and set it as the content of our activity.
            mPreview = new Preview(this);
            setContentView(mPreview);
    
            // Find the total number of cameras available
            numberOfCameras = Camera.getNumberOfCameras();
    
            // Find the ID of the default camera
            CameraInfo cameraInfo = new CameraInfo();
                for (int i = 0; i < numberOfCameras; i++) {
                    Camera.getCameraInfo(i, cameraInfo);
                    if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                        defaultCameraId = i;
                    }
                }
                mPreview.mSurfaceView.setClickable(true);
                mPreview.mSurfaceView.setOnClickListener(this);
                initRecording();
    
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            // Open the default i.e. the first rear facing camera.
            mCamera = Camera.open();
            cameraCurrentlyLocked = defaultCameraId;
            mPreview.setCamera(mCamera);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            // Because the Camera object is a shared resource, it's very
            // important to release it when the activity is paused.
            if (mCamera != null) {
                mPreview.setCamera(null);
                mCamera.release();
                mCamera = null;
            }
        }
        public void onClick(View v) {
            if (recording) {
                recorder.stop();
                recorder.reset();
                recording = false;
    
                // Let's initRecorder so we can record again
    
            } else {
                initRecording();
                prepareRecorder();
                recording = true;
                recorder.start();
            }
        }
        public void prepareRecorder() {
            recorder.setPreviewDisplay(mPreview.mHolder.getSurface());
    
            try {
                recorder.prepare();
            } catch (IllegalStateException e) {
                e.printStackTrace();
                finish();
            } catch (IOException e) {
                e.printStackTrace();
                finish();
            }
        }
    
    
        public void initRecording()
        {
            String PATH_NAME="/mnt/sdcard/AshVrec.mp4";
            recorder = new MediaRecorder();
            recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
            recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
            CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
            recorder.setProfile(cpHigh);
            recorder.setOutputFile(PATH_NAME);
            recorder.setMaxDuration(50000); // 50 seconds
            recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
    
    
    
        }
    
    
    class Preview extends ViewGroup implements SurfaceHolder.Callback {
        private final String TAG = "Preview";
    
        SurfaceView mSurfaceView;
        SurfaceHolder mHolder;
        Size mPreviewSize;
        List<Size> mSupportedPreviewSizes;
        Camera mCamera;
    
        Preview(Context context) {
            super(context);
    
            //initRecording();
            mSurfaceView = new SurfaceView(context);
            addView(mSurfaceView);
    
            // Install a SurfaceHolder.Callback so we get notified when the
            // underlying surface is created and destroyed.
            mHolder = mSurfaceView.getHolder();
            mHolder.addCallback(this);
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
        }
    
    
        public void setCamera(Camera camera) {
            mCamera = camera;
            if (mCamera != null) {
                mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
                requestLayout();
            }
        }
    
        public void switchCamera(Camera camera) {
           setCamera(camera);
           try {
               camera.setPreviewDisplay(mHolder);
           } catch (IOException exception) {
               Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
           }
           Camera.Parameters parameters = camera.getParameters();
           parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
           requestLayout();
    
           camera.setParameters(parameters);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            // We purposely disregard child measurements because act as a
            // wrapper to a SurfaceView that centers the camera preview instead
            // of stretching it.
            final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
            final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
            setMeasuredDimension(width, height);
    
            if (mSupportedPreviewSizes != null) {
                mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
            }
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            if (changed && getChildCount() > 0) {
                final View child = getChildAt(0);
    
                final int width = r - l;
                final int height = b - t;
    
                int previewWidth = width;
                int previewHeight = height;
                if (mPreviewSize != null) {
                    previewWidth = mPreviewSize.width;
                    previewHeight = mPreviewSize.height;
                }
    
                // Center the child SurfaceView within the parent.
                if (width * previewHeight > height * previewWidth) {
                    final int scaledChildWidth = previewWidth * height / previewHeight;
                    child.layout((width - scaledChildWidth) / 2, 0,
                            (width + scaledChildWidth) / 2, height);
                } else {
                    final int scaledChildHeight = previewHeight * width / previewWidth;
                    child.layout(0, (height - scaledChildHeight) / 2,
                            width, (height + scaledChildHeight) / 2);
                }
            }
        }
    
        public void surfaceCreated(SurfaceHolder holder) {
            // The Surface has been created, acquire the camera and tell it where
            // to draw.
            try {
                if (mCamera != null) {
                    mCamera.setPreviewDisplay(holder);
                }
            } catch (IOException exception) {
                Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
            }
            //prepareRecorder();
        }
    
        public void surfaceDestroyed(SurfaceHolder holder) {
            // Surface will be destroyed when we return, so stop the preview.
            if (mCamera != null) {
                mCamera.stopPreview();
            }
            recorder.stop();
            recorder.reset();
            recorder.release();
        }
    
    
        private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
            final double ASPECT_TOLERANCE = 0.1;
            double targetRatio = (double) w / h;
            if (sizes == null) return null;
    
            Size optimalSize = null;
            double minDiff = Double.MAX_VALUE;
    
            int targetHeight = h;
    
            // Try to find an size match aspect ratio and size
            for (Size size : sizes) {
                double ratio = (double) size.width / size.height;
                if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
    
            // Cannot find the one match the aspect ratio, ignore the requirement
            if (optimalSize == null) {
                minDiff = Double.MAX_VALUE;
                for (Size size : sizes) {
                    if (Math.abs(size.height - targetHeight) < minDiff) {
                        optimalSize = size;
                        minDiff = Math.abs(size.height - targetHeight);
                    }
                }
            }
            return optimalSize;
        }
    
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            // Now that the size is known, set up the camera parameters and begin
            // the preview.
            Camera.Parameters parameters = mCamera.getParameters();
            parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
            requestLayout();
    
            mCamera.setParameters(parameters);
            mCamera.startPreview();
        }
    
    }
    }
    

    任何帮助都是值得的。 感谢。

0 个答案:

没有答案