トンネルモードの再生(4K@60fpsに対応したFire TVデバイスのみに適用)


トンネルモードの再生(4K@60fpsに対応したFire TVデバイスのみに適用)

Fire TVデバイスの中には、ハードウェアデコーダーが4K@60fpsの再生をサポートしているものがあります。そのように高い解像度とフレームレートでビデオを再生する場合、メディアパイプラインのタイミング要件が非常に高くなります。カーネルのスレッドやプロセスのスケジューリング制限によって、アプリが4Kフレームを16ミリ秒間隔でレンダリングできないことがあります。これは結果的にドロップフレームを招き、映画のユーザーエクスペリエンスを標準以下に落としてしまうこともあります。ハードウェア性能を最大限に発揮させるには、トンネルモードでの再生が有効です。

トンネルモードの再生を有効にする方法

トンネルモードの再生を有効にするために必要となる主な変更は、次のとおりです。

  1. AudioManagerからAudioTrackセッションIDを問い合わせます。

    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int audioSessionId = audioManager.generateAudioSessionId();
    
  2. ビデオデコーダーでトンネルモードを構成します。

    format.setFeatureEnabled(MediaCodecInfo.CodecCapabilities.FEATURE_TunneledPlayback, true);
    
  3. AudioTrackセッションIDを使用してビデオデコーダーを構成します。

    format.setInteger(android.media.MediaFormat.KEY_AUDIO_SESSION_ID, audioSessionId);
    
  4. 問い合わせた上記のセッションIDでAudioTrackを作成し、AudioAttributesフラグ「FLAG_HW_AV_SYNC」を設定します。

    AudioAttributes attributes = new AudioAttributes.Builder()
     .setLegacyStreamType(AudioManager.STREAM_MUSIC)
     .setFlags(AudioAttributes.FLAG_HW_AV_SYNC)
     .build();
    AudioFormat format = new AudioFormat.Builder()
     .setEncoding(targetEncoding)
     .setSampleRate(sampleRate)
     .setChannelMask(channelConfig)
     .build();
    int mode = AudioTrack.MODE_STREAM;
    AudioTrack audioTrack = new AudioTrack(attributes, format, bufferSize, mode, audioSessionId);
    
  5. ビデオデコーダーに対してdequeueOutputBufferreleaseOutputBufferを呼び出さないでください。
  6. AudioTrackに書き込まれるオーディオデータに16バイトのAV同期のヘッダーを挿入します。

    private ByteBuffer avSyncHeader = ByteBuffer.allocate(16);
    avSyncHeader.order(ByteOrder.BIG_ENDIAN);
    avSyncHeader.position(0);
    avSyncHeader.putInt(AVSYNC_START_CODE);
    avSyncHeader.putInt(bufferBytesRemaining);
    avSyncHeader.putLong(presentationTimeUs * 1000);
    

このヘッダーには、開始コード、再生時間(ナノ秒単位)、データサイズが含まれます。オーディオトラックにオーディオデータを書き込む前に、このデータを記述します。

トンネルモードの再生についての関連項目

トンネルモードの再生を実装する方法の詳細については、以下のExoplayer 2のページを参照してください。