말씀드린 것처럼 SurfaceTextureListener에서 onSurfaceTextureAvailable가 간헐적으로 호출되지 않습니다.
MediaPlayer를 연속으로 play후 재현이 간간이 되고 있습니다. 어느 부분에선가 MediaPlayer가 제대로 종료되지 않아서 그럴까요? 특히 Media play error인 경우 더욱 쉽게 재현이 되는것 같습니다.
밑에는 소스부분입니다. 한번 꼬인 경우 onSurfaceTextureAvailable 호출이 되지 않으니, openVideo 재생시도 자체가 불가합니다. 비슷한 경우 경험자분 조언부탁드립니다.
private void init(){
if(mVideoSurface !=null) {
mVideoSurface.release();
}
setSurfaceTextureListener(mSurfaceTextureListener);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
mCurrentState = STATE_IDLE;
mTargetState = STATE_IDLE;
}
TextureView.SurfaceTextureListener mSurfaceTextureListener = new SurfaceTextureListener() {
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
release();
if(mVideoSurface !=null) {
mVideoSurface.release();
return true;
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mVideoSurface = new Surface(surface);
openVideo();
}
};
private void openVideo(){
if (sUri == null) {
return;
}
try {
MediaPlayer = new MediaPlayer();
MediaPlayer.setOnCompletionListener(mOnCompletionListener);
MediaPlayer.setOnErrorListener(mOnErrorListener);
MediaPlayer.setOnInfoListener(mOnInfoListener);
MediaPlayer.setOnPreparedListener(mOnPreparedListener);
MediaPlayer.setOnSeekCompleteListener(mOnSeekCompleteListener);
//m_MediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
MediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
MediaPlayer.setDataSource(sUri);
MediaPlayer.setSurface(mVideoSurface);
MediaPlayer.prepareAsync();
MediaPlayer.setLooping(isLooping);
MediaController = new PPVideoControllerView(Context);
} catch (IOException e) {
mCurrentState = STATE_ERROR;
mTargetState = STATE_ERROR;
mOnErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
return;
}
mCurrentState = STATE_PREPARING;
attachMediaController();
}
public void release(){
if(MediaPlayer != null){
mCurrentState = STATE_IDLE;
mTargetState = STATE_IDLE;
MediaPlayer.reset();
MediaPlayer.release();
MediaPlayer = null;
}
}