MediaPlayer с несколькими SurfaceViews

1

У меня есть медиапланер, который действует как услуга и хотел бы изменить отображение поверхности экрана и продолжить видео в другом действии.

В документации указано, что я могу вызвать setDisplay в любом состоянии медиаплеера, и при настройке отображения на ICS я получаю мигающий образ видео. Единственный способ, с помощью которого я могу посмотреть видео, - немного потянуть панель уведомлений или выполнить какое-то действие, вызывающее рисование пикселей, как изменение громкости.

Настройка проста... Активность A | привязать к сервису, чтобы создать экземпляр медиафайла, а также воспроизвести видео. Нажмите ссылку в действии. Итак, открытая активность B... привязка к сервису, убедитесь, что видео в данный момент воспроизводится, и setDisplay для другого вида поверхности.

Я попробовал установить видимость для просмотра поверхности невидимым/прошлым в предыдущем действии... сначала вызовет setDisplay (null).... приостанавливая, а затем возобновляя видео.. и отключил кеш чертежа.

Любая помощь или совет будут очень признательны.

EDIT: видео на андроиде абсолютно ужасно. Объект MediaPlayer должен содержать приватную переменную для состояния, которое можно проверить. Также коды ошибок очень расплывчаты. VideoView сам по себе не поможет, если вы не хотите играть в видео, и это все. В принципе, никогда не бывает тривиальным манипулировать видом поверхности, который я предполагаю, потому что поверхностный вид выглядит иначе, чем обычный вид.

  • 0
    Извините, у меня нет лучшего объяснения, но, похоже, это было исправлено только путем размещения setDisplay (null). У меня был обратный вызов, в котором я установил видимость SurfaceView скрытым, когда вызывался обратный вызов surfaceDestroyed. После удаления мерцание прекратилось. Теперь это работает только на ICS и на Galaxy Note (не ICS), все, что у меня есть, это черный экран с звуком, воспроизводимым в bg. Так что мне все еще нужна помощь, если у кого-то есть какие-либо предложения.
Теги:
surfaceview
android-mediaplayer

1 ответ

0

Вы должны использовать TextureView для отображения и использовать mediaPlayer.setSurface вместо mediaPlayer.setDisplay.

Из действия A вызывается просто Activity B и передайте параметр позиции видео. В Activity B - когда поверхность доступна, установите ее в MediaPlayer и нажмите start.

Я не вижу причин, по которым это может потерпеть неудачу, если нет материала, который происходит с медиа-проигрывателем, которого вы отсутствуете.

и да, Android ужасен (не только в манипулировании видео).

Вот мой код для VideoFullScreenActivity

public class FullScreenVideoActivity extends AppCompatActivity implements 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;
        }
    }
}

Как вы можете видеть, я также использую класс с именем CustomMediaPlayer. Это Singelton, который обертывает MediaPlayer и управляет его жизненным циклом по всему приложению. Это ДОЛЖНО, если вы загружаете несколько видео в RecyclerView или LinearLayout.

  • 0
    Сегодня я бы использовал ExoPlayer (от Google), который гораздо более зрелый баг, чем MediaPlayer

Ещё вопросы

Сообщество Overcoder
Наверх
Меню