ExoPlayer是Google开源的一款播放器,基于Android平台的可扩展多媒体播放器,支持HLS流、Smooth Streaming流、Dash流,支持扩展FFmpeg、Vpx、Av1、Flac、Opus等软件解码器。GitHub地址:https://github.com/google/ExoPlayer;开发者指南文档:ExoPlayer;API介绍文档:ExoPlayer library;另外还有就是开发人员的设计博客:https://medium.com/google-exoplayer。博主根据源码阅读与个人理解,与各位伙伴分享下exo播放器架构。

1、播放整体架构

播放器内核主要分为三层:demux解封装、decode解码、render渲染,如图1所示。其中,demux解析出VideoStream、AudioStream、SubtitleStream。如果是多音轨(mkv格式比较常见),那么会有多个AudioStream。SubtitleStream字幕流可能存在也可能不存在,可以是内置封装在格式里也可以是外置选择,如果存在会对应音轨的语言。decode把视频解码为YUV(然后YUV转成RGB),把音频解码为PCM,把字幕解析成一行行文本。render会对视频帧、音频帧、字幕进行同步渲染,一般以音频时钟作为参考时钟。如果视频帧落后30ms以内可以接受,落后30ms~500ms快速渲染,落后500ms以上则丢弃;反之,如果是视频帧超前则等待。

图1—播放器内核架构

2、播放时序图

播放器经历的生命周期包括:init、setDataSource、setSurface、prepare同步/prepareAsync异步、play、pause、stop、release。其中init阶段会创建DataSourceFactory、TrackSelector、设置播放状态监听器。setSurface支持设置SurfaceView、TextureView、GlSurfaceView,主要是传递控件对应的Surface进去。prepare阶段主要是探测封装格式、选择对应解封装器、解析视频宽高与音频采样率声道数等参数、解析关键帧索引数组,分为同步与异步两种模式,推荐采用异步。如下图所示:

图2—播放时序图

3、解封装

视频解封装器包括:Mp4Extractor、MatroskaExtractor、TsExtractor、FlvExtractor、AviExtractor、WmvExtractor等,音频解封装器包括:Mp3Extractor、OggExtractor、WavExtractor、Ac3Extractor、Ac4Extractor、AmrExtractor、FlacExtractor等。解封装过程包括:sniff、parseTrack、parseSeekMap、readStream。其中sniff负责探测封装格式,parseTrack解析视频轨、音频轨、字幕轨信息,parseSeekMap解析关键帧索引数组,readStream读取音视频流数据(FFmpeg对应的是av_read_frame)。如下图所示:

图3—音视频解封装器

4、解码

解码器分为硬解与软解,硬解采用的是mediacodec,软解包括:Av1Decoder、FlacDecoder、FFmpegDecoder、VpxDecoder、SimpleSubtitleDecoder,都实现Decoder接口。解码器内部有inputBuffer和outBuffer两个缓冲队列,属于生产者/消费者模型。mediacodec在Android5.0以前是同步获取解码后的音视频帧,在Android5.0后提供异步回调接口。FFmpeg3.0以后也有提供异步解码方式:avcodec_send_packet、avcodec_receive_frame。

图4.1—解码器关系图

字幕解码器又包括:Webvtt、Tx3g、Subrip、Ssa、Dvb、Pgs、Ttml等,继承于SimpleSubtitleDecoder,如下图所示:

图4.2—字幕解码器

5、渲染

基于BaseRender接口,渲染器分为:TextRender、MediaCodecRender、SimpleDecoderVideoRender、SimpleDecoderAudioRender。其中TextRender是字幕渲染器;MediaCodecRender基于mediacodec硬解,分为MediaCodecVideoRender与MediaCodecAudioRender;SimpleDecoderAudioRender基于音频软解,分为LibFlacAudioRender与FFmpegAudioRender;SimpleDecoderVideoRender基于视频软解,分为LibVpxVideoRender与LibAv1VideoRender。

图5—渲染器关系图

解封装、解码、渲染有各自独立工作线程。解封装线程负责读取音视频数据包,保存于inputBuffer;解码线程从inputBuffer取出数据包解码,输出到outputBuffer;渲染线程从outputBuffer取出视频帧渲染/音频帧播放。

可以到GitHub一起学习音视频:https://github.com/xufuji456/FFmpegAndroid​​​​​​​

