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