開発者コンソール

トンネルモードの再生(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には、追加のヘッダー情報を自動作成するwrite API(https://developer.android.com/reference/android/media/AudioTrack.html#write(java.nio.ByteBuffer,%20int,%20int,%20long))が用意されています。

    注: 追加のパラメーターは、書き込まれるデータに対応するタイムスタンプです。

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

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