美文网首页
播放器缓冲、同步策略

播放器缓冲、同步策略

作者: 野码道人 | 来源:发表于2020-01-02 20:58 被阅读0次

1、缓冲策略

ffmpeg有自带缓存区,由于不对外暴露,无法很好的控制,经常出现播放花屏问题,当然我们可以修改源码,但通常做法是,忽略ffmpeg本身缓存区,自己实现缓冲队列,通常播放器底层会有两个队列解码队列(压缩数据) 渲染队列(非压缩数据)由于渲染队列通常有3帧左右的缓存就够了,所以当我们计算播放器的downloadSize的时候,通常说的是解码队列的数据总和,当解码队列为空的时候向上层抛开始缓冲消息,渲染器停止消费,为了播放器顺畅播放(减小卡顿率)当队列里有一定数据的时候抛出缓冲结束消息,渲染器再开始消费

点播:

点播场景一般会在端上架一套缓存系统,我们称之为localserver,作用是实时缓存播放的数据,省端上的流量,由于内存原因播放器会设置解码队列最大值,通常设置为15~20s,即当到达门限的时候不在调用av_read_frame(fmtCtx, &pkt)

直播:

直播场景由于数据是实时产生,通常不会有很多冗余数据,所以解码队列不会设置门限

2、同步

  • 什么是同步播放?
  • 为什么会有不同步现象?
  • 如何实现同步播放?
  • 同步所带来的的问题
  • 同步策略
  • 什么是同步播放?

不同媒体流按照时间戳对齐顺序播放

  • 为什么会有不同步现象?

点播场景媒体文件容器的格式中音视频流并不是严格顺序存储,直播场景采集端音视频不均匀等原因都会导致不同步问题

  • 如何实现同步播放?

由于人体对声音更加敏感,即音频稍有不连续就会被感知,所以音频需要连续播放,视频同步到音频,算法写在视频渲染线程里,核心逻辑实现了音视频同步,视频帧率控制,通过计算Apts、Vpts之间的差值动态调整视频渲染的sleepTime,A-V绝对值控制在60ms以内就能达到同步,帧率控制比较简单,就是根据fps控制两次渲染的时间间隔

  • 同步所带来的的问题

同步会造成延时,由于按音频进行同步,当音频帧间隔较大的时候会造成视频过多堆积,当音频时间戳不连续的时候会造成视频跳帧,因此保证音视频打上正确的时间戳和音视频均匀尤为重要

  • 同步策略

播放器一会有三种同步模式:流畅模式 低延时模式 智能追帧模式

流畅模式:即播放器不丢帧、不追帧,特点是延时高,卡顿率低

低延时模式:丢帧,特点是延时很低可以控制在1秒以内,但是卡顿率会高些

智能追帧模式:不丢帧、追帧,特点是延时稍微高、卡顿率稍微低些

相关文章

  • 播放器缓冲、同步策略

    1、缓冲策略 ffmpeg有自带缓存区,由于不对外暴露,无法很好的控制,经常出现播放花屏问题,当然我们可以修改源码...

  • Android屏幕刷新机制

    3缓冲策略:在android4.1后提供了3缓冲策略。CPU GPU 和display各使用一个buffer。三缓...

  • OutputStream写文件后异常关机,文件写入失败

    fos.getFD().sync() 同步缓冲区数据

  • 进程同步一

    首先我们要知道进程同步分哪两种 同步:进程A向B提供数据,当输入缓冲空时,B不能得到数据而阻塞;反之,当缓冲满时,...

  • 高性能服务器程序框架

    同步I/O模型要求用户代码自行执行I/O操作(将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区...

  • 使用AVPlayer实现自定义视频播放器

    引入头文件 定义三个属性 初始化播放器 播放和暂停的控制 使用kvo监听播放器准备状态和缓冲状态 监听播放结束 下...

  • 缓冲更新策略

    近段时间在学习缓存相关知识的时候,看到了缓存更新策略,于是就根据自己的理解,写下这篇文章 分类 Cache Asi...

  • 自定义UISlider 可以显示缓冲进度

    最近做项目的时候需要实现一个播放器,播放器拖动条需要实现 显示缓冲进度像这样: google上看见一些实现方案,一...

  • RxJava背压

    订阅分为:同步订阅 异步订阅 同步订阅Rxjava1与Rxjava2中 同步订阅没有用到缓冲区,只要上游事件数量不...

  • Java IO

    普通 IO ,面向流,同步阻塞线程。NIO,面向缓冲区,同步非阻塞。 BIO、NIO、AIO的概述首先,传统的 j...

网友评论

      本文标题:播放器缓冲、同步策略

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