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

Media Player 기능 관련 질문드립니다.

0 추천
제가 Media Player를 구현해서 파일 재생까진 하였는데요.
일시정지(기능이 됐다 안됐다 하네요..)

재생 완료 후 다시 재생(루프) 그리고 SeekBar 이동시 해당 시간대로 이동을 처리하려고 하니 잘안 되네요. 혹시이거와 관련된 문제를 알고 계신분 있으신가요?

* 사용 라이브러리 : implementation 'com.github.wseemann:FFmpegMediaPlayer:1.0.4'

        btnPlay.setOnClickListener(new Button.OnClickListener()
        {
            public void onClick(View v)
            {
                Log.e("디버그", "재생");

                try
                {
                    m_MediaPlayer.start();
                    m_MediaPlayer.seekTo(m_nPosition);
                }
                catch (Exception e)
                {
                    Log.e("디버그", "재생(error) : " + e.getMessage());
                }
            }
        });

        btnPause.setOnClickListener(new Button.OnClickListener()
        {
            public void onClick(View v)
            {
                Log.e("디버그", "일시 정지");

                try
                {
                    m_MediaPlayer.pause();
                    m_nPosition = m_MediaPlayer.getCurrentPosition();
                }
                catch (Exception e)
                {
                    Log.e("디버그", "일시정지(error) : " + e.getMessage());
                }
            }
        });

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2)
    {
        m_Surface = new Surface(surfaceTexture);
        onPlay();
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2)
    {

    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture)
    {
        Log.e("디버그", "onSurfaceTextureUpdated : " + String.valueOf(m_MediaPlayer.getCurrentPosition()));
        //m_SeekBar.setProgress(m_MediaPlayer.getCurrentPosition());
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture)
    {
        return true;
    }

    private void onPlay()
    {
        try
        {

            m_MediaPlayer = new FFmpegMediaPlayer();
            m_MediaPlayer.setOnPreparedListener(mOnPreparedListener);
            m_MediaPlayer.setOnSeekCompleteListener(mOnSeekCompleteListener);
            m_MediaPlayer.setOnCompletionListener(mOnCompletionListener);

            m_MediaPlayer.setDataSource(m_strFilePath);
            m_MediaPlayer.setSurface(m_Surface);
            m_MediaPlayer.prepareAsync();
        }
        catch (Exception e)
        {
            Log.e("디버그", "onPlay(error) : " + e.getMessage());
        }
    }

    FFmpegMediaPlayer.OnPreparedListener mOnPreparedListener = new FFmpegMediaPlayer.OnPreparedListener()
    {
        @Override
        public void onPrepared(FFmpegMediaPlayer mp)
        {
            try
            {
                Log.e("디버그", "onPrepared");
                m_MediaPlayer.start();
            }
            catch (Exception e)
            {
                Log.e("디버그", "재생(error) : " + e.getMessage());
            }
        }
    };

    FFmpegMediaPlayer.OnSeekCompleteListener mOnSeekCompleteListener = new FFmpegMediaPlayer.OnSeekCompleteListener()
    {
        @Override
        public void onSeekComplete(FFmpegMediaPlayer mp)
        {
            try
            {
                Log.e("디버그", "onSeekComplete");

                m_MediaPlayer.reset();
                m_MediaPlayer.setDataSource(m_strFilePath);
                m_MediaPlayer.setSurface(m_Surface);
                m_MediaPlayer.prepareAsync();
            }
            catch (Exception e)
            {
                Log.e("디버그", "완료(error) : " + e.getMessage());
            }
        }
    };

    FFmpegMediaPlayer.OnCompletionListener mOnCompletionListener = new FFmpegMediaPlayer.OnCompletionListener()
    {
        @Override
        public void onCompletion(FFmpegMediaPlayer mp)
        {
            try
            {
                Log.e("디버그", "onCompletion");
            }
            catch (Exception e)
            {
                Log.e("디버그", "완료(error) : " + e.getMessage());
            }
        }
    };

        m_SeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
        {
            public void onStartTrackingTouch(SeekBar seekBar)
            {
                Log.d("디버그", "onStartTrackingTouch");
            }

            @SuppressLint("SetTextI18n")
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
            {
                if (fromUser)
                {
                    Log.e("디버그", "onProgressChanged : " + String.valueOf(progress));

                    m_nPosition = progress;
                    m_MediaPlayer.seekTo(m_nPosition);
                    m_SeekBar.setProgress(m_nPosition);
                }
            }

            @SuppressLint("HandlerLeak")
            public void onStopTrackingTouch(SeekBar seekBar)
            {
                Log.d("디버그", "onStopTrackingTouch");
            }
        });
yyms (470 포인트) 님이 2018년 11월 16일 질문
yyms님이 2018년 11월 16일 수정

답변 달기

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