2012-06-06 3 views
1

서비스 역할을하는 미디어 플레이어가있어서 디스플레이 표면 뷰를 변경하고 비디오를 다른 활동으로 계속 보내고 싶습니다.여러 SurfaceViews가있는 MediaPlayer

설명서에 미디어 플레이어의 모든 상태에서 setDisplay를 호출 할 수 있으며 ICS에서 디스플레이를 설정할 때 비디오의 깜박이는 이미지가 표시됩니다. 비디오를 볼 수있는 유일한 방법은 알림 표시 줄을 약간 당기거나 픽셀을 볼륨 변경과 같이 그려야하는 작업을 수행하는 것입니다.

설정이 간단합니다 ... 활동 A | 서비스에 바인딩하면 미디어 플레이어가 서페이스를 첨부하고 비디오를 재생합니다. 활동 A의 링크를 클릭하여 활동 B ... 서비스에 바인딩하십시오. 비디오가 현재 재생 중이며 다른 표면보기로 설정되어 있는지 확인하십시오.

이전 활동에서 보이지 않거나 사라진 표면 뷰 설정을 시도했습니다 ... setDisplay (null) first ...을 호출하여 비디오를 다시 일시 중지 한 후 드로잉 캐시를 끕니다.

도움이나 조언을 주시면 감사하겠습니다.

편집 : 안드로이드 영상은 절대적으로 끔찍합니다. MediaPlayer 객체는 확인할 수있는 상태에 대한 전용 변수를 보유해야합니다. 또한 오류 코드는 매우 모호합니다. VideoView 자체는 비디오를 재생하고 싶지 않으면 유용하지 않습니다. 기본적으로 Surfaceview는 일반 뷰와 다르게 드로잉하기 때문에 내가 추측하고있는 Surfaceview를 조작하는 것은 결코 쉬운 일이 아닙니다.

+0

나는 더 나은 설명이 없지만 setDisplay (null) 만 놓아도 수정 된 것으로 보인다. 나는 surfaceDestroyed 콜백이 호출되었을 때 비어있는 표면 뷰 가시성을 설정하는 콜백을 가졌습니다. 꺼낸 후 깜박임이 멈 춥니 다. 이제는 ICS에서만 작동하고 은하주의 사항 (비 ICS)에서는 bg에서 재생되는 오디오가있는 검은 색 화면이 전부입니다. 아무도 제안이 없으면 여전히 도움이 필요합니다. – Maurycy

답변

0

Display에 TextureView를 사용하고 mediaPlayer.setDisplay 대신 mediaPlayer.setSurface를 사용해야합니다.

활동 A에서 단순히 활동 B를 호출하고 비디오 위치 매개 변수를 전달합니다. 활동 B에서 - 서페이스가 사용 가능하면 MediaPlayer에 설정하고 시작을 누릅니다.

누락 된 미디어 플레이어에서 일어나는 일이 없으면 실패 할 수있는 이유가 없습니다.

예, Android는 끔찍한 동영상 조작에 그치지 않습니다.

여기

공용 클래스 FullScreenVideoActivity하면 나는 또한 CustomMediaPlayer라는 이름의 클래스를 사용하고 볼 수 있듯이 AppCompatActivity이 TextureView.SurfaceTextureListener {

private EventBus bus = EventBus.getDefault(); 
private CustomVideoView mAdapterVideoPlayer; 
private TextureView mFullScreenTextureView; 
private RelativeLayout container; 
private boolean mIsPortrait; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_full_screen_video); 

    container = (RelativeLayout) findViewById(R.id.container); 

    mFullScreenTextureView = (TextureView) findViewById(R.id.fullscreen_texture_surface); 
    mFullScreenTextureView.setSurfaceTextureListener(this); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (!bus.isRegistered(this)) 
     bus.register(this); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    if (bus.isRegistered(this)) 
     bus.unregister(this); 
} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    if (mAdapterVideoPlayer != null) 
     mAdapterVideoPlayer.setSeekPosition(PiplMediaPlayer.getInstance().getCurrentPosition()); 
} 

@Subscribe(threadMode = ThreadMode.MAIN) 
public void fullscreen(VideFullscreenParams videFullscreenParams) { 
    this.mAdapterVideoPlayer = videFullscreenParams.customVideoView; 

    mIsPortrait = videFullscreenParams.customVideoView.getWidth() < videFullscreenParams.customVideoView.getHeight(); 
    if (mIsPortrait) 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

@Override 
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
    CustomMediaPlayer.getInstance().changeSurface(new Surface(surface)); 
    CustomMediaPlayer.getInstance().prepareController(container); 
    CustomMediaPlayer.getInstance().setControllerTouchView(mFullScreenTextureView); 
    CustomMediaPlayer.getInstance().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) { 
} 

public static class VideFullscreenParams { 

    private final CustomVideoView customVideoView; 

    public VideFullscreenParams(CustomVideoView customVideoView) { 
     this.customVideoView = customVideoView; 
    } 
} 

}

를 구현 확장 VideoFullScreenActivity 내 코드입니다. 이것은 MediaPlayer를 감싸고 앱 전체에서 라이프 사이클을 관리하는 싱글 톤입니다. RecyclerView 또는 LinearLayout에 여러 개의 비디오를로드하는 경우 반드시해야합니다.