Multimedia-播放器-架构2

目录

引言

问题1:

数据缓冲区 + 多线程模型

缓冲区的特点:

点播和直播场景中的缓冲区:

问题2:

同步方式

同步实现过程


引言

上一篇梳理了播放器的基本工作与处理流程,本片内容主要梳理一下其中会遇到的问题?

设计和实现一个播放器需要包含功能接口?

问题1:

按照基本流程,可以采用单线程进行串行处理。这里面的环节比较多,当中的任何一个环节出现一些异常,都会体现在整个处理流程上。单个线程处理的时候,会有网络延迟,处理延迟等因素,必然让CPU在延迟的时候无任务可做,只能待机等待任务,这样就会导致CPU的使用效率大大降低。有什么解决方案吗?

解决方案:数据缓冲区 + 多线程模型

数据缓冲区 + 多线程模型

多线程是并发并行工作的,显然提高了CPU的利用率,提高了整体效率。

然而,多个线程的工作结果怎么实现需要的串行化的处理的效果呢?

答案是通过缓冲区的管控来实现。回顾一下处理流程与多线程模型:

对于解码线程和渲染线程而言,直接使用的数据就是缓冲区的数据,当有网络抖动等,读文件线程没有数据源数据时,还可以依靠缓冲区的数据正常运行,待异常恢复后又可以继续进行数据缓冲。这就是抵御网络延迟,编解码延迟的基本原理。

假设没有这些缓冲区的话,那么这几个线程就无法并行工作了。还是跟单线程一样串行等待。有了缓冲区,对于各个线程而言,直接使用的数据还是缓冲区的数据,所以只要缓冲区有数据,线程就可以开工正常处理自己的工作。还是回到上面的问题,这缓冲区是怎么协同工作,以满足到各个线程数据需求的呢?就是生产者-消费者的模式来实现的。具体生产者-消费者的设计模式后续再补上。

小结一下多线程 的方案因为多线程并行执行可以解决了处理效率问题,而我们整个数据流处理流程是串行的。那么采用了缓冲区队列的方式,就可以让并行处理生产结果 提供给 每个串行处理节点进行消费。这么说来缓冲区支撑了播放器的多线程处理实现,同时也有效解决了网络抖动,解码抖动的问题。

缓冲区的特点:

1)缓冲区越大 -> 抗抖动能力越强

2)缓冲区越大 -> 内存占用越高

3)缓冲区越大 -> 播放延时越大

点播和直播场景中的缓冲区:

在点播场景中,用户希望画质音质有更好的体验,所以缓冲区可以设置大一些。

在直播场景中,用户希望流畅的音视频更重要,所以需要尽量减小延迟,这样就可以对相关的缓冲区配置小一些。或者调整一下水位以使实时性更好。

问题2:

播放时,音频和视频的同步是怎么做到的呢?

音画同步是指播放器正在渲染的每一帧画面和正在播放的每一段声音都是严格对应起来的,不存在人耳和肉眼可以分辨出来的偏差。

首先梳理一下几个音视频相关的概念:

视频帧:视频帧可以简单理解为一帧对应的是一幅图像

音频帧:音频帧的概念和视频帧的概念不一样,音频帧对应声波截取(采样)的一段波形。
帧大小/采样率 = 一帧的时长

DTS:解码时间戳
PTS:显示时间戳
GOP: Group of pictures图片组,以 I 帧为起始点,其他为 P 帧和 B 帧
IDR:GOP的第一帧

对于用网络传输音视频流媒体的数据的方式而言,都是经过编码压缩才能让数据量变小,更容易传播,然后传播到客户端后经过解压缩编码出音频帧和视频帧数据后,再进行播放。

音视频同步就是针对时间戳来进行同步的。

具体的同步原理先不细说了。

同步方式

包括三种:

1)视频同步音频
2)音频同步视频
3)音视频同步外部时钟

由于人耳对声音的敏感度较人眼对图像的敏感度强,所以一般会让视频来配合音频。声音快了图像补偿,声音慢了图像丢弃。

同步实现过程

