美文网首页
iOS浅谈播放器架构

iOS浅谈播放器架构

作者: 野码道人 | 来源:发表于2021-07-08 15:27 被阅读0次

主流业务场景协议与痛点

  • 短视频:http,海量码流格式、容器格式需要支持
  • 秀场类直播:rtmp、http-flv、hls,延时、卡顿
  • 摄像头监控:rtsp、延时、丢帧
协议 传输方式 封装格式 延时 数据流 H5直播 应用场景
HLS http m3u8/ts 10s以上 ts切片 支持 直播拉流
RTMP tcp flv 2s左右 连续流 不支持 采集推流
HTTP-FLV http flv 2s左右 连续流 支持 直播拉流

系统自带播放器的局限性

  • 支持的协议有限
  • 支持的码流格式有限
  • 支持的容器格式有限
  • 不支持流式播放
  • 关键模块封装的严实,无法自定义和调试,排查问题困难

播放器核心架构

  • FFmpeg负责解协议解封装得到AVPacket根据类型分包到音视频压缩数据队列
  • 音视频解码器解码出AVFrame,iOS硬解码出来直接是CVPixelBufferRef格式,放入音视频渲染队列
  • 音频帧使用AudioUnit渲染,根据系统回调喂数据,视频帧根据同步帧率控制,进行渲染,渲染引擎同时支持Metal、openGLES

FFMpeg裁剪包

  • FFmpeg负责解协议、解容器同时支持协议容器格式任意裁剪
  • 基础包用于常规业务
  • 可以根据特定业务类型自定义裁剪包
  • 全量包用特殊业务

解协议、解封装、解码

  • 建立链接获取字节流
  • 创建解析器得到媒体流信息包括音视频格式、时长、码率、帧率等信息
  • 创建解复用器循环读取压缩数据包放入压缩数据队列
  • 根据码流信息创建解码器得到yuv和pcm放入带渲染队列

Buffer队列

  • 抵抗网络抖动
    降低卡顿率,没有Buffer队列的数据流:IO->Parser->Demuxer->Decoder串行执行,当网络抖动的时候会出现CDN缓存的较多的数据(现在主流设计只会缓存几帧),导致TCP发送队列爆满而产生被动丢帧,导致网络恢复的时候下发到客户端的数据不完整而产生花屏
  • 抵抗解码抖动
    解码某些复杂码流的时候,某些帧可能耗时比较久,如果解码器卡住,永阳IO也会阻塞
  • Buffer队列设计引入的问题
    Buffer越大,内对占用越高、延时越高

因此需要根据不同业务场景配置相应的buffer策略

  • 点播
    缓存大小可以适当的大一些,但也要控制好内存,移动网络下长度控制在15秒以内,wifi下可以控制在30秒内
  • 直播
场景 策略模式 详情
秀场 流畅模式 正常缓存播放
语音房 加速模式 大于delaytime,倍速播放
IOT 低延时模式 大于delaytime,丢帧

音视频渲染

  • 视频渲染挑战
    iOS支持openGLES,但是2018年的WWDC上,苹果公司发布了正式版的iOS12,同时宣布弃用openGLES并且在后续的iOS版本中会逐步替换底层库的相关代码使之向metal演变

1、Metal支持的操作系统:iOS、macOS X
2、Metal的硬件要求:A7处理器,ARM64以上,就是iphone5s以上的机型,不支持x86
3、Metal支持的系统版本:Metal:iOS8,MetalKit:iOS9

因此需要支持模拟器和低版本的系统,需要实现两套方案,需要设计openGLES与Metal的适配器以供播放器控制自由切换

  • 音频渲染挑战
    iOS系统支持流式播放的音频框架有opengAL、audioQueue、audioUnit
    openAL所有实例共享一个上下文,不符合播放器多实例的特性,并且一个实例发生错误,所有实例均不能在使用;openAL、audioQueue都是封装的audioUnit,audioUnit更接近硬件,延迟最低性能最佳

1、设置app是否与其他应用混音
2、手机静音app是否正常播放出声音
3、电话或其他应用抢占音频设备事件处理
4、动态切换音频路由
5、是否支持录音,录音同时是否支持播放

音频中断事件处理复杂,当中断发生时如果音频权限同时被修改会收不到中断恢复消息,从而导致音频播放卡住,因此需要程序回到前台统一处理

播放器状态机

播放器通用接口

  • 创建/销毁播放器(支持多实例)
  • 参数动态配置(渲染模式、解码方式等)
  • 发送指令 (播放、暂定、seek等)
  • 原始码流回调(支持外部渲染)
  • 状态消息回调(缓冲、播放完成、错误等)

相关文章

网友评论

      本文标题:iOS浅谈播放器架构

      本文链接:https://www.haomeiwen.com/subject/gssoultx.html