В течение нескольких дней я пытался выяснить неясную проблему, связанную с сохранением видео. Я сузил его до проблемы с 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>