2011-08-03 9 views
1

私は何日かの間、ビデオの保存に関連する曖昧な問題を解明しようとしてきました。私はそれをMediaRecorderの問題に絞り込んだ。問題は、多くの(15-30)ビデオを連続して記録する場合です。何らかの点(> 10)で、録音を開始したときに発生するBEEPサウンド(MediaRecorder.start())が停止します。 LogCatには、AudioFlingerのエラー「Audio/AudioTrack:AudioFlingerがトラックを作成できませんでした。ステータス: -12」が表示されます。一度これが起こっても、問題なくビデオを録画することができますが、電話のボリュームキーを押すと電話がクラッシュします。MediaRecorder save video problem

私はそれが特にビデオを保存することに関連していると思う理由は、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(); 
    } 
    } 

マニフェスト[/コード]

<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> 

答えて

0
<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レイアウトは、携帯電話やオペレーティングシステムに固有の問題であると思われます。私は今、上記のコードと2つの異なる電話で私のより複雑なビデオレコーダーのコードをテストし、私は上記の問題を取得していない。残念ながら私はそれが電話かOSであるかわからない。

さらにテストした後、Android 2.2の問題と思われます。 2.2を実行している2つの異なる電話(Samsung VibrantとCaptivate)では、問題が発生します。私は別の携帯電話(サムスンバイブラント)2.1と2.1アップデート1を実行し、HTCは2.3.1を実行してそれをテストし、問題はなかった。