Android 使用摄像机在HTC One S上录制视频不起作用

Android 使用摄像机在HTC One S上录制视频不起作用,android,android-camera,video-capture,android-video-player,Android,Android Camera,Video Capture,Android Video Player,实际上,我需要用我的应用程序录制不同分辨率的视频,比如480p、720p、1080p。在HTC One的安卓4.0.4中,除了QUALITY_LOW、QUALITY_CIF和QUALITY_QCIF之外,视频录制不适用于任何摄像机配置文件,但录制的视频会被损坏。下面是我的代码片段: mMediaRecorder = new MediaRecorder(); mCamera.unlock(); mMediaRecorder.setCamera(mCamera);

实际上,我需要用我的应用程序录制不同分辨率的视频,比如480p、720p、1080p。在HTC One的安卓4.0.4中,除了QUALITY_LOW、QUALITY_CIF和QUALITY_QCIF之外,视频录制不适用于任何摄像机配置文件,但录制的视频会被损坏。下面是我的代码片段:

    mMediaRecorder = new MediaRecorder();

    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    mMediaRecorder.setProfile(CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH));

    mMediaRecorder.setOutputFile(getOutputMediaFile().toString());

    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
我还尝试手动设置MediaRecorder配置文件参数,但我只能使用mMediaRecorder.setVideoSize640480录制视频。对于其他值对,如960、540,我无法录制视频

    mMediaRecorder = new MediaRecorder();

    mCamera.unlock();
    mMediaRecorder.setCamera(mCamera);

    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);


    mMediaRecorder.setOutputFile(getOutputMediaFile().toString());

    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    mMediaRecorder.setAudioEncodingBitRate(196608);

    mMediaRecorder.setVideoSize(640, 480);
    // mMediaRecorder.setVideoSize(1920, 1080); // Not Working
    // mMediaRecorder.setVideoSize(1280, 720); // Not Working
    // mMediaRecorder.setVideoSize(960, 540); // Not Working

    mMediaRecorder.setVideoFrameRate(16);
    mMediaRecorder.setVideoEncodingBitRate(3000000);

    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    mMediaRecorder.setOutputFile(getOutputMediaFile().toString());

    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
对于视频大小的其他值,例如SetVideoSize128720,我无法录制视频并获取RunTimeException。以下是我的跟踪:

    09-17 19:29:22.431: E/MediaRecorder(11634): start failed: -19
    09-17 19:29:22.431: V/MediaRecorderJNI(11634): process_media_recorder_call
    09-17 19:29:22.431: E/MediaRecorder(11634): start failed.
    09-17 19:29:22.431: E/MediaRecorder(11634): try to delete broken file:    /mnt/sdcard  /Movies/MyApp/VID_20140917_192922.mp4
    09-17 19:29:22.431: D/AndroidRuntime(11634): Shutting down VM
    09-17 19:29:22.431: W/dalvikvm(11634): threadid=1: thread exiting with uncaught exception (group=0x40aaaa08)
    09-17 19:29:22.431: E/AndroidRuntime(11634): FATAL EXCEPTION: main
    09-17 19:29:22.431: E/AndroidRuntime(11634): java.lang.RuntimeException: start failed.
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.media.MediaRecorder._start(Native Method)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.media.MediaRecorder.start(MediaRecorder.java:770)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at com.collaaj.activity.camera.CameraActivity.captureVideo(CameraActivity.java:98)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at com.collaaj.activity.camera.CameraActivity.onClick(CameraActivity.java:68)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.view.View.performClick(View.java:3538)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.view.View$PerformClick.run(View.java:14319)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.os.Handler.handleCallback(Handler.java:608)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.os.Handler.dispatchMessage(Handler.java:92)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.os.Looper.loop(Looper.java:156)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at android.app.ActivityThread.main(ActivityThread.java:5045)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at java.lang.reflect.Method.invokeNative(Native Method)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at java.lang.reflect.Method.invoke(Method.java:511)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    09-17 19:29:22.431: E/AndroidRuntime(11634):    at dalvik.system.NativeStart.main(Native Method)
注: 1.在HTC One S的本机摄像头应用程序中,每种可用分辨率的视频录制都可以正常工作。 2.在三星Galaxy S3安卓4.3、三星Galaxy S4安卓4.4.2和LG Nexus 4安卓4.4等其他设备上,使用所有摄像机配置文件进行视频录制效果良好


请引导我解决这个问题。任何帮助或指导都将不胜感激。

我在HTC One上遇到了类似的挑战,必须首先将摄像机的质量设置为较低,然后覆盖某些设置:

CamcorderProfile profl = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_LOW);
profl.videoFrameWidth = mOptimalSize.width;
profl.videoFrameHeight = mOptimalSize.height;
mRecorder.setProfile(profl);
mRecorder.setVideoFrameRate(25);
mRecorder.setVideoEncodingBitRate(3000000);
mOptimalSize设置如下:

private void setRecorderSize() {
    List<Size> validPreviewSizes = CameraUtils.getValidPreviewSizes(mCamera);       
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.set("cam_mode", 1);        

    //Camera.Size optimalSize =         
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    mOptimalSize = CameraPreview.getOptimalPreviewSize(validPreviewSizes, metrics.widthPixels, metrics.heightPixels);
    parameters.setPreviewSize(mOptimalSize.width, mOptimalSize.height);         
}