Android视音频知识

news2024/11/24 0:53:47

Android视音频知识

  1. 视音频完整解码播放流程分析。

在这里插入图片描述

  1. 视音频完整录制编码流程分析。

在这里插入图片描述

  1. 为什么要编码,如何编码(编码原理) ?。

    为什么要编码? 因为视频文件实在太大了,一部电影 200多个GB,编码:1G

视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。 由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。
这么多连续的图像数据如果不经过编码的数据量太大了。
比如一个1920x1080分辨率,32位,每秒30帧的视频,一秒钟需要1920108032*30,大小大概为237MB 数据。

在这里插入图片描述

如何编码

在这里插入图片描述

编码的目的:

编码的目的,就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的 核心思想就是去除冗余信息。

空间冗余 == 相邻像素重复:

空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。

时间冗余 == 帧之间差值:

时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。

视觉冗余 == 人类不敏感的颜色:深红色和浅红色OK,但是:红色偏一点点橘红色,你还分得清楚吗?

视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。

信息熵冗余 == 熵编码-哈夫曼算法

信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特
数要大,它们之间的差距就是信息熵冗余,或称编码冗余。

知识冗余 == 人类(头 身体 腿),汽车,房子 不需要记录

知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。

I帧 P帧 B帧 压缩思路:

I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像; (压缩率最低)

P帧:前向预测/参考 编码帧,记录了本帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画 面叠加上本帧定义的差别,生成最终画面。
(压缩率比I帧高,比B帧低 属于 适中情况)

B帧:双向预测/参考 编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要 后面的P帧才能解码一张完整的图像。
(参考前后的预测得到的,压缩率是最高,但是耗时)

在这里插入图片描述

4.H.264进制数据分析。

编码标准:

H.264 == MPEG-4 - AVC
HEVC == H.265 [H.264基础上 加入了更多的算法 = = 压缩的更小]

在这里插入图片描述

H.264分层结构(VCL与NAL)

VCL:

VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示,
VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。

NAL:

NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和 传送,
是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。

VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。

在这里插入图片描述

NAL( 片 (宏块) )

一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块)。

在这里插入图片描述

一般H.264编码器的默认输出为:起始码+NALU(Nal单元)。起始码为:0x00000001或者0x000001。
一个NALU(PPS, I帧,B帧,P帧) 为什么需求起始码,0x00000001或者0x000001 ?
答:因为每一个NALU都需要分隔,要分隔帧操作,就相对于写文章断句一样 为什么 0x00000001或者0x000001。 两种起始码 ?
答:0x00000001 起始码代表:一个NALU里面有很多片。 0x000001 起始码代表: 一个NALU里面一个片可以搞定。
反正你必须明白,遇到0x00000001或者0x000001,就是NALU的起始码来了

每个NALU 包含(起始码 与 1个字节的Nal Header 与 若干整数字节的负荷数据EBSP构成)

在这里插入图片描述

在这里插入图片描述

真正开发中:只分析:SPS序列参数集,PPS图像参数集,I帧

0x67 十六进制的写法, 67

为什么区低五位?

答:不得不说,一个字节的八位

0 1 1 0 0 1 1 1

SPS 序列参数集(记录有多少I帧,多少B帧,多少P帧,帧是如何排列) == 7 00 00 00 01 67,0x67 —>
2进制01100111 —> 取低五位 00000111 —> 十六进制 0x07

PPS 图像参数集(图像宽高信息等) == 8 00 00 00 01 68, 0x68 —> 2进制01101000—> 取低五位
00001000 —> 十六进制 0x08

SEI补充信息单元(可以记录坐标信息,人员信息, 后面解码的时候,可以通过代码获取此信息)
https://blog.csdn.net/y601500359/article/details/80943990 00 00 01 06
, 0x06 —> 2进制00000110—> 取低五位00000110 —> 十六进制 0x06

