제가 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");
}
});