问题背景

动态视频流切换是指在视频播放过程中,将输入动态地从一个视频流切换到另一个视频流。具体场景包括:

  • 切换播放画质
  • 插播广告(有多个广告打包插播)
  • 电视剧连续播放
  • 多个点播节目拼接为虚拟直播频道
  • 用户切换播放节目

动态切换播放视频流,需要做到无缓冲、不闪黑屏,声音连续。

方案设计

因为存在插播,直观上需要通过树形结构来描述视频流的关系,但是这样做的复杂度很高,需要寻找简单的模型。

所以我们将流切换任务用线性链表结构来表示,对于插播,需要有两个切换任务:进入插播和退出插播。

流切换任务包含“切换目标流的URL”和“切换类型”。切换类型有下列5种:

  • 平滑切换(时间点接续,用户看到的内容连续)
  • 开始插播(可以递归插播)
  • 退出插播(退出一层插播,对应任务没有URL)
  • 直接切换(前后流没有关联)
  • 追加切换(在末尾接续播放)

使用线性链表结构是方案的关键,有了链表结构,我们可以很容易的实现任务的取消。要取消中间一部分任务,简单的列表删除就可以了。

流切换实现在视频解封装(demux)阶段,用一个MultipleDemuxer管理多个实际的demuxer。

增加一个切换任务,就创建一个新的具体的demuxer(退出插播除外),新的任务在切换前需要准备好(demuxer完成初始化,如mp4流已经获取到头部索引并完成解析),准备过程是异步的。提前准备可以消除切换引起的播放缓冲。

准备完成后,切换任务被顺序处理。根据不同的切换类型,切换处理是不一样的,下面具体分析。

1、平滑切换

平滑切换中,新老视频流需要满足时间戳一致,即同一个时间点对应在音视频内容是一样的(分辨率可以不同,广义分辨率包括视频宽高、颜色深度;音频采样率、声道数,采样深度);不需要编码同步帧位置一致。

根据当前播放流的播放位置,在新的流中寻找该位置的下一个同步帧(一般只需要处理视频,音频每一个帧都是同步帧),以同步帧的时间点(音视频取小者)为切换时间点,设置老流的截止位置。

当前流处理到截止位置时,执行切换,老的流被关闭丢弃。

2、开始插播

根据当前播放流的播放位置,计算下一个同步帧时间点,设置老流的截止位置。

当前流处理到截止位置时,执行切换,老的流不关闭,在插播栈中保存(push);退出插播时,从插播栈取出(pop)恢复处理。

3、退出插播

当前流处理结束后,从插播栈取出插播前的流,恢复处理。

4、直接切换

直接执行切换,老的流被关闭丢弃,新的流从头开始处理。

5、追加切换

当前流处理结束后,执行切换,老的流被丢弃,新的流从头开始处理。

-------------------------------------------------------------------------------------

流切换还需要decode阶段的配合处理,decode阶段需要根据demux阶段给出的切换提示,重新创建解码器。根据不同的切换类型,对老流的音视频数据也有不同的处理策略,比如decode前后有队列缓存,对于“直接切换”需要清空。