00 00 00 65, 0x65 —> 2进制01100101—> 取低五位00000101 —> —> 十六进制
0x06 最终是 5 I帧完整画面出来

0x01 == 普通P帧 和 重要P帧 ,还有B帧

00 00 00 01 61 重要的P帧

00 00000161—> 2进制01100001—>取低五位00000001—>—> 十六进制0x01
00 00000141—> 2进制01000001—>取低五位00000001—>—> 十六进制0x01

B帧:

00 00 00 01 01 —> 2进制00000001—> 取低五位00000001 —> —> 十六进制 0x01

05.PTS与DTS:

DTS表示解码时间戳,在什么时候解码这一帧的数据 ;
PTS表示显示时间戳 ,在什么时候显示这一帧。
在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不同。

在这里插入图片描述

I帧 p b p b p b b p I帧 == GOP

I帧之间分为一组

I P B P B P B P B I 一组

i帧=GOP是什么理解的?
SPS PPS I P B P B P B P B I 一组
SPS PPS I P B P B P B P B I 二组

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

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

相关文章

【Linux】chmod 命令使用

chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令。 chmod命令 -Linux手册页 著者 作者:David MacKenzie和Jim Meyering。 语法 chmod [选项] [模式] 文件或目录 Linux/Unix 的文件调用权限分为三级 : 文件所有者…

Spring-AOP-加强

目录 简略介绍 AOP是如何实现的 实现时机 实现原理 简略介绍 AOP(Aspect-Oriented Programming),即面向切面编程,用人话说就是把公共的逻辑抽出来,让开发者可以更专注于业务逻辑开发和IOC一样,AOP也指的是一种思想AOP思想是OO…

自动化测试框架中如何记录日志更加已读 ?一文介绍使用loguru来管理日志的心得。

只要做代码开发,记录日志必不可少的 ,对于像我这样的测试开发同学也是 ,你在编写自动化时如何记录日志 ?怎么要日志记录更容易已读 ?如何备份日志文件 ? 这都是我们在编写代码时要考虑的问题 ,如…

JNI 的数据类型以及和Java层之间的数据转换

JNI的数据类型和类型签名 数据类型 JNI的数据类型包含两种:基本类型和引用类型。 基本类型主要有jboolean、jchar、jint等,它们和Java中的数据类型的对应关系如下表所示。 JNI中的引用类型主要有类、对象和数组,它们和Java中的引用类型的对…

ICC2:如何抓取“no net“的shape和via

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 pr过程中(尤其是eco)会产生一些no net的shape或via,它们会造成drc和lvs问题,但是常规的办法无法把他们抓出来,下面分享可以获取no net的方法…

数字化时代下,汽车行业如何突破现有营销困境?

之前三年的“口罩”时期,给全球和中国汽车市场带来不小影响,汽车销售市场整体下滑,传统营销模式很难适应现阶段汽车营销需求,那么在当下,汽车行业应该如何突破现有营销困境呢?接下来就由媒介盒子跟大家聊聊…

如何同步 Github 和 Gitee的仓库代码

一、从github导入仓库,手动同步 在 Gitee 的项目主页,导入的仓库会会有一个同步的按钮,你只用点一下,即可与 Github 同步更新,但是注意这里的同步功能默认是强制同步。有点麻烦的是,我们需要在推送到 Githu…

推理成本增加10倍?对文心大模型4.0的一些猜想

夕小瑶科技说 原创 作者 | 卖萌酱 大家好,我是卖萌酱。 相信不少小伙伴这几天都听到了消息,在期待下周即将发布的文心大模型4.0。我们的几个读者群里也发生了相关的讨论: 讨论的核心主要围绕以下两个话题展开: 文心4.0能不能打过…

git操作说明

SourceURL:file:///home/kingqi/桌面/git操作说明.doc 本地建立仓库 mkdir namebao cd namebao pwd git init 初始化 cd .git/ gedit config 本地存储 进入目录上传全部文件 git add . 提交 git commit -m “说明” 远程提交 复制gitee或者github仓库链接 可以直…

