音视频开发入门小知识

news2025/5/15 20:54:12

什么是视频

视频就是由一系列图片构成的,当画面快速切换时,人眼看起来就感觉是连贯的动作。

视频帧

帧,表示一张画面,就是一帧。一个视频就是由许许多多帧组成的。

帧率

帧率,表示单位时间内帧的数量,单位为:帧/秒或fps,一秒内包含的帧越多,画面越顺滑,过度越自然。
帧率的一般以下几个典型值:
(1) 24/25 fps:一般的电影帧率
(2) 30/60 fps:游戏的帧率,30帧可以接受,60帧会感觉更加流畅逼真
(3) 85 fps以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大意义

色彩空间

RGB:这个是我们最熟悉的一种,在现在的电子设备中应用广泛。通过R G B三种基础色,可以混合出所有的颜色。
YUV:这是一种亮度与色度分离的色彩格式。早期的电视都是黑白的,即只有亮度值,即Y。有了彩色电视以后,加入了UV两种色度,形成现在的YUV。
Y:亮度,就是灰度值。除了表示亮度信号外,还含有较多的绿色通道量。
U:蓝色通道与亮度的差值。
V:红色通道与亮度的差值。

YUV的优势:人眼对亮度敏感,对色度不敏感,因此减少部分UV的数据量,人眼却无法感知出来,这样可以通过压缩UV的分辨率,在不影响观感的前提下,减小视频的体积。

什么是音频

音频数据的承载方式最常用的是脉冲编码调制,即PCM。声音是一种模拟信号,想要把声音保存下来,那就是把声音数字化,即转换为数字信号。

模拟信号 --> 采样 --> 量化 --> 编码 --> 数字信号

采样率,采样位数和编码

采样率:即采样的频率,采样率要大于原声波频率的两倍,人耳能听到的最高频率为20kHz,所以为了满足人耳的听觉要求,采样率至少为40kHz,通常为44.1kHz。

采样位数:波形振幅在模拟信号上也是连续的样本值,而在数字信号中,信号一般是不连续的,所以模拟信号量化以后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,通常有8位、16位、32位,位数越多,记录的值越准确,还原度越高。

编码:由于数字信号是由0和1组成的,因此,需要将幅度值转换为一系列0和1进行存储,也就是编码,最后得到的数据就是数字信号,一串0和1组成的数据。

声道数

声道数,是指支持能不同发声的音响的个数。
单声道:1个声道
双声道:2个声道
立体声道:默认为2个声道
立体声道(4声道):4个声道

码率

码率,是指一个数据流中每秒钟能通过的信息量,单位bps,码率 = 采样率 * 采样位数 * 声道数

为什么要编码

由于音视频的数据量庞大,如果按照裸流数据存储的话,那将需要耗费非常大的存储空间,也不利于传送。而音视频中,其实包含了大量0和1的重复数据,因此可以通过一定的算法来压缩这些0和1的数据,编码可以大大减小音视频数据的大小,让音视频更容易存储和传送。

视频编码

现在主流的编码格式是H264,H264会根据一段时间内,画面的变化情况,选取一帧画面作为完整编码,下一帧只记录与上一帧完整数据的差别,是一个动态压缩的过程。H264采用的是YUV。

音频编码

原始的PCM音频数据也是非常大的数据量,因此也需要对其进行压缩编码,音频也有许多的编码格式,如:WAV、MP3。AAC是新一代的音频有损压缩技术,一种高压缩比的音频压缩算法。在MP4视频中的音频数据,大多数时候都是采用AAC压缩格式。

音视频容器

像MP4,AVI等,其实是包裹了音视频编码数据的容器,用来把以特定编码标准编码的视频流和音频流混在一起,成为一个文件。
mp4是目前最流行的视频格式,在移动端,一般将视频封装为mp4格式。mp4支持H264视频编码和AAC或MP3等音频编码。

软解码和硬解码的区别

软解码:利用CPU的计算能力来解码,通常如果CPU的能力不是很强的时候,解码速度会比较慢,手机可能出现发热现象,但是,由于使用统一的算法,兼容性会很好。
硬解码:利用手机上专门的解码芯片来加速解码。通常硬解码的解码速度会快很多,但是由于硬解码由各个厂家实现,质量参差不齐,非常容易出现兼容性问题。谷歌官方提供了MediaCodec,供上层应用调用。

MediaCodec

MediaCodec 是Android 4.1版本引入的编解码API,支持音视频的编码和解码。采用了基于环形缓冲区的 生产者-消费者模型,异步处理数据。在 input 端,Client 是这个环形缓冲区生产者,MediaCodec 是 消费者。在 output 端,MediaCodec 是这个环形缓冲区生产者,而 Client 则变成了消费者。

工作流程

在这里插入图片描述

  1. Client 从 input 缓冲区队列申请 empty buffer [dequeueInputBuffer]
  2. Client 把需要编解码的数据拷贝到 empty buffer,然后放入 input 缓冲区队列 [queueInputBuffer]
  3. MediaCodec 从 input 缓冲区队列取一帧数据进行编解码处理
  4. 处理结束后,MediaCodec 将原始数据 buffer 置为 empty 后放回 input 缓冲区队列,将编解码后的数据放入到 output 缓冲区队列
  5. Client 从 output 缓冲区队列申请编解码后的 buffer [dequeueOutputBuffer]
  6. Client 对编解码后的 buffer 进行渲染或播放
  7. 渲染或播放完成后,Client 再将该 buffer 放回 output 缓冲区队列 [releaseOutputBuffer]

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

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

相关文章

KingbaseES数据库 kdb_schedule 自动定时任务

