Как Android MediaPlayer определяет 3D-дисплей, глядя на SEI FPA?

Я хочу понять принципы работы 3D-дисплея HTC Evo 3D; однако код и учебник HTCDev не помогают в этом. Говорят, что бит SEI FPA в заголовке переопределяет выбор, который задается вручную, например:

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    holder = surfaceholder;
    enableS3D(true, holder.getSurface()); // note SEI FPA flag in content
                                          // overrides this
}

Код воспроизводимого видео:

private void playVideo() {
    release();
    fileName = "HTCDemo.mp4";
    try {
        mediaPlayer = new MediaPlayer();
        final AssetFileDescriptor afd = getAssets().openFd(fileName);
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
                afd.getLength());
        mediaPlayer.setDisplay(holder);
        mediaPlayer.prepare();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnVideoSizeChangedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (Exception e) {
        Log.e(TAG, Log.getStackTraceString(e));
    }
}

На данный момент я не смог отследить, где он смотрит на бит SEI FPA в заголовке. Мне нужна помощь для отображения необходимой части кода. Заранее спасибо.

1 ответ

Вам нужно разобрать бит SEI FPA в самом заголовке? Это выходит за рамки этого API. Как уже отмечалось, кодек анализирует это, чтобы включить (и переопределить) настройку S3D.

В обзоре упоминается, как вы можете использовать сторонние инструменты, такие как x264, чтобы добавить этот бит к существующему контенту.

Я бы порекомендовал посмотреть на код для x264 для помощи в разборе заголовка файла, если это то, что вам нужно сделать во время выполнения.

Другие вопросы по тегам