走进音视频的世界——剖析exo播放器架构相关推荐

  1. 走进音视频的世界——音频封装格式

    音频封装格式一般由:多媒体信息+音频流+封面流+歌词流组成.有些音乐会包含封面和歌词,则对应有封面流.歌词流.多媒体信息包括:标题.艺术家.专辑.作曲.音乐风格.日期.码率.时长.声道布局.采样率.音 ...

  2. 走进音视频的世界——Matroska封装格式的介绍(二)

    Matroska封装格式非常灵活.兼容性好,既适用于本地文件存储又可以进行实时流传输.本篇文章主要探讨Matroska的编解码器映射,如何封装视频流.音频流.字幕流.如果要Matroska的介绍.功能 ...

  3. 走进音视频的世界——音视频解码

    音视频文件是经过编码.封装而成的.那么反过来,要播放音视频文件,首先得解封装.解码.上一篇博客讨论到音视频编码:走进音视频的世界--音视频编码,我们来个上下呼应,本文与大家探讨一下音视频解码.本质上, ...

  4. 走进音视频的世界——音视频的基本概念

    音视频通用的基本概念有码率.时长,而不同音视频有不同的封装格式.编码协议.其中视频关键参数有分辨率.帧率.画质.旋转角度.像素格式,而音频关键参数有采样率.声道数.声道布局.音质.采样数.采样位数.帧 ...

  5. 走进音视频的世界——视频封装格式

    音视频的时长怎么获取,音视频的封面怎么获取,音视频的格式怎么获取呢?这些信息都以特定格式存储在文件开头或者结尾,称为多媒体信息或者多媒体元数据.通用的封装格式由:文件标识头+多媒体信息+音视频(字幕) ...

  6. 走进音视频的世界——Matroska封装格式的介绍(一)

    Matroska是一个开放标准项目,基于EBML(Extensible Binary Meta Language 可扩展的二进制元语言),旨在成为多媒体格式容器的标准.EBML与XML结构有点类似,R ...

  7. 走进音视频的世界——杜比视界Dolby Vision与HDR

    Dolby Vision(杜比视界)是杜比实验室推出的影像画质技术,具有更宽的色域和高动态范围HDR,亮度.色度和对比度更加逼真,从而使得整体图像更加生动.图像的明亮部分可以变得更亮,因此图像似乎具有 ...

  8. 走进音视频的世界——音视频编码

    音视频流是通过特定编码器压缩,由一系列的压缩图像/语音帧组成.当然可能存在多种语言多音轨,每个音轨之间的音频流相互独立.还可能存在内置字幕,常见的字幕格式有sub.smi.ssa.srt等.但是,本篇 ...

  9. 音视频领域火爆的开源播放器项目

    1.FFmpeg https://github.com/FFmpeg/FFmpeg FFmpeg应该是音视频入门必须要掌握的开源项目,涉及到音视频从生产到消费的完整过程,FFmpeg是一个综合性项目, ...

最新文章

  1. C语言中整型浮点型在计算机中的存储
  2. 计算机硬件的基本组成概述
  3. 微软人工智能和对话平台--知识商城体验
  4. Xamarin Evolve 2016 Keynote回顾
  5. Qt中常用的QChar QByteArry QString数据类型转换方法
  6. idou老师教你学Istio 07: 如何用istio实现请求超时管理
  7. 华为鸿蒙系统发展时间2021年,耗时八年打造国产系统,华为鸿蒙OS质疑声不断,它才是真正未来...
  8. 办公常用---破解在PDF中无法复制的功能
  9. hive 查询是否包含字符串_oracle判断一个字符串中是否包含另外一个字符串
  10. (int),Int32.Parse,Convert.ToInt3…
  11. SVN客户端smartsvn详细功能
  12. 前端封装接口弹出错误_Java:SpringBoot写后端接口,看这一篇就够了
  13. 查看APP用到的图片方法
  14. 2020五一建模:C题 饲料混合加工问题 题解
  15. javaw和java,java,javaw和javaws之间有什么区别?
  16. 冰冻三尺非一日之寒-自学篇 浅谈个人学习方法
  17. HTTPS之SNI介绍与Nginx多域名支持
  18. 苹果手机自带表格软件_手机自带的软件无法卸载?教你一招”!
  19. WIN10下用anaconda安装tensorflow-gpu1.8.0并用pycharm作编译器(WIN10下anaconda+tensorflow-gpu+pycharm)
  20. LearnOpenGL 入门—摄像机

热门文章

  1. 苹果手机的微信记录怎么恢复?奉上超好用的恢复技巧,拿走不谢
  2. 一件代发怎么赚钱?无货源模式
  3. Android MediaPlayer+SurfaceView播放视频 (异常处理)
  4. 【源码解析】StyleNeRF 之Train_encoder.py
  5. GB/T 20281-2020实施两周年,美创数据库防火墙的标准实践
  6. 微信公众号---收货地址共享接口
  7. 伺服电机脉冲控制的多种方式(AB相脉冲,方向脉冲,CW/CCW脉冲)
  8. BOX物联网盒子的作用和调试程序
  9. 按关键词搜索商品 淘宝API
  10. 麒麟座MINI板串口乱码(HAL库晶振配置)