前端开发tips

vue配置启动项目自动打开浏览器 打开package.json找到启动命令npm run dev 跟npm run serve(这两种命令都可以) 后面增加 --open Vue项目设置路径src目录别名为 Vue2 编辑vue.config.js内容如下: const { defineConfig } require(vue/cli-service)const path…

使用Cython对Python进行提速优化

因为常常使用Python,经常能感觉到和C,Java来说Python的速度太慢了。其中很大程度上是因为Python的类型是动态的,在解释类型方面花了较长时间。在调研过程中,发现给Python提速一个比较可行的方案是用Cython改写。 Cython的原理&am…

零售数据分析师熬夜整理:人、货、场、供、财这样做

在零售数据分析中,人、货、场、供、财数据分析非常重要,它们分别是指人员、商品、场所、供应和财务,对这些要素进行数据分析,可以更好地了解市场需求、优化商品供应链、调整销售策略和提高盈利能力。零售数据量大、分析指标多且复…

蓝桥·算法双周赛

文章目录 三带一数树数分组健身契合匹配奇怪的线段 一、三带一 本题思路:本题看了数据范围可以直接暴力解决。 #include <bits/stdc.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T;std::cin>>T;while(T-…

C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析

Reddit 是一个非常受欢迎的分享社交新闻聚合网站&#xff0c;用户可以在上面发布和内容。我们的目标是抓取 Reddit 首页的数据 JSON&#xff0c;以便进一步分析和使用。 C#技术概述&#xff1a;C#是一种流行的编程语言&#xff0c;它具有流畅流畅的特点&#xff0c;非常适合开发…

用手势识别来测试视力?试试用百度AI来实现想法

文章目录 ⭐ 前言⭐ 灵感来源⭐ 项目准备⭐ 项目实现⭐ 不足与展望 ⭐ 前言 10月17日&#xff0c;以“生成未来&#xff08;PROMPT THE WORLD&#xff09;”为主题的百度世界2023将在北京首钢园举办。百度创始人、董事长兼首席执行官李彦宏将带来以“手把手教你做AI原生应用”…

【微信小程序开发】基础语法篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.视图层 1.数据绑定 wxml js 2 .列…

android CountDownTimer倒计时随时随地开启或关闭

前言 业务上有个需求&#xff0c;在心跳被触发时需要记录一个时间 当心跳断开后120s需要断开连接 如果收到心跳包就重置这个定时器的时间 代码实现 private CountDownTimer mTimer; private boolean mIsTimerRunning false;if (!mIsTimerRunning) {// 启动定时器startTimer…

消息队列学习分享

消息队列学习 消息队列来解决问题 &#xff08;1&#xff09;异步处理 消息通知、日志管理、更新统计数据等步骤 &#xff08;2&#xff09;流量控制 如何避免过多的请求压垮我们的系统&#xff1f; 比如一个秒杀系统&#xff0c;网关在收到请求后&#xff0c;将请求放入…

基于Pytest+Requests+Allure实现接口自动化测试

一、整体结构 框架组成&#xff1a;pytestrequestsallure设计模式&#xff1a; 关键字驱动项目结构&#xff1a; 工具层&#xff1a;api_keyword/参数层&#xff1a;params/用例层&#xff1a;case/数据驱动&#xff1a;data_driver/数据层&#xff1a;data/逻辑层&#xff1a…

数字化时代,数据仓库究竟是干什么的?

无论你是否专门从事大数据开发&#xff0c;作为一个开发人员&#xff0c;应该都听说过数据仓库的概念&#xff0c;那你知道为什么会出现数据仓库&#xff1f;数据仓库究竟是干嘛的吗&#xff1f;有什么价值和意义呢&#xff1f;那么本文就带到入门&#xff0c;揭开数据仓库的面…