Jas*_*son 5 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: 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)
Run Code Online (Sandbox Code Playgroud)
我已经在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();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:所以这与CamcorderProfile被设置有关.我改变它CamcorderProfile.QUALITY_LOW,它工作正常.那么如何在没有乱码输出的情况下获得高分辨率视频呢?
编辑2:所以使用CamcorderProfile.QUALITY_LOWset,我使用录像机没有错误.但是,输出视频与上面发布的乱码截图非常相似.什么给出了什么?
Stu*_*ine 10
我有一个类似的问题,最后发现它是由于共享相机和媒体记录器之间的预览表面(我不确定这实际上是根本原因,但从API调用看起来就是这样).
我假设您已经打开相机并附加了预览显示,如果是这样,请尝试在prepareRecorder方法的顶部插入以下行:
Camera camera = getCamera();
camera.stopPreview();
camera.lock();
camera.release();
camera = Camera.open();
camera.unlock();
Run Code Online (Sandbox Code Playgroud)
您可能还需要将相机本地重新分配给隐藏在getCamera()后面的字段,遗憾的是我无法告诉您如何使用给定的代码段实现它.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
3591 次 |
| 最近记录: |