Android Mediarecorder可以';t仅在前摄像头横向模式下录制视频
我正在开发一个应用程序,它使用媒体录像机从后置摄像头和前置摄像头录制视频。我面临的问题是,每当我尝试在横向模式下从前置摄像头录制视频时,视频根本没有被录制,纵向模式记录得很好,没有任何问题 我在许多设备上测试了这段代码,运行jellybean的设备成功地运行了这段代码并录制了视频,但运行kitkat(三星Note 2)及以上版本的设备在横向模式下无法从前置摄像头录制视频Android Mediarecorder可以';t仅在前摄像头横向模式下录制视频,android,android-mediarecorder,Android,Android Mediarecorder,我正在开发一个应用程序,它使用媒体录像机从后置摄像头和前置摄像头录制视频。我面临的问题是,每当我尝试在横向模式下从前置摄像头录制视频时,视频根本没有被录制,纵向模式记录得很好,没有任何问题 我在许多设备上测试了这段代码,运行jellybean的设备成功地运行了这段代码并录制了视频,但运行kitkat(三星Note 2)及以上版本的设备在横向模式下无法从前置摄像头录制视频 Camera.Parameters parameters = mCamera.getParameters();
Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> mSupportedPreviewSizes = parameters.getSupportedPreviewSizes();
Camera.Size optimalSize = CameraHelper.getOptimalPreviewSize(mSupportedPreviewSizes,
mPreview.getWidth(), mPreview.getHeight());
// Use the same size for recording profile.
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
profile.videoFrameWidth = optimalSize.width;
profile.videoFrameHeight = optimalSize.height;
enter code here
// likewise for the camera object itself.
parameters.setPreviewSize(profile.videoFrameWidth, profile.videoFrameHeight);
mCamera.setParameters(parameters);
if (isCamera) {
try {
// Requires API level 11+, For backward compatibility use {@link setPreviewDisplay}
// with {@link SurfaceView}
mCamera.setPreviewTexture(mPreview.getSurfaceTexture());
} catch (IOException e) {
Log.e(TAG, "Surface texture is unavailable or unsuitable" + e.getMessage());
return false;
}
}
// END_INCLUDE (configure_preview)
// BEGIN_INCLUDE (configure_media_recorder)
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
int orianton = getScreenOrientation();
String str = getRotation(Capture_video.this);
if (orianton == 1) {
if (cameraFront) {
mMediaRecorder.setOrientationHint(270);
} else {
mMediaRecorder.setOrientationHint(90);
}
} else if (orianton == 2) {
if (str.equals("landscape")) {
mMediaRecorder.setOrientationHint(0);
} else {
mMediaRecorder.setOrientationHint(180);
}
} else {
mMediaRecorder.setOrientationHint(0);
}
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//mMediaRecorder.setOrientationHint(rotation);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
mMediaRecorder.setProfile(profile);
// mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setVideoEncodingBitRate(690000);
mMediaRecorder.setVideoFrameRate(20);
// Step 4: Set output file
mMediaRecorder.setOutputFile(CameraHelper.getOutputMediaFile(
CameraHelper.MEDIA_TYPE_VIDEO).toString());
// END_INCLUDE (configure_media_recorder)
// Step 5: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
releaseMediaRecorder();
return false;
try {
mMediaRecorder.start();
}catch (Exception e){
e.printStackTrace();
}
// dimensions of our preview surface.
And below is my logcat during error..please give me response as soon as possible..
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.RuntimeException: start failed.
at android.media.MediaRecorder.start(Native Method)
at com.mansainfotech.Camera.Capture_video$MediaPrepareTask.doInBackground(Capture_video.java:656)
at com.mansainfotech.Camera.Capture_video$MediaPrepareTask.doInBackground(Capture_video.java:648)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
06-23 18:31:59.731 28697-28697/com.mansainfotech.sportseed E/ActivityThread﹕ Activity com.mansainfotech.Camera.Capture_video has leaked IntentReceiver com.mansainfotech.Camera.UpdateService@42ce0dd8 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.mansainfotech.Camera.Capture_video has leaked IntentReceiver com.mansainfotech.Camera.UpdateService@42ce0dd8 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:809)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:610)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1816)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1796)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1790)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:479)
at com.mansainfotech.Camera.Capture_video.onCreate(Capture_video.java:146)
at android.app.Activity.performCreate(Activity.java:5451)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access$900(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Camera.Parameters=mCamera.getParameters();
List mSupportedPreviewSizes=参数。getSupportedPreviewSizes();
Camera.Size optimizesize=CameraHelper.getoptimizepreviewsize(mSupportedPreviewSizes,
mPreview.getWidth(),mPreview.getHeight();
//使用相同的大小录制配置文件。
CamcorderProfile profile=CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
profile.videoFrameWidth=最佳尺寸.width;
profile.videoFrameHeight=最佳尺寸.height;
在这里输入代码
//对于摄影机对象本身也是如此。
parameters.setPreviewSize(profile.videoFrameWidth、profile.videoFrameHeight);
mCamera.setParameters(参数);
如果(isCamera){
试一试{
//需要API级别11+,为了向后兼容,请使用{@link setPreviewDisplay}
//使用{@link SurfaceView}
setPreviewTexture(mPreview.getSurfaceTexture());
}捕获(IOE异常){
Log.e(标记“表面纹理不可用或不合适”+e.getMessage());
返回false;
}
}
//结束包含(配置预览)
//开始包括(配置媒体记录器)
mMediaRecorder=新的MediaRecorder();
//步骤1:解锁摄像头并将其设置为MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
int-orianton=getScreenOrientation();
String str=getRotation(捕获视频);
如果(orianton==1){
如果(摄像头前部){
mMediaRecorder.setOrientationHint(270);
}否则{
设置方向提示(90);
}
}否则如果(orianton==2){
如果(str.equals(“横向”)){
mMediaRecorder.setOrientationHint(0);
}否则{
mMediaRecorder.setOrientationHint(180);
}
}否则{
mMediaRecorder.setOrientationHint(0);
}
//步骤2:设置源
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//mMediaRecorder.setOrientationHint(旋转);
//步骤3:设置摄像机配置文件(需要API级别8或更高)
mMediaRecorder.setProfile(配置文件);
//mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.设置视频编码比特率(690000);
mMediaRecorder.setVideoFrameRate(20);
//步骤4:设置输出文件
mMediaRecorder.setOutputFile(CameraHelper.getOutputMediaFile(
CameraHelper.MEDIA_TYPE_VIDEO).toString();
//结束\u包括(配置\u媒体\u记录器)
//步骤5:准备已配置的MediaRecorder
试一试{
mMediaRecorder.prepare();
}捕获(非法状态){
Log.d(标记“IllegalStateException准备MediaRecorder:”+e.getMessage());
释放MediaRecorder();
返回false;
}捕获(IOE异常){
Log.d(标记“IOException准备MediaRecorder:+e.getMessage());
释放MediaRecorder();
返回false;
试一试{
mMediaRecorder.start();
}捕获(例外e){
e、 printStackTrace();
}
//预览曲面的尺寸。
下面是我出错时的日志,请尽快回复。。
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done(AsyncTask.java:300)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
位于java.util.concurrent.FutureTask.run(FutureTask.java:242)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:841)
原因:java.lang.RuntimeException:启动失败。
在android.media.MediaRecorder.start(本机方法)
在com.mansainfotech.Camera.Capture_video$MediaPrepareTask.doInBackground(Capture_video.java:656)
在com.mansainfotech.Camera.Capture_video$MediaPrepareTask.doInBackground(Capture_video.java:648)
在android.os.AsyncTask$2.call(AsyncTask.java:288)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:841)
06-23 18:31:59.73128697-28697/com.mansainfotech.sportseed E/A