[源码] Eoxplayer主框架流程

核心流程

在这里插入图片描述
主要流程:

  • 采用1个线程Loop实现音/视频的解码渲染。(通常做法是把音视频各用1个线程去解码渲染,各不影响,刚看到还是挺意外的)
  • message queue处理控制命令,上报的消息。
    在这里插入图片描述

主要类:

  • ExoPlayerImplInternal:管理source,render和播放流程。
  • Mediasource MediaPeriod:url数据下载,extractor,解复用。
  • MediaCodecRenderer: 包括了解码和渲染。

playing流程

Loop:
ExoPlayerImplInternal::doSomeWork {
    updatePeriods();        //Period 准备
    for (Renderer renderer : enabledRenderers) {        //audio video render
        MediaCodecRenderer::render()
            while () {
                drainOutputBuffer()     //从解码器取帧,然后渲染
                    codec.queueOutputBuffer()
                    processOutputBuffer()       //渲染
            }
            while () {
                feedInputBuffer()   //送入解码器
                    codec.queueInputBuffer()
                    BaseRenderer::readSource()            //从mediasource读frame
                        ProgressiveMediaPeriod::readData()
            }
    }
}
  • loop的代码流程如上,每次loop依次去调用render
  • render中会去mediaPeriod read解复用的帧,放入解码器。每次调用不一定会渲染,可能会解码还没完成,或者等同步sleep。
  • 主要的2个线程:ExoPlayerImp的loop, mediaSource下数据解复用放到sampleQueue

AudioTrack调用

单Loop刚开始会有疑问:怎么解决audiotrack write接口block的问题(sdk < 21),接口block会影响到视频的渲染。

    if (Util.SDK_INT < 21) { // isInputPcm == true
      // Work out how many bytes we can write without the risk of blocking.
      int bytesToWrite = audioTrackPositionTracker.getAvailableBufferSize(writtenPcmBytes);
      if (bytesToWrite > 0) {
        bytesToWrite = Math.min(bytesRemaining, bytesToWrite);
        bytesWritten = audioTrack.write(preV21OutputBuffer, preV21OutputBufferOffset, bytesToWrite);
        if (bytesWritten > 0) {
          preV21OutputBufferOffset += bytesWritten;
          buffer.position(buffer.position() + bytesWritten);
        }
      }
    }

相关类: DefaultAudioSink.writeBuffer
对于sdk < 21,audio track write会block,通过估计audiotrack的buffer来避免block:

  1. 计算audiotrack的bufferSize
  2. 记录写进audiotrack的bytes,writtenPcmBytes
  3. 通过AudioTrack::getPlaybackHeadPosition,获取当前播到的frames,推算出getAvailableBufferSize
  4. 根据AvailableBuffer决定是否送进去,实现低api也不会block
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值