Android 在Galaxy S3上录制时,视频显示混乱
我正在编写一个摄像头应用程序,S3出现了问题。每当我开始录制时,屏幕就会变成垃圾(见下面的屏幕截图)。然后,当我停止录制时,我得到一个异常:Android 在Galaxy S3上录制时,视频显示混乱,android,android-camera,galaxy,android-mediarecorder,Android,Android Camera,Galaxy,Android Mediarecorder,我正在编写一个摄像头应用程序,S3出现了问题。每当我开始录制时,屏幕就会变成垃圾(见下面的屏幕截图)。然后,当我停止录制时,我得到一个异常: 10-02 13:36:31.647: E/MediaRecorder(24283): stop failed: -1007 10-02 13:36:31.647: D/AndroidRuntime(24283): Shutting down VM 10-02 13:36:31.647: W/dalvikvm(24283): threadid=1: thr
10-02 13:36:31.647: E/MediaRecorder(24283): stop failed: -1007
10-02 13:36:31.647: D/AndroidRuntime(24283): Shutting down VM
10-02 13:36:31.647: W/dalvikvm(24283): threadid=1: thread exiting with uncaught exception (group=0x40c49a68)
10-02 13:36:31.647: E/AndroidRuntime(24283): FATAL EXCEPTION: main
10-02 13:36:31.647: E/AndroidRuntime(24283): java.lang.RuntimeException: stop failed.
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.native_stop(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.stop(MediaRecorder.java:742)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.stopRecording(NewCameraActivity.java:178)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.toggleRecording(NewCameraActivity.java:189)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.onClick(NewCameraActivity.java:97)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View.performClick(View.java:3565)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View$PerformClick.run(View.java:14165)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.handleCallback(Handler.java:605)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.dispatchMessage(Handler.java:92)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Looper.loop(Looper.java:137)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.app.ActivityThread.main(ActivityThread.java:4514)
10-02 13:36:31.647: E/AndroidRuntime(24283): at java.lang.reflect.Method.invokeNative(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283): at java.lang.reflect.Method.invoke(Method.java:511)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
10-02 13:36:31.647: E/AndroidRuntime(24283): at dalvik.system.NativeStart.main(Native Method)
我已经在Galaxy Nexus(4.1)、Galaxy S2、Nexus S和Galaxy Tab 10.1上测试了我的应用程序。它们都很好用。我跟着。我不明白为什么这台设备与其他设备如此不同。这是我在设备上看到的。第一张照片是在我开始录音之前。第二张图片是我开始录音后发生的事情
以下是我准备和启动MediaRecorder
对象的代码:
@Override
public void onClick( View v ) {
switch (v.getId()) {
case R.id.camera_action_ImageView:
int mode = getMode();
if ( mode == MODE_PHOTO ) {
focusThenTakePicture();
}
else if ( mode == MODE_VIDEO ) {
toggleRecording();
}
break;
}
}
private void startRecording() {
if ( prepareRecorder() ) {
getRecorder().start();
setRecording( true );
}
}
@TargetApi( 9 )
private boolean prepareRecorder() {
Camera camera = getCamera();
camera.unlock();
MediaRecorder recorder = new MediaRecorder();
setRecorder( recorder );
recorder.setCamera( camera );
recorder.setAudioSource( MediaRecorder.AudioSource.CAMCORDER );
recorder.setVideoSource( MediaRecorder.VideoSource.CAMERA );
CamcorderProfile profile;
if ( Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD ) {
profile = CamcorderProfile.get( CamcorderProfile.QUALITY_HIGH );
}
else {
profile = CamcorderProfile.get( getCameraId(), CamcorderProfile.QUALITY_HIGH );
}
recorder.setProfile( profile );
File outputFile = LocalMediaUtil.getOutputMediaFile( LocalMediaUtil.MEDIA_TYPE_VIDEO );
setRecorderOutputFile( outputFile );
recorder.setOutputFile( outputFile.toString() );
recorder.setPreviewDisplay( getPreview().getHolder().getSurface() );
try {
recorder.prepare();
}
catch (Exception e) {
camera.lock();
setRecorder( null );
return false;
}
return true;
}
private void stopRecording() {
MediaRecorder recorder = getRecorder();
recorder.stop();
releaseRecorder();
setRecording( false );
LocalMediaUtil.scanMedia( this, getRecorderOutputFile().toString(), 90 );
setRecorderOutputFile( null );
}
private void toggleRecording() {
if ( isRecording() ) {
stopRecording();
}
else {
startRecording();
}
}
private void releaseRecorder() {
MediaRecorder recorder = getRecorder();
if ( recorder != null ) {
recorder.reset();
recorder.release();
setRecorder( null );
getCamera().lock();
}
}
@覆盖
公共void onClick(视图v){
开关(v.getId()){
案例R.id.摄像机\动作\图像视图:
int mode=getMode();
如果(模式==模式照片){
focusThenTakePicture();
}
else if(模式==模式\视频){
切换录制();
}
打破
}
}
私有无效开始记录(){
if(prepareRecorder()){
getRecorder().start();
设置录制(真);
}
}
@塔吉塔皮(9)
私有布尔准备记录器(){
摄像头=getCamera();
摄像头解锁();
MediaRecorder=新的MediaRecorder();
设置记录器(记录器);
记录器。设置摄像机(摄像机);
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
摄像机档案;
if(Build.VERSION.SDK_INT
编辑:所以这与设置的摄像机配置文件有关。我把它改成了camcoderprofile。质量很低,效果很好。那么,我怎样才能拥有高分辨率的视频而不输出乱码呢
Edit2:因此,设置了camercorderprofile.QUALITY\u LOW
后,我使用录像机时不会出现任何错误。然而,输出的视频看起来与上面发布的乱码截图非常相似。那么,问题出在哪里呢?我也遇到了类似的问题,最终发现这是由于相机和媒体录制器之间共享了预览表面造成的(我不确定这是否是根本原因,但从API调用来看似乎是这样的)
我假设您已经打开相机并将预览显示附加到相机上,如果是,请尝试在prepareRecorder方法的顶部插入以下行:
Camera camera = getCamera();
camera.stopPreview();
camera.lock();
camera.release();
camera = Camera.open();
camera.unlock();
您可能还需要将camera local重新指定给隐藏在getCamera()后面的字段,不幸的是,我无法告诉您如何使用给定的代码段实现它
希望这能有所帮助。我在三星笔记本上也遇到过类似的问题。我的问题是预览设置为分辨率,而录制设置为另一个更大的分辨率(我的手机不支持该分辨率),这就是为什么它看起来像这样。你应该试试:
recorder.setVideoSize(320240)代码>
如果它能工作,则表示您的初始分辨率不受支持/这是因为预览分辨率和Mediarecorder分辨率不同(它们可能会因设备而异,但在某些设备上,这似乎会导致问题)
检查Android camera应用程序,它不会停止预览然后开始录制(您可以通过保持闪光灯打开来检查这一点,如果您停止预览然后开始录制,闪光灯将关闭然后再次打开,而在Android camera应用程序中,这不会发生)
这里的“接受”答案之所以有效,是因为相机会释放预览表面,mediarecorder可以将分辨率调整为mediarecorder的其中一个分辨率,但技术上并不正确。将其作为iOS6地图式相机appGoogle bug report出售:@JasonRobinson他们为什么关闭bug report?至少可以给你指出另一个方向或者别的什么。“那太懒了!”影子脚本师是的,我想他们没有读过描述之类的东西。他以为我在请求用户支持:-\。我在Android开发者的最后(10-3)个办公时间问了这个问题,他们指示我打开一个bug报告。我认为谷歌无法修复三星扭曲的实现。很多(如果不是全部的话)三星设备都需要一个特殊的、非标准的、非文件化的(至少是英文的)程序来完成相机的一件或另一件事情。Galaxy K:无法使用功能性前凸轮(输出类似于此问题);银河注:不能用“高质量”的配置文件拍摄;Galaxy S2:需要特定的“set parameter”调用才能获得完整的分辨率。。。如果你不明白我的意思:你