同步大概实现过程:
1)获取音视频两个相关指标:音频采样率,视频帧率
2)计算音频和视频的每帧播放时长:音频每帧持续时间(ms)= 每帧采样数(帧大小) / 采样率 *1000;视频每帧持续时间(ms) = 1000/帧率
3)调整音视频实现同步:调整到音频和视频每帧播放速度基本相等

https://blog.csdn.net/melody157398/article/details/112855633
https://tencentcloud.csdn.net/64d9f4b19ce083432426a546.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/101581.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宠物行业如何进行软文营销

如今,宠物已经成为了人们生活中不可或缺的一部分,大众对于萌宠的喜爱与日俱增,随着“萌宠经济”升温,越来越多的商机开始出现,伴随着宠物市场竞争的日益激烈,宠物行业的营销光靠硬广告很难吸引受众&#xf…

【C++二叉树】进阶OJ题

【C二叉树】进阶OJ题 目录 【C二叉树】进阶OJ题1.二叉树的层序遍历II示例代码解题思路 2.二叉搜索树与双向链表示例代码解题思路 3.从前序与中序遍历序列构造二叉树示例代码解题思路 4.从中序与后序遍历序列构造二叉树示例代码解题思路 5.二叉树的前序遍历(非递归迭…

Matlab进阶绘图第27期—水平双向堆叠图

在上一期文章中,分享了Matlab双向堆叠图的绘制方法: 进一步,再来看一下水平双向堆叠图的绘制方法(由于Matlab中未收录水平双向堆叠图的绘制函数,因此需要大家自行设法解决)。 先来看一下成品效果&#xff…

[HNCTF 2022] web 刷题记录

文章目录 [HNCTF 2022 Week1]easy_html[HNCTF 2022 Week1]easy_upload[HNCTF 2022 Week1]Interesting_http[HNCTF 2022 WEEK2]ez_SSTI[HNCTF 2022 WEEK2]ez_ssrf[HNCTF 2022 WEEK2]Canyource [HNCTF 2022 Week1]easy_html 打开题目提示cookie有线索 访问一下url 发现要求我们…

Vue教程

官网vue快速上手 vue示例图 请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 代码:LearnVue

【核心复现】基于合作博弈的综合能源系统电-热-气协同优化运行策略(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

OpenCV(二十八):连通域分割

目录 1.介绍连通域分割 2.像素领域介绍 3.两遍法分割连通域 4.连通域分割函数 1.介绍连通域分割 连通域分割是一种图像处理技术,用于将图像中的相邻像素组成的区域划分为不同的连通域。这些像素具有相似的特性,如相近的灰度值或颜色。连通域分割可以…

java八股文面试[数据库]——索引覆盖

覆盖索引是一种避免回表查询的优化策略: 只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 具体的实现方式: 将被查询的字段建立普通索引或者联合索引,这样的话就可以直接返回索引中的的数据,不需要再通过聚…

手写Spring:第2章-创建简单的Bean容器

文章目录 一、目标:创建简单的Bean容器二、设计:创建简单的Bean容器三、实现:创建简单的Bean容器3.0 引入依赖3.1 工程结构3.2 创建简单Bean容器类图3.3 Bean定义3.4 Bean工厂 四、测试:创建简单的Bean容器4.1 用户Bean对象4.2 单…

TDengine 官网换了新“皮肤”,来看看这个风格是不是你的菜

改版升级,不同以“网”!为了更好地服务客户,让大家能够更便捷、清晰地了解我们的产品和功能,我们决定给 TDengine 官网换个新“皮肤”~精心筹备下,新官网终于成功与大家见面啦——https://www.taosdata.com/。TDengine…

【开发】安防监控/视频汇聚/云存储/AI智能视频融合平台页面新增地图模式

AI智能分析网关包含有20多种算法,包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等,可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合我们的视频汇聚/安防监控/视频融合平台EasyCVR一起使…

【业务功能篇92】微服务-springcloud-多线程-异步处理-异步编排-CompletableFutrue

三、CompletableFutrue 一个商品详情页 展示SKU的基本信息 0.5s展示SKU的图片信息 0.6s展示SKU的销售信息 1sspu的销售属性 1s展示规格参数 1.5sspu详情信息 1s 1.ComplatableFuture介绍 Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用 isDone方…