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


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

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

トンネルモードの再生をサポートする方法

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

  1. AudioManagerからAudioTrackセッションIDを生成します。

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

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

    format.setInteger(android.media.MediaFormat.KEY_AUDIO_SESSION_ID, audioSessionId);
    
  4. AudioManagerから生成したセッションIDとフラグ設定「FLAG_HW_AV_SYNC」を使用してAudioTrackを生成します。

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

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

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

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

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