Multimedia-播放器-架构2

news2024/11/26 0:25:40

目录

引言

问题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.coloradmin.cn/o/969802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

桂理理工大题

#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",&…

Jdk8 动态编译 Java 源码为 Class 文件(三)

Jdk8 动态编译 Java 源码为 Class 文件 一.JDK版本二.工程介绍1.依赖2.启动类3.配置类&#xff08;用于测试依赖注入&#xff09;4.工具类1.Java 源码文件读取类2.SpringBoot 容器实例管理类 5.测试类1.抽象类2.接口类3.默认抽象实现4.默认接口实现 6.接口类1.测试接口2.类重载…

数学建模:模糊综合评价分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;模糊综合评价分析 文章目录 数学建模&#xff1a;模糊综合评价分析综合评价分析常用评价方法一级模糊综合评价综合代码 多级模糊综合评价总结 综合评价分析 构成综合评价类问题的五个…

Emmet 使用笔记小结

Emmet 使用笔记小结 最近在跟视频走 CSS 的教程&#xff0c;然后要写很多的 HTML 结构&#xff0c;就想着总结一下 Emmet 的语法。 Emmet 是一个工具可以用来加速 HTML 和 CSS 的开发过程&#xff0c;不过 emmet 只支持 HTML & XML 文件结构&#xff0c;所以我个人觉得对…

【JavaSE】面试01

文章目录 1. JDK、JRE、JVM之间的关系2. 补充3. 面试题&#xff1a;重载和重写的区别&#xff1f;4. super和this5. &#xff08;重点&#xff01;&#xff01;&#xff09;若父类和子类均有静态代码块、实例代码块以及无参构造方法&#xff0c;则继承关系上的执行顺序&#xf…

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

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

Python字节码文件

迷途小书童的 Note 读完需要 5分钟 速读仅需 2 分钟 大家好&#xff0c;我是迷途小书童&#xff01; 今天给大家介绍一个神奇的文件 -- pyc 文件&#xff0c;它能加速 Python 程序的执行速度&#xff0c;同时也能起到保护源码的作用。 1 什么是 pyc 文件? pyc 文件是经过编译的…

PYTHON-“人生重开模拟器“

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是Aileen★。希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f194;本文由 Aileen_0v0★ 原创 CSDN首发&#x1f412; 如需转载还…

SAP-PP:基础概念笔记-5(物料主数据的MRP1~4视图)

文章目录 前言一、MRP1视图Base Unit of Measure&#xff08;UoM&#xff09;MRP 组采购组ABC 指示器Plant-Specific Material Status 特定的工厂物料状态MRP 类型 MRP TypeMRP 类型 MRP TypeMaster Production Scheduling(MPS) 主生产计划基于消耗的计划(CBP)再订货点Reorder-…

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements Runnable{…

介绍几个搜索引擎

Google&#xff1a;全球最大的搜索引擎&#xff0c;提供全面的搜索服务&#xff0c;包括网页、图片、视频、新闻、地图等。 Baidu&#xff1a;中国最大的搜索引擎&#xff0c;提供类似于Google的全面搜索服务&#xff0c;同时也有网盘、知道等功能。 Bing&#xff1a;微软公司…

Linux持续学习者的实用命令:sed

引言 作为一名Linux持续学习者&#xff0c;我们经常需要对文本内容进行处理或修改&#xff0c;这时候sed命令就能派上用场了。sed是一个强大的流式文本编辑器&#xff0c;它可以在读取文本时进行修改并输出&#xff0c;支持各种复杂的字符串替换、内容删除、行插入等操作。在本…

Linux的目录结构特点

Linux的目录结构特点 1、使用树形目录结构来组织和管理文件。 2、整个系统只有一个根目录&#xff08;树根&#xff09;&#xff0c;Linux的根目录用“/”表示。 3、其他所有分区以及外部设备&#xff08;如硬盘&#xff0c;光驱等&#xff09;都是以根目录为起点&#xff0…

[华为云云服务器评测] Unbutnu添加SSH Key、编译启动Springboot项目

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 第二章 [linux实战] Unbutnu添加SSH Key、启动Springboot项目 文章目录 系列文章目录前言一、任务拆解二、配置git,添加SSH Key2.1、登录远程主机2.2、配置git用户名和邮箱2.3、生成SSH key2.4、查…

说说redo log 与 undo log

redo log redo log叫做重做日志.用于解决数据库事物提交 还未刷入磁盘,服务器down机导致的数据丢失的问题。 InnoDB作为MySQL的存储引擎&#xff0c;数据存储在磁盘中&#xff0c;如果每次读写数据都要操作磁盘IO效率会很低&#xff0c;为此InnoDB提供了缓存(Buffer Pool)&am…

无涯教程-JavaScript - STDEVP函数

STDEVP函数替代Excel 2010中的STDEV.P函数。 描述 该函数根据作为参数给出的整个总体计算标准偏差。标准偏差是对值与平均值(平均值)的分散程度的度量。 语法 STDEVP (number1,[number2],...)争论 Argument描述Required/OptionalNumber1The first number argument corresp…

文件包含漏洞及漏洞复现

文件包含漏洞 1. 文件包含概述 程序开发人员通常会把可重复使用函数或语句写到单个文件中&#xff0c;形成“封装”。在使用某个功能的时候&#xff0c;直接调用此文件&#xff0c;无需再次编写&#xff0c;提高代码重用性&#xff0c;减少代码量。这种调用文件的过程通常称为…

机器学习与数据分析

【数据清洗】 异常检测 孤立森林&#xff08;Isolation Forest&#xff09;从原理到实践 效果评估&#xff1a;F-score 【1】 保护隐私的时间序列异常检测架构 概率后缀树 PST – &#xff08;异常检测&#xff09; 【1】 UEBA架构设计之路5&#xff1a; 概率后缀树模型 【…

单独创建一个线程并执行

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun(void) {cout << "one STL thread!" << endl; }int main(void) {std::thread thread1(thread_fun);thread1.join();return 0; }其…

数字IC验证——PSS可移植测试用例

PSS是Accellera组织定义的测试用例生成规范&#xff0c;其思想是定义一个抽象模型&#xff0c;EDA工具可以从中生成适用于每个设计层次结构和每个验证平台的测试&#xff0c;即PSS定义了统一的测试场景&#xff0c;而场景的使用可以横跨不同验证层次和配置。 这种特性决定了PSS…