따라서 이것은 여러 활동과 관련이 없으며 비디오 파일의 인코딩과 관련이 있습니다.
질문을 단순화하려고 노력할 것입니다. 일시 중지 된 상태에있는 MediaPlayer 개체가 있는데 전화를 걸면 mediaPlayer.getCurrentPosition()
정확한 결과를 얻습니다. 이 객체에 대해 호출 mediaPlayer.setSurface()
(다른 표면 사용)을 수행 mediaPlayer.play()
하면 비디오가 getCurrentPosition ()에서 반환 된 위치와 다른 위치에서 재생됩니다. API> = ICE_CREAM_SANDWICH에서 테스트 중입니다.
비디오 파일 링크 : http://wpc.4ba9.edgecastcdn.net/804BA9/testenvmedia/m_8705_LuS3w7ctSZjB.mov.bs.mp4
활동 A와 활동 B의 두 가지 활동이 있습니다.
Activity-A는를 TextureView
사용하여 원격 스트림에서으로 비디오를 재생 MediaPlayer
하고 버튼도 보유하고 있습니다.
mediaPlayer.pause (); 호출
활동 -B를 엽니 다.
Activity-B는 TextureView
동일한 MediaPlayer
객체를 사용하여 현재 위치에서 동일한 비디오를 재생해야하는 a도 보유 합니다.
Activity-A onCreate 메서드 :
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int w, int h) {
try {
final MediaPlayer mediaPlayer = MyApplication.getMediaPlayer();
mediaPlayer.setDataSource(context, videoURI);
mediaPlayer.setSurface(new Surface(surfaceTexture));
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(shouldLoop);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; }
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
});
btnFullScreen.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Log.e("WHATEVER", ">>> pause video at " + MyApplication.getMediaPlayer().getCurrentPosition());
MyApplication.getMediaPlayer().pause();
Intent intent = new Intent(getActivity(), ActivityB.class);
startActivity(intent);
}});
Activity-B onCreate 메서드 :
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int w, int h) {
MediaPlayer mediaPlayer = MyApplication.getMediaPlayer();
mediaPlayer.setSurface(new Surface(surface));
Log.e("WHATEVER", ">>> resume video at " + mediaPlayer.getCurrentPosition());
mediaPlayer.start();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
LogCat 출력 :
10-10 17:33:15.966 13886-13886/com.whatever.android.debug E/WHATEVER﹕ >>> pause video at 1958
10-10 17:33:16.817 13886-13886/com.whatever.android.debug E/WHATEVER﹕ >>> resume video at 1958
따라서 MediaPlayer가 정확한 위치에서 다시 시작되는 것처럼 보이지만 비디오마다 다른 동작이 발생합니다. 대부분은 Activity-B에서 재생하려고 할 때마다 정확히 동일한 프레임에서 시작합니다. 맨 처음에는 다른 하나는 매번 다른 지점에서 시작합니다.
Android의 MediaPlayer.SetSurface()
방법 문서에서 :
This method can be called in any state and calling it does not change the object state.
어떤 도움이라도 대단히 감사하겠습니다. 감사!
이 특정 동영상에 문제가있는 것 같습니다. 키 프레임이 많을수록 플레이어가 더 정확하게 재생을 재개하는 데 도움이됩니다.
ffmpeg 및 libx264를 사용하여 다시 인코딩을 시도하고 다음 매개 변수를 추가해보십시오.
-g=25 -keyint_min=25
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다