KingbaseES数据库 kdb_schedule 自动定时任务 文章目录KingbaseES数据库 kdb_schedule 自动定时任务前言一 安装插件 kdb_schedule1. 添加kdb_schedule2. 修改kdb_schedule所需参数:3. 重启数据库4. 加载kdb_schedule插件二 dbms_scheduler2.1 创建program创建progr…

(四) 共享模型之管程【Monitor 概念】

一、Java 对象头(P75) 二、原理之 Monitor(锁) Monitor 被翻译为监视器或管程。 每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设…

Cookie Session JSP

这里写目录标题1 Cookie1.1 会话介绍1.2 Cookie 介绍1.3 Cookie 属性1.4 Cookie 方法1.4.1 Cookie 添加和获取1.5 Cookie 的使用1.6 Cookie 的细节2 Session2.1 HttpSession 介绍2.2 HttpSession 常用方法2.3 HttpSession 获取2.4 HttpSession 的使用2.5 HttpSession 的细节3 J…

高压功率放大器在超声驻波声场的听声器中的应用

实验名称:高压功率放大器在超声驻波声场的听声器声压测量中的应用 研究方向:3D打印 测试目的:利用听声器对声场的测量是一种基于对声压的采集,利用CPB分析及FFT分析处理,得到涉入点声压的方法。介于听声器采集信号为时…

单字段纵向分栏

【问题】 Hi, I’m trying to display BIRT report Data (only one field) first vertically till the page ends and then it should continue in the next column of the same page. For example as A E I B F J C G D HBy using list element I’m able to get the data …

opencv上设置摄像头曝光参数的经验

实际应用中我们需要调整摄像头的参数比如曝光,由于opencv的后端是一般编译是支撑多种插件,详细信息请参考OpenCV: Video I/O with OpenCV Overview,这里引用里面的图: 对于VideoCaputure,后端有ffmpge,V4L&…

SpringMVC入门

SpringMVC 一、SpringMVC简介 1、什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bea…

软件工程SSM毕设项目 - 基于SSM的中药店商城网站(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的中药店商…

微信小程序能给花店带来哪些作用_分享花店微信小程序开发优势

在开发过小程序的线下实体店铺中,有不少花店。开发了小程序的花店纷纷表示:"小程序提供了非常大的帮助,现在越来越离不开小程序了"。那么,小程序能给花店带来哪些帮助? 1、提升店铺曝光半径挖掘更多流量 对…

哈希表题目:键盘行

文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题:键盘行 出处:500. 键盘行 难度 2 级 题目描述 要求 给你一个字符串数组 words\texttt{words}words,只返回可以使用在美式键盘…

Scala集合习题Ⅱ

行是知之始,知是行之成。——陶行知 目录 练习题 3 :求出各城市的平均温度 练习题4:请用scala得出以下的结果 练习题 3 :求出各城市的平均温度 val d1 Array(("bj", 28.1), ("sh", 28.7), ("gz"…

RK3588平台开发系列讲解(PWM篇)PWM及backlight的使用方法

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、PWM驱动二、DTS配置三、PWM在user space的使用四、PWM在背光中的使用4.1 Backlight DTS4.2 PWM Backlight 调试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍PWM以及backli…

SpringBoot结合Quartz实现定时任务

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建SpringBoot集成Mybatis项目实操SpringBoot集成MybatisPlus项目实操SpringBoot集成Spring Data JPA项目实操 数据库变更管理 数据库变更管理:Liquibase…

深入讲解Netty那些事儿之从内核角度看IO模型(上)

我们都知道Netty是一个高性能异步事件驱动的网络框架。 它的设计异常优雅简洁,扩展性高,稳定性强。拥有非常详细完整的用户文档。 同时内置了很多非常有用的模块基本上做到了开箱即用,用户只需要编写短短几行代码,就可以快速构建…

8、python中的模块和包

文章目录模块模块导入的方式直接导入部分导入import module 和from module import *的区别模块的其他信息_ _ name _ _ 的特殊使用模块的分类包从包中导入模块的方式模块 模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块 模块是非常简单的Python文…

pandas交叉表与透视表pd.crosstab()和pd.pivot_table()函数详解

一、交叉表 交叉表:用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表),pd.crosstab(value1, value2)pandas.crosstab(index, columns, valuesNone, rownamesNone, colnamesNone, aggfuncNone, marginsFalse, margins_nameAll,…

【虚幻引擎】UE4/UE5 动画蓝图,混合空间,目标偏移,动画蒙太奇之间的联系

一、UE动画介绍 虚幻引擎在为角色设置移动行走时,为了更好的调节和控制人物的相关动画,设置了一系列的跟人物相关的动画,其中包括一维混合空间,二维混合空间,动画蒙太奇,目标偏移等,动画蓝图的出…

Day16--加入购物车-动态设置tabBar的数组徽标

问题1: ①:刚开始 ②:点击购物车的图标后,跳转到cart页面发现,并没有徽标在tabbar上: 提纲挈领: 我的操作: 1》把 Store 中的 total 映射到 cart.vue 中使用: 2》在页面…

Java ArrayLIst与顺序表

什么是集合类? Java当中的集合类,其实就是封装号的数据结构 原始的数据结构——>Java当中封装成的集合对应的那个原始的数据结构——>用Java封装的集合对应的。 集合类所在的包:java.util这个包底下 顺序表的底层是一个数组&#xff0…

Flutter状态管理

前言 状态管理是什么?简单的来说,就是当某个状态发生变化的时候,告知该状态的监听者,让状态所监听的属性随之而改变,达到UI层随着数据层变化而变化的效果。在Flutter中的状态(State)是一个组件的UI数据模型&#xff0…