일시 중지 된 상태에서 Android의 MediaPlayer setSurface

우트

수정 :

따라서 이것은 여러 활동과 관련이 없으며 비디오 파일의 인코딩과 관련이 있습니다.

질문을 단순화하려고 노력할 것입니다. 일시 중지 된 상태에있는 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하고 버튼도 보유하고 있습니다.

  1. mediaPlayer.pause (); 호출

  2. 활동 -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.

어떤 도움이라도 대단히 감사하겠습니다. 감사!

Eluzix

이 특정 동영상에 문제가있는 것 같습니다. 키 프레임이 많을수록 플레이어가 더 정확하게 재생을 재개하는 데 도움이됩니다.

ffmpeg 및 libx264를 사용하여 다시 인코딩을 시도하고 다음 매개 변수를 추가해보십시오.

-g=25 -keyint_min=25

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Android MediaPlayer setsurface illegalstateexception

분류에서Dev

Mediaplayer : 상태 1에서 일시 중지가 호출 됨-Android Eclipse

분류에서Dev

Android MediaPlayer 오류 (-38, 0) "상태 0에서 호출 중지"

분류에서Dev

MediaPlayer 일시 중지가 상태 8에서 호출되었습니다.

분류에서Dev

Android MediaPlayer가 일시 중지되지 않습니다.

분류에서Dev

가상 머신이 꺼지지 않고 일시 중단 된 상태에서 백업 할 수 있습니까? [VMWare]

분류에서Dev

일시 중단 된 Linux 상자에서 AC 정전의 의미

분류에서Dev

일시 중단 된 상태의 스레드에 대해 TerminateThread 호출 C ++

분류에서Dev

앱 일시 중지 상태의 CLBeacons

분류에서Dev

Centos 7.3의 /etc/ntp.conf에서`tinker panic 0`이 있어도 NTP가 시간을 동기화하지 않음-일시 중지 된 상태에서 VM 다시 시작

분류에서Dev

비활성 탭에서 일시 중지 된 동영상

분류에서Dev

Git에서 제거 된 파일이 git 상태에 표시되지 않음

분류에서Dev

백 프레스시 Android MediaPlayer가 중지됨

분류에서Dev

ANDROID : 일시 중지 된 활동의 액세스 변수

분류에서Dev

[tag] [!] Android Studio (설치되지 않음), Android Studio가 컴퓨터에 설치된 상태에서 flutter doctor 실행시

분류에서Dev

상태 1에서 Android MediaPlayer 시작이 호출되었습니다. 오류 -38,0

분류에서Dev

Swift의 Audio Player로 UITableView에서 버튼 셀의 재생 일시 중지 상태 변경

분류에서Dev

함수 실행시 내 상태에서 조작 된 객체 배열의 순서를 유지하는 방법

분류에서Dev

Ubuntu 18.04에서 일시 중지 된 상태에서 깨어 난 후 매번 암호를 입력하지 않으려면 어떻게해야합니까?

분류에서Dev

상위 태그의 속성 내에서 중첩 된 태그 속성 테스트

분류에서Dev

Mediaplayer 일시 중지 버튼 다음에 재생, 미디어 시작부터 시작

분류에서Dev

Android : 종료 된 상태에서 애니메이션 시작

분류에서Dev

일시 중지 후 MediaPlayer를 다시 시작할 수 없음

분류에서Dev

일시 중지 된 모든 프로세스 OSX의 일시 중지 해제

분류에서Dev

Android에서 누른 상태에서 이미지보기의 스타일 변경

분류에서Dev

HttpClient 요청은 시간 초과가 정의 된 상태에서 성공하지만

분류에서Dev

앱이 활성화 된 후 SpriteKit 장면을 일시 중지 상태로 유지

분류에서Dev

Mediaplayer가 선택한 파일 android를 열지 않음 (setDataSource 실패 : 상태 = 0x80000000)

분류에서Dev

Ubuntu 14.04가 포함 된 Lenovo X1 Carbon이 3 시간 후 자동으로 일시 중지 상태에서 깨어납니다.

Related 관련 기사

  1. 1

    Android MediaPlayer setsurface illegalstateexception

  2. 2

    Mediaplayer : 상태 1에서 일시 중지가 호출 됨-Android Eclipse

  3. 3

    Android MediaPlayer 오류 (-38, 0) "상태 0에서 호출 중지"

  4. 4

    MediaPlayer 일시 중지가 상태 8에서 호출되었습니다.

  5. 5

    Android MediaPlayer가 일시 중지되지 않습니다.

  6. 6

    가상 머신이 꺼지지 않고 일시 중단 된 상태에서 백업 할 수 있습니까? [VMWare]

  7. 7

    일시 중단 된 Linux 상자에서 AC 정전의 의미

  8. 8

    일시 중단 된 상태의 스레드에 대해 TerminateThread 호출 C ++

  9. 9

    앱 일시 중지 상태의 CLBeacons

  10. 10

    Centos 7.3의 /etc/ntp.conf에서`tinker panic 0`이 있어도 NTP가 시간을 동기화하지 않음-일시 중지 된 상태에서 VM 다시 시작

  11. 11

    비활성 탭에서 일시 중지 된 동영상

  12. 12

    Git에서 제거 된 파일이 git 상태에 표시되지 않음

  13. 13

    백 프레스시 Android MediaPlayer가 중지됨

  14. 14

    ANDROID : 일시 중지 된 활동의 액세스 변수

  15. 15

    [tag] [!] Android Studio (설치되지 않음), Android Studio가 컴퓨터에 설치된 상태에서 flutter doctor 실행시

  16. 16

    상태 1에서 Android MediaPlayer 시작이 호출되었습니다. 오류 -38,0

  17. 17

    Swift의 Audio Player로 UITableView에서 버튼 셀의 재생 일시 중지 상태 변경

  18. 18

    함수 실행시 내 상태에서 조작 된 객체 배열의 순서를 유지하는 방법

  19. 19

    Ubuntu 18.04에서 일시 중지 된 상태에서 깨어 난 후 매번 암호를 입력하지 않으려면 어떻게해야합니까?

  20. 20

    상위 태그의 속성 내에서 중첩 된 태그 속성 테스트

  21. 21

    Mediaplayer 일시 중지 버튼 다음에 재생, 미디어 시작부터 시작

  22. 22

    Android : 종료 된 상태에서 애니메이션 시작

  23. 23

    일시 중지 후 MediaPlayer를 다시 시작할 수 없음

  24. 24

    일시 중지 된 모든 프로세스 OSX의 일시 중지 해제

  25. 25

    Android에서 누른 상태에서 이미지보기의 스타일 변경

  26. 26

    HttpClient 요청은 시간 초과가 정의 된 상태에서 성공하지만

  27. 27

    앱이 활성화 된 후 SpriteKit 장면을 일시 중지 상태로 유지

  28. 28

    Mediaplayer가 선택한 파일 android를 열지 않음 (setDataSource 실패 : 상태 = 0x80000000)

  29. 29

    Ubuntu 14.04가 포함 된 Lenovo X1 Carbon이 3 시간 후 자동으로 일시 중지 상태에서 깨어납니다.

뜨겁다태그

보관