마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SurfaceTextureListener에서 onSurfaceTextureAvailable가 간헐적으로 호출되지 않습니다.

0 추천

말씀드린 것처럼 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;
		}
	}

 

익명사용자 님이 2016년 8월 4일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...