开发人员控制台

隧道模式播放(仅适用于60帧/秒的4k Fire TV)


隧道模式播放(仅适用于60帧/秒的4k Fire TV)

某些Fire TV设备的硬件解码器支持以60 FPS速度播放4K内容。如需以上述分辨率和帧速率播放,媒体管道的定时要求非常高,由于内核的线程和进程调度限制,应用可能无法以16毫秒间隔渲染4K帧。可能导致丢帧,以及观赏体验欠佳。请使用隧道模式播放,以便最大发挥硬件的最佳性能。

如何启用隧道模式播放

如需启用隧道模式,需作如下更改:

  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提供了一个写入API,该写入API将自动构造额外的标头信息,即https://developer.android.com/zh/reference/android/media/AudioTrack.html#write(java.nio.ByteBuffer,%20int,%20int,%20long)

    注意:​ 附加参数是与正在写入的数据对应的时间戳。

有关隧道模式播放的详细信息

详细信息,请参阅Exoplayer 2中的“隧道模式播放”: