Android 深入系统完全讲解(30)

news2024/9/28 19:26:05

下图是生命周期的说明图:如图可以看到:
在这里插入图片描述

  1. 当创建编解码器的时候处于未初始化状态。首先你需要调用 configure(…)方法让它处于
    Configured 状态,然后调用 start()方法让其处于 Executing 状态。在 Executing 状态下,你就
    可以使用上面提到的缓冲区来处理数据。
  2. Executing 的状态下也分为三种子状态:Flushed, Running、End-of-Stream。在 start() 调用
    后,编解码器处于 Flushed 状态,这个状态下它保存着所有的缓冲区。一旦第一个输入 buffer
    出现了,编解码器就会自动运行到 Running 的状态。当带有 end-of-stream 标志的 buffer 进
    去后,编解码器会进入 End-of-Stream 状态,这种状态下编解码器不在接受输入 buffer,但
    是仍然在产生输出的 buffer。此时你可以调用 flush()方法,将编解码器重置于 Flushed 状态。
  3. 调用 stop()将编解码器返回到未初始化状态,然后可以重新配置。 完成使用编解码器后,
    您必须通过调用 release()来释放它。
  4. 在极少数情况下,编解码器可能会遇到错误并转到错误状态。 这是使用来自排队操作的
    无效返回值或有时通过异常来传达的。 调用 reset()使编解码器再次可用。 您可以从任何状
    态调用它来将编解码器移回未初始化状态。 否则,调用 release()动到终端释放状态。

MediaCodec API 说明
MediaCodec 可以处理具体的视频流,主要有这几个方法:
getInputBuffers:获取需要编码数据的输入流队列,返回的是一个 ByteBuffer 数组
queueInputBuffer:输入流入队列
dequeueInputBuffer:从输入流队列中取数据进行编码操作
getOutputBuffers:获取编解码之后的数据输出流队列,返回的是一个 ByteBuffer 数组
dequeueOutputBuffer:从输出队列中取出编码操作之后的数据
releaseOutputBuffer:处理完成,释放 ByteBuffer 数据三、MediaCodec 流控
流控基本概念
流控就是流量控制。为什么要控制,因为条件有限!涉及到了 TCP 和视频编码:
对 TCP 来说就是控制单位时间内发送数据包的数据量,对编码来说就是控制单位时间内输
出数据的数据量。
TCP 的限制条件是网络带宽,流控就是在避免造成或者加剧网络拥塞的前提下,尽可能利用
网络带宽。带宽够、网络好,我们就加快速度发送数据包,出现了延迟增大、丢包之后,就
放慢发包的速度(因为继续高速发包,可能会加剧网络拥塞,反而发得更慢)。
视频编码的限制条件最初是解码器的能力,码率太高就会无法解码,后来随着 codec 的发
展,解码能力不再是瓶颈,限制条件变成了传输带宽/文件大小,我们希望在控制数据量的
前提下,画面质量尽可能高。
一般编码器都可以设置一个目标码率,但编码器的实际输出码率不会完全符合设置,因为在
编码过程中实际可以控制的并不是最终输出的码率,而是编码过程中的一个量化参数
(Quantization Parameter,QP),它和码率并没有固定的关系,而是取决于图像内容。
无论是要发送的 TCP 数据包,还是要编码的图像,都可能出现“尖峰”,也就是短时间内出
现较大的数据量。TCP 面对尖峰,可以选择不为所动(尤其是网络已经拥塞的时候),这没
有太大的问题,但如果视频编码也对尖峰不为所动,那图像质量就会大打折扣了。如果有几
帧数据量特别大,但仍要把码率控制在原来的水平,那势必要损失更多的信息,因此图像失
真就会更严重。
Android 硬编码流控
MediaCodec 流控相关的接口并不多,一是配置时设置目标码率和码率控制模式,二是动态
调整目标码率(Android 19 版本以上)。配置时指定目标码率和码率控制模式:
码率控制模式有三种:
CQ 表示完全不控制码率,尽最大可能保证图像质量;
CBR 表示编码器会尽量把输出码率控制为设定值,即我们前面提到的“不为所动”;
VBR 表示编码器会根据图像内容的复杂度(实际上是帧间变化量的大小)来动态调整输出
码率,图像复杂则码率高,图像简单则码率低;

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

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

相关文章

LCHub:全新华为云Astro低代码平台,重塑企业数字化转型

为什么技术创新与业务突破难以挂钩?为什么寻求的卓越成果总难以实现?华为云Astro呈上解决之道,抓住重点一招致胜,让人人皆可高效开发,使创新按照你的步调进行。 华为云Astro低代码平台,重塑企业数字化转型 当企业倍受数字化升级困扰时,若仍延用传统编码开发,则会阻碍整…

Bootstrap4 之栅格系统

Bootstrap4 之栅格系统参考描述栅格系统(网格系统)原理容器.container 与视口宽度行列样式栅格等级网格宽度特点左对齐另起一行自适应布局对齐垂直对齐行列水平对齐排列响应式优先级偏移显隐参考 项目描述Bootstrap 入门经典珍妮弗、凯瑞恩Bootstrap 基…

内存屏障由来的理解和使用《编程高手必学的内存知识》学习笔记 Day 5

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3《深入浅出计算机组成原理》学习笔记 Day 4 文章目录系列文章目录前言一、概念理解(…

JUC面试(六)——Java锁

Java锁 公平锁和非公平锁 概念 公平锁 是指多个线程按照申请锁的顺序来获取锁,类似于排队买饭,先来后到,先来先服务,就是公平的,也就是队列 非公平锁 是指多个线程获取锁的顺序,并不是按照申请锁的顺…

steam搬砖项目,每天1-2小时,月入1w+(内附教学资料)

steam搬砖就非常合适,最大的优点,操作性简单,0门槛也不用担心,一台电脑就能搞定。利用空余时间完成就可以 话不多说,先上目录,以便大家阅读~ 一.steam搬砖玩法 1、steam搬砖项目介绍 2、项目原理与产出…

ROS2机器人编程简述humble-第二章-Parameters .3.4

ROS2机器人编程简述humble-第二章-Launchers .3.3机器人程序通常需要配置各类参数,官网和一些书中都有介绍。概述ROS中的参数与各个节点相关。参数用于在启动时(以及运行时)配置节点,而无需更改代码。参数的生存期与节点的生存期相…

【区块链】深入剖析免费赚钱app的本质

你对免费赚钱软件好奇吗?前言一、揭开“免费赚钱app”神秘面纱1.常见的赚钱app2.app真的在做慈善吗?3.羊毛党的价值4.真正的游戏规则二、区块链1.哈希算法2.互联网挖矿三、深入探讨“区块链”的套路1.免费赚钱app真正的价值2.虚拟货币的本质3.虚拟货币泡…

Java设计模式-观察者模式/观察者模式适合那些场景?怎么使用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 6.7 观察者模式 6.7.1 定义 又称发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象主体对象在状态变化…

[前端笔记——CSS] 9.CSS处理文件的标准流程+DOM

[前端笔记——CSS] 9.CSS处理文件的标准流程DOM1.CSS处理文件的标准流程2.关于DOM2.1 举个例子2.2 应用 CSS 到 DOM1.CSS处理文件的标准流程 当浏览器展示一个文件的时候,它必须兼顾文件的内容和文件的样式信息,CSS处理文件的标准流程如下: …

06_FreeRTOS临界区代码保护

目录 临界段代码保护简介 临界段代码保护函数介绍 任务级临界区函数详解 中断级临界区函数详解 临界段代码保护简介 什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段 适用场合如: 1.外设:需严格按照时序初始化的外设:IIC、SPI等等 2.系统…

国家发明专利:基于改进型黏菌优化算法的业务资源分配方法

国家发明专利:基于改进型黏菌优化算法的业务资源分配方法 摘要 本发明公开了一种基于改进型黏菌优化算法的业务资源分配方法,其步骤包括:1将生产任务分成若干个环节,构建有向环状分配网络;2构建工厂参数矩阵并归一化&…

力扣98.验证二叉搜索树

文章目录力扣98.验证二叉搜索树题目描述算法思路代码实现力扣98.验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 …

领域驱动设计(DDD)的几种典型架构介绍

我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢? 一、专业术语 各种服务 IAAS:基础设施服务,Infrastructure-as-a-service PAAS:平台服务&#xff0c…

【Java寒假打卡】JavaWeb-Servlet基础

【Java寒假打卡】JavaWeb-Servlet基础介绍servlet快速入门servlet的执行过程servlet关系视图Servlet实现方式-继承HTTPSERVLETServlet的生命周期线程安全问题servlet的映射方式案例-多路径映射问题-指定名称的方式Servlet的创建时机默认Servlet介绍 servlet是运行在Java服务器…

免费分享一套 SpringBoot + Vue + ElementUI 的人力资源管理系统,挺漂亮的

大家好,我是锋哥,看到一个不错的SpringBoot Vue ElementUI 的人力资源管理系统,分享下哈。 项目介绍 项目背景 人力资源管理是企业运营中必不可少的一环,它关系到企业的前途与发展。尤其对于中小微企业来说,对企业…

积分分离PID控制算法及仿真-1

在普通 PID 控制中引入积分环节的目的,主要是为了消除静差,提高控制精度。但在过程的启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,致使控制量超过执行机构可能允许的最大动作…

Vue项目基础环境搭建完整步骤

使用vue官方脚手架(vue-cli) vue-cli简介 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,是一个官方脚手架,可以帮助我们快速创建vue项目工程目录,目前最新版本4.x。 Vue CLI 致力于将 Vue 生态中的工具基础标准化。它确保了各种构建…

第三天总结 之 商品管理界面的实现 之 模糊查询 与 数据在页面展示

商品管理界面的实现 模糊查询 第一步: 明确 查询时 需要的 条件 即sql语句中 where 后的条件 如 : 根据前端 可以发现 模糊查询可以通过 商品名称 日期 商品类型 来查询 所以在对应的controller层下的GoodsFuzzySelectServlet中首先要获取这三个属性的…

《深入浅出计算机组成原理》学习笔记 Day6

二进制编码1. “逢二进一”2. 字符串的表示参考1. “逢二进一” 把一个二进制数对应到十进制,就是把从右到左的第 N 位,乘上一个2 的 N 次方,然后加起来,就成了一个十进制数。从右到左的位置,是从 0 开始的。 例如&a…

初识C语言:IDE的选择与使用【C语言】

本文是本专栏【C语言】的第一篇文章,也是博主最近半年以来的更新第一篇文章,如果觉得有帮助,可以点赞支持一下!另外本专栏最后会做一篇类似于【python爬虫】专栏最后的那篇整合的文章,把C语言的所有基础知识用一篇文章…