本人为Android初级开发者,目前在尝试做一个在同一界面同时进行视频采集与视频播放的小应用,在程序中,分别使用Media Recorder和Media Player进行视频的采集和播放。采集源为摄像头,播放源为存储在手机中的mp4视频文件。采集预览与播放分别使用了一个SurfaceView作为载体。现遇到问题如下:当同时进行摄像头视频预览和视频播放时,播放的视频只有声音,画面为全绿色。而单独进行摄像头视频预览或视频播放时,都是完全没有问题的。DDMS的LogCat中显示错误为:overlays already in use。在网上查找了很多资料,得到的答案是一般的手机硬件只支持一个overlay覆盖进行视频的显示。不知道这个答案是不是正解,也不知道如何解决这个问题。求高手赐教!不胜感激!
//创建视频采集实例
mMediaRecorder = new MediaRecorder();
mCamera = Camera.open(Camera.getNumberOfCameras()-1);
//设置视频采集的参数
Camera.Parameters p = mCamera.getParameters();
mCamera.setParameters(p);
mCamera.unlock();
String pathForAppFiles = yjs_VideoCaptureAct.mAbsolutePath;
pathForAppFiles += RECORDED_FILE;
Log.d("Video filename:",pathForAppFiles );
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mMediaRecorder.setPreviewDisplay(yjs_VideoCaptureAct.shVideoCapture.getSurface());
mMediaRecorder.setOutputFile(pathForAppFiles);
//开始采集
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
mbStopRecording = false;
} catch (Exception e) {
Log.e("Video", "Failed to prepare and start video recording", e);
mMediaRecorder.release();
mMediaRecorder = null;
mbStopRecording = true;
}
//当主线程不设置停止播放时一直停在循环里
while(!mbStopRecording){
try{
sleep(100);
}
catch(Exception e){
e.printStackTrace();
}
}
//停止采集
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
mCamera.lock();
}
public void run() {
//开始视频播放
mMediaPlayer = new MediaPlayer();
try{
mMediaPlayer.setDataSource(PLAYING_FILE);
mMediaPlayer.setDisplay(yjs_VideoCaptureAct.shVideoPlaying);
mMediaPlayer.prepare();
mMediaPlayer.start();
mbStopPlaying = false;
}
catch(Exception e){
Log.e("Video", "Failed to prepare and start video playing", e);
mMediaPlayer.release();
mMediaPlayer = null;
mbStopPlaying = true;
}
//当主线程不设置停止播放时一直停在循环里
while(!mbStopPlaying){
try{
sleep(100);
}
catch(Exception e){
e.printStackTrace();
}
}
//停止播放
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
Andorid机制决定的