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

SurfaceHolder를 얻는 과정이 실패할때..에 관련된 질문입니다.

0 추천

현재 MediaCodec을 사용해서 영상을 렌더링하고 있는데요.

 

처음에 holder에 대한 초기화 및 사용엔 문제가 되질 않고, 중지했을 때 bitmap에 이미지를 그렸다가 다시 시작했을 경우, 

holder.getSurface() 가 실패하고 mediaCodec configure 및 start에서 fail이 납니다.

 

말로설명드리기가 어려워 코드를 첨부하자면..

public threadclass extends Thread {
   
   boolean bStart;
   SurfaceHolder sfHolder;
   Canvas canvas;
   Bitmap stopImg = BitmapFactory.decodeResource(m_Context.getResources(), R.drawable.logo);  //삽입한 png 파일
   threadclass (SurfaceHolder Holder) {
      bStart = false;
      sfHolder = Holder;
      canvas = null;
   }

   public void run() {
        if ( bStart == true )
        {
            MediaCodec codec = MediaCodec.createDecoderByType(strMime); //H264
            MediaFormat format = MediaFormat.createVideoformat(strMime, width, height);

            try { 
                codec.configure( format, sfHolder.getSurface(), null, 0);
            } catch (illegalStateException ie) {
                 ie.printStackTrace();
            }
                codec.start();

                //디코딩 & 렌더링 작업.
        } else {
            codec.stop();
            codec.release();

            try {
                 canvas = sfHolder.lockCanvas();

                 //여기다가 정지 시 bitmap이미지 그리는 작업을 합니다.
                 canvas.drawBitmap(stopImg, nMarginLeft, nMarginTop, null);
            } catch ( Exception e ) {
                 e.printfStackTrace();
            } finally {
                 if ( canvas != null )
                      sfHolder.unlockCanvasAndPost(canvas);
            }
        }

 

처음에 미디어코덱으로 디코딩 및 렌더링 성공 - 중지됐을 시 png 이미지 그리기 성공 - 다시 시작해서 미디어코덱 사용하려고 하는 부분 >> codec.start()에서 실패하고 app 비정상 종료

 

이런 상황인데 아무리봐도 그 전에 configure() 해주는 부분에서 실패하는것 같아요.  surfaceholder에 대한 권한이 캔버스로 넘어간거 같은데..어떻게 해결을 해줘야할지 답변 부탁드립니다. 감사합니다!

emerald (760 포인트) 님이 2015년 1월 20일 질문

1개의 답변

0 추천
1. codec.configure 실패시 exception이 발생했으면, 오류 메시지를 잘 보세요.

2. 이미지를 surface에 그리지 말고 별도 뷰에 설정하여 덮는 방식으로 우회가능한지 알아보세요.
익명사용자 님이 2015년 1월 20일 답변
답변 감사합니다. configure를 다시 하는 과정에 native_window_api_connect returned an error: Invalid argument (-22) 이렇게 에러가 뜨는 상황이고 입력해주는 변수에 format은 변한게 없고 서페이스만 바뀌었을 거라고 가정하에 제목과 같은 질문을 드렸던 상황입니다...
else 부분의 codec은 뭔가요? 어디에 선언되어 있나요?
if 부분에서 생성한 codec과 같은 건가요?
클래스내 멤버변수입니다. 옮겨적는 과정에서 빠졌네요..bstart 변수 밑에 MediaCodec codec; 이렇게 있다고 보시면 될거같습니다.
...