私は何日かの間、ビデオの保存に関連する曖昧な問題を解明しようとしてきました。私はそれを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>