MediaRecorder可以保存视频问题

时间:2011-08-03 16:16:04

标签: android video-capture mediarecorder

几天来,我一直试图找出一个与保存视频相关的模糊问题。我已将其缩小到MediaRecorder的问题。问题是当你连续录制很多(15-30)个视频时。会发生的是,在某些时候(> 10),当您开始录制时(即MediaRecorder.start())停止时发生的BEEP声音。在LogCat中,AudioFlinger会出现错误“ERROR / AudioTrack:AudioFlinger无法创建曲目,状态: -12“。一旦发生这种情况,您仍然可以录制任意数量的视频而不会出现问题,但如果按手机音量键,​​手机将会崩溃。

我认为它与保存视频有关的原因是我可以注释掉MediaRecorder的所有视频相关设置,然后只记录音频而没有任何问题,其他任何关于代码/程序的内容都不同。

我已经包含了在手机上创建相同问题的代码(Samsung Captivate运行2.2)。请注意,我的实际录像机代码不同,此代码只是分享和关注MediaRecorder视频保存问题。

如果您遇到类似问题,请回复,如果您在手机上测试此代码并且没有任何问题,请告诉我,因为我已经开始认为这是手机/固件问题。如果您的代码有效且可以共享,请执行。

谢谢,

[代码]

    public class Camcorder extends Activity implements SurfaceHolder.Callback {
    MediaRecorder mRecorder;
    SurfaceHolder mHolder;
    SurfaceView mSurfaceView; 
    String mOutputFileRoot = "/sdcard/Avid_";
    String mOutputFile; 
    String mFileExt = ".3gp"; 
    Integer cnt = 0; 
     private boolean mRecording = false; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState); 
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
          setContentView(R.layout.camcorder_preview); 

          mSurfaceView =  ((SurfaceView)findViewById(R.id.camera_preview));
          mHolder = mSurfaceView.getHolder();
          mHolder.addCallback(this);
          mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

     } 

     @Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) 
     { 
         if (keyCode == KeyEvent.KEYCODE_SEARCH) 
         { 
          if (mRecording) { 
                stopRecording();
                //finish(); 
             if(mRecorder == null){
                    initMediaRecorder();
                    prepareMediaRecorder();
                    }
                mRecording = false;
            } else { 
                mRecording = true; 

                startRecording(); 
            } 
             return true; 
         } 
         return super.onKeyDown(keyCode, event); 
     }   

     public void surfaceCreated(SurfaceHolder holder) {
         mHolder = holder;
         initMediaRecorder();
         prepareMediaRecorder();

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if(mHolder != null) mHolder = null; 
        if(mSurfaceView != null) mSurfaceView = null; 
    }

    public void initMediaRecorder(){

        mRecorder = new MediaRecorder();

        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
        mRecorder.setPreviewDisplay(mHolder.getSurface());
        mOutputFile = mOutputFileRoot + cnt.toString() + mFileExt;
        cnt += 1;
        mRecorder.setOutputFile(mOutputFile);

    }

    private void prepareMediaRecorder(){
        if (mRecorder != null) {
            try {
                mRecorder.prepare();
            } catch (IllegalStateException e) {
                Log.e("IllegalStateException", e.toString());
            } catch (IOException e) {
                Log.e("IOException", e.toString());
            }
        }
    } 

     public void startRecording()
     {
        mRecorder.start();
     }

     public void stopRecording()
     {
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;   
     }

     @Override
     public void onPause(){
         if(mRecorder != null){
             mRecorder.reset();
             mRecorder.release();
             mRecorder = null; 
         }
         super.onPause();
     }
    }

[/代码]

清单                                                                                                                        

    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></user-permission>
   </manifest> 

xml布局                    

    <FrameLayout 

      android:layout_width="fill_parent"
      android:layout_height="fill_parent">

     <SurfaceView android:id="@+id/camera_preview" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent"
            android:clickable="true" />

   </FrameLayout>
   </LinearLayout>

1 个答案:

答案 0 :(得分:0)

似乎是手机或操作系统特有的问题。我现在在两个不同的手机上测试了上面的代码和我更复杂的录像机代码,但我没有得到上述问题。不幸的是我不知道是电话还是操作系统。

经过更多测试后,它似乎是Android 2.2的一个问题。在运行2.2的两个不同的手机(Samsung Vibrant和Captivate)上出现问题。我在一台运行2.1和2.1-update1的单独手机(Samsung Vibrant)和运行2.3.1的HTC上进行了测试,没有任何问题。