动态视频流切换的处理策略相关推荐

  1. spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换

    每一个请求与其他的用户是面对不同的数据库,这就需要用到动态数据源切换,来满足不同数据库.不同数据表(不同数据源)的灵活调用. 动态数据源切换 满足mysql.oracle等主流数据库进行动态数据源切换 ...

  2. 动态数据源切换--AbstractRoutingDataSource

    转载自http://blog.csdn.net/x2145637/article/details/52461198 在Spring 2.0.1中引入了AbstractRoutingDataSource ...

  3. Spring(AbstractRoutingDataSource)实现动态数据源切换

    参考:http://linhongyu.blog.51cto.com/6373370/1615895 一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目A中 ...

  4. Spring(AbstractRoutingDataSource)实现动态数据源切换--转载

    原始出处:http://linhongyu.blog.51cto.com/6373370/1615895 一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目 ...

  5. 复杂网络下多码率视频流切换关键技术

    本文整理自LiveVideoStack线上分享第三季,第十二期,由京东云架构师张树军从基础出发,为大家阐述多码率视频流切换技术的原理与实现方式,并结合京东云视频云的实践,分析多码率帧对齐技术原理及其在 ...

  6. LiveVideoStack线上分享第三季(十二):复杂网络下多码率视频流切换关键技术...

    今晚7:30,LiveVideoStack线上分享第三季,第十二期,京东云 架构师,张树军将从基础出发,阐述多码率视频流切换技术的原理与实现方式,并结合京东云视频云的实践,分析多码率帧对齐技术原理及其 ...

  7. springboot动态数据源切换(多数据源配置)

    动态数据源切换即多数据源切换,由于业务的需要或者历史的遗留等原因,一个项目中配置了多个数据库,用于查询不同类型的数据,因此我们就需要经常在各个库中切换数据源,接下来我们将进行具体的说明: 项目结构如下 ...

  8. HTML中动态图片切换JQuery实现

     相信很多同学都注意到了,各大新闻或者娱乐网站都含有动态图片切换,那个漂亮的感觉让刚刚学习html的人,都非常好奇和心动.那下面就让我们看一下到底如何实现动态图片切换呢?看一下百度贴吧的效果图吧~ ...

  9. 中国游戏社区市场发展动态及十四五发展策略分析报告2022年版

    中国游戏社区市场发展动态及十四五发展策略分析报告2022年版   第一章 2016-2021年中国游戏社区行业发展概述 12 第一节 游戏社区行业发展情况概述 12 一.游戏社区行业相关定义 12 二 ...

最新文章

  1. ubuntu利用apt-get卸载软件
  2. 傅里叶分析(matlab)
  3. VMware 在ubuntu-18.04.2安装搜狗输入法
  4. new to python什么意思_Python中__new__的作用
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的高校运动会管理系统
  6. 安装jenkins环境之jdk8
  7. pd虚拟机提示 “无法连接到 Parallels 服务” 怎么解决?
  8. Deepin Linux 设置开机自动进入命令行模式
  9. 【公司邮箱怎么注册】Foxmail帐户邮箱数据保存在什么地方?如何备份一个帐户?
  10. 企业公司Discuz模板
  11. 玩游戏计算机配置,电脑玩游戏主要看什么配置 玩大型游戏电脑配置推荐
  12. 计算机的专业课听不懂怎么办,为什么大学计算机课难以听懂?
  13. java-php-python-ssm智能健身房管理计算机毕业设计
  14. 透视全球AI治理十大事件:站在创新十字路口,人工智能会失控吗?
  15. 陈年咖啡豆是什么?陈年咖啡能喝吗?陈年咖啡有什么特别的?
  16. 什么是android应用程序未安装,应用程序未安装,教您安卓系统应用程序未安装怎么解决...
  17. AFN的简单介绍及使用
  18. 基于51单片机的交通灯控制系统课程设计(含proteus仿真图及代码)
  19. Kafka的offset自定义存储实现
  20. python问题中国五城市pm2.5_数据之路- 中国五城市PM2.5数据解读

热门文章

  1. 自定义expendableListView实现与QQ联系人一样效果的通讯录
  2. redis的过期键删除策略
  3. html怎么引轮播图插件,原生js写一个无缝轮播图插件(支持vue)
  4. 20条技巧,让Chrome超越Firefox (2010-11-16更新)
  5. springcloud五大神兽及其原理
  6. 【离散数学】1. 数理逻辑
  7. 读王垠《一种新的操作系统设计》
  8. 使用vue+electron创建桌面软件(一)
  9. java虚拟机笔记—运行时数据区域
  10. 【2021-11-08 更新】【梳理】简明操作系统原理 第二十章 加密(docx)