MediaRecorder сохранить проблему с видео - PullRequest
1 голос
/ 03 августа 2011

В течение нескольких дней я пытался выяснить неясную проблему, связанную с сохранением видео. Я сузил его до проблемы с MediaRecorder. Проблема в том, что вы записываете много (15-30) видео подряд. Что происходит, так это то, что в какой-то момент (> 10) звук BEEP, который появляется, когда вы начинаете запись (то есть MediaRecorder.start ()) прекращается. В LogCat будет ошибка от AudioFlinger "ОШИБКА / 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 голосов
/ 12 августа 2011

Похоже, что проблема связана с телефоном или операционной системой. Теперь я проверил приведенный выше код и мой более сложный код видеомагнитофона на двух разных телефонах, и я не получил вышеуказанную проблему. К сожалению, я не знаю, был ли это телефон или ОС.

После дополнительных испытаний, похоже, проблема с Android 2.2. На двух разных телефонах (Samsung Vibrant и Captivate) под управлением 2.2 проблема возникает. Я протестировал его на отдельном телефоне (Samsung Vibrant) под управлением 2.1 и 2.1-update1 и HTC под управлением 2.3.1, и проблем не было.

...