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.rhkb.cn/news/119379.html

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

相关文章

《Web安全基础》04. 文件上传漏洞

web 1:文件上传漏洞2:WAF 绕过2.1:数据溢出2.2:符号变异2.3:数据截断2.4:重复数据 本系列侧重方法论,各工具只是实现目标的载体。 命令与工具只做简单介绍,其使用另见《安全工具录》…

数据艺术:精通数据可视化的关键步骤

数据可视化是将复杂数据转化为易于理解的图表和图形的过程,帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础,本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏,接下来跟随小编的思路走起来~ 1.数据收集和…

Apifox-比postman更优秀的接口自动化测试平台

一、Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台,定位 Postman Swagger Mock JMeter。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、AP…

UE5打完包后,启动程序不能全屏

最近看到ue5的打包程序后不能默认自动全屏,效果如下,发现并不是全屏的,而且就算点击放大也不是全屏 解决办法:设置如下之后在打包就可以了 但是会一直打印错误的日志,不过这个不影响使用 如果本文对你有帮助&#xff0…

说说CDN和负载均衡具体是怎么实现的

分析&回答 什么是 CDN CDN (全称 Content Delivery Network),即内容分发网络。 构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需…

stable diffusion实践操作-文生图

本文专门开一节写文生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 正文 1 liblib SD1.5底模 lora(baihuaniang_1.0) 详细信息: 底模:SD 1.5 Lora:baihuaniang_1.0 正向提示词: Best …

【Python】批量下载页面资源

【背景】 有一些非常不错的资源网站,比如一些MP3资源网站。资源很丰富,但是每一个资源都不大,一个一个下载费时费力,想用Python快速实现可复用的批量下载程序。 【思路】 获得包含资源链接的静态页面,用beautifulsoup分析页面,获得所有MP3资源的实际地址,然后下载。…

数学建模:灰色预测模型

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:灰色预测模型 文章目录 数学建模:灰色预测模型灰色预测算法步骤代码实现 灰色预测 三个基本方法: 累加数列:计算一阶累加生成数列 x ( 1 ) ( k ) …

Win 教程 Win7实现隔空投送

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络&#xff0…

桂理理工大题

#include <stdio.h> #include <stdlib.h>int getMax(int n); int getMin(int n); int range(int n); static int count1; //作为全局变量控制每次的序列号int main(){int num;int i,j;do{printf("输入黑洞数&#xff1a;\n");scanf("%d",&…

uniapp微信小程序用户隐私保护

使用wx.requirePrivacyAuthorize实现微信小程序用户隐私保护。 一、前言 微信小程序官方出了一个公告《关于小程序隐私保护指引设置的公告》。不整的话&#xff0c;后果很多授权无法使用&#xff0c;详见《小程序用户隐私保护指引内容介绍》 。 二、隐私相关设置 1、在 微信…

IntelliJ IDEA的远程开发(Remote Development)

DEA的远程开发功能&#xff0c;可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行&#xff0c;而本地仅运行客户端软件进行常规的开发操作即可&#xff0c;官方给出的逻辑图如下&#xff0c;可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…

react轮播图

这里 我用的是组件&#xff1a; 网址&#xff1a;Collapse 折叠面板 - Ant Design Mobile 1.首先 先声明一个变量 2、把需要的数据存存进去 3、组件内容复制过来&#xff08;这里用到的是map循环&#xff09; 然后图片就出来了 就是这个简单 哈哈哈哈&#xff01;&#xff01…

浅析ARMv8体系结构:异常处理机制

文章目录 概述异常类型中断终止Abort复位Reset系统调用 异常处理流程异常入口异常返回异常返回地址 堆栈选择 异常向量表异常向量表的配置 同步异常解析相关参考 概述 异常处理指的是处理器在运行过程中发生了外部事件&#xff0c;导致处理器需要中断当前执行流程转而去处理异…

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 尽管如此&#xff0c;还有读者反馈说&#xff0c;尽管已经成功安装&#xff0c;但生成的图片与我展示的结果相去甚远。真实感和质感之…

中间件环境搭建配置过程解读

中间件环境搭建 目录 中间件环境搭建xampp 搭建环境Tomcat环境配置安装mysql连接mysql 问题解决 xampp 搭建环境 安装xampp服务集成环境工具 官网地址下载项目压缩包&#xff0c;将项目文件夹放在xampp安装目录的htdocs文件夹下初始化xampp&#xff1a;运行目录内的setup_xamp…

如何解决分库分表主键问题?

分析&回答 从问题角度出发&#xff1a;我们需要一个全局唯一的 id 来支持&#xff0c;排序问题等。这都是你实际生产环境中必须考虑的问题。可以先看下我们之前的文章分布式系统唯一ID如何生成&#xff1f; 雪花算法和雪花算法的变种是大家常用的 喵呜面试助手&#xff1…

企业架构LNMP学习笔记11

Nginx配置文件的介绍&#xff1a; #nginx子进程启动用户 #user nobody; #子进程数量 一般调整为cpu核数或者倍数 worker_processes 1; #错误日志定义 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#进程pid 存储文件…

Solidity 小白教程:5. 变量数据存储和作用域 storage_memory_calldata

Solidity 小白教程&#xff1a;5. 变量数据存储和作用域 storage_memory_calldata Solidity 中的引用类型 引用类型(Reference Type)&#xff1a;包括数组&#xff08;array&#xff09;&#xff0c;结构体&#xff08;struct&#xff09;和映射&#xff08;mapping&#xff…

使用boost::geometry::union_ 合并边界(内、外):方案二

使用boost::geometry::union_ 合并边界&#xff08;内、外&#xff09;&#xff1a;方案二 typedef boost::geometry::model::d2::point_xy<double> boost_point; typedef boost::geometry::model::polygon<boost_point> boost_Polygon;struct Point {float x;floa…