Android音视频开发之基础知识

一、视频文件

在这里插入图片描述

1、视频格式

常见格式:mp4、mkv、flv
封装的数据:音频码流、视频码流

常用工具: [FFmpeg下载]:https://ffmpeg.org/download.html
下载、安装并配置环境变量
ffmpeg.exe 视频编解码
ffplay.exe 播放器库
ffprobe.exe 音视频分析工具

2、视频播放—cmd命令

ffplay -i 视频文件目录

回车后开始播放视频
返回信息包含内部包含视频或者音频信息
默认播放Stream #0:0 视频或音频
例如下图:包含两条视频信息(显示Video),无音频信息
在这里插入图片描述
如果想播放第二条视频(Stream #0:1),可执行命令:

ffplay -i 视频目录 -vst 1

3、视频编码

视频就是连续的图像序列,不经过编码的连续图像数据数据量太大。
各种编码方式目的都是为了压缩,使体积更小,便于存储和传输,编码的核心思想就是去除冗余信息。

(1)空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余
(2)时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余
(3)视觉冗余:人眼不能感知或者不敏感的那部分图像
(4)信息熵冗余:也称编码冗余,人们用于表达某一信息的比特数总比理论上表示该信息所需要的最少比特数要大,他们之间的差距就是信息熵冗余,或称编码冗余
熵编码例子:
11112222 8
4142 转换为4个1个2 4 省一半空间
(5)知识冗余:是指在有些图像中还包含与某些验证知识有关的信息

4、H.264码流分析

H.264码流文件分为两层
(1)VCL:视频编码层
负责高效的视频内容表示,VCL数据即编码处理的输出,表示被压缩编码后的视频数据序列。
(2)NAL:网络提取层
负责以网络所需求的恰当的方式对数据进行打包和传送,是传输层,不管在本地播放还是网络播放,都是需要这一层来传输。

VCL就是压缩编码后的原始数据。
VCL数据封装到NAL单元后,才可用于传输或存储
类比:VCL像JavaBean,NAL像Json序列化,经过包装后才能进行数据的传输

.h264文件
一般H.264编码器输出:起始码+NALU(NAL)单元
起始码为:0x00000001或者0x000001
起始码作用:区分每个单元的开头
起始码后面跟的第1个字节是NAL的Header信息,这个字节的低5位表示NALU类型。

5、片、宏块

一帧图片经过编码器之后,就被编码成一个或多个片,每片包含整数个宏块,NAL单元中就是装载着这些片的载体。

二、直播推流实践

1、图像采集

Camera
Camera2
CameraX
NDKCamera

步骤
(1)构建预览布局 SurfaceView或者TextureView,相当于画布来显示摄像头数据
(2)打开相机 Camera.open
(3)设置参数 Camera.Parameters
(4)设置预览数据回调 PreviewCallback
(5)设置预览画布并启动 setPreviewTexture/startPreview
(6)释放相机 stopPreview/release

2、YUV数据

YUV主要应用于优化彩色视频信号的传输,与RGB相比,YUV只需要占用极少的频宽,RGB则需要三个独立频道的信号同时传输。

YUV中Y代表明亮度,也称灰阶值,UV表示的则是色度(色调饱和度)也叫YCbCr
如果只有Y数据的图像就是黑色的,加上UV数据图像就显示成彩色的了。

编码使用YUV而不是RGB的原因:
使用YUV格式才能极大的去除冗余信息,人眼对亮点信息更敏感,对色度敏感度不高。也就是说,可以压缩UV数据,而人眼难以发现。所以压缩算法的第一步就是先把RGB数据转换为YUV数据,对Y少压缩一点,对UV压缩多一点,以平衡图像效果和压缩率

NV21与I420
YUV因为采样和数据排列方式的不同,分为不同的存储方式。

一般摄像头输出为NV21格式,而I420格式则是绝大多数编解码器默认输入输出格式。

NV21数据量的大小是widthheight3/2
NV21数据转I420数据:在这里插入图片描述

3、MediaCodec

可以访问Android底层的多媒体编解码器,例如:编码器/解码器组件

4、持续更新中…

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

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

相关文章

操作系统【OS】线程与进程的比较

进程 线程 是什么的单位? 是资源分配的基本单位 是调度的基本单位 不能共享什么? 不能共享虚拟地址空间 不能共享栈指针 可以共享什么? 拥有一个完整的资源平台 每个进程都有独立的地址空间和资源 除了共享全局变量,不允许其他进程访问 某进程中的线程…

git(部分)

1、git三个区域:工作区,暂存区,版本库 2、git文件状态:未跟踪,已跟踪(新添加,未修改,已修改) 如何查看暂存区和工作区文件状态:git status -s 3、查看版本记…

mysql MVC jsp实现表分页

mysql是轻量级数据库 在三层架构中实现简单的分页 在数据库sql编程中需要编写sql语句 SELECT * FROM sys.student limit 5,5; limit x,y x是开始节点,y是开始节点后的需要显示的长度。 在jdbc编程中需要给出x和y 一般是页数*页码,显示的长度。 代…

FreeRTOS最全教程(目录)

文章目录 前言一、为什么要学FreeRTOS二、FreeRTOS开发和裸机开发的区别三、FreeRTOS入门篇四、FreeRTOS深入篇五、自制FreeRTOS六、FreeRTOS项目开发总结 前言 本篇文章将作为FreeRTOS最全教程的目录使用。 一、为什么要学FreeRTOS 1.嵌入式系统开发: FreeRTOS …

【webpack】wabpack5 知识梳理

1、简单介绍 默认功能 可处理 js、json文件,处理 js 文件引入将其打包; 将es6的import规范编译为浏览器可识别的commonjs规范; 生产环境比开发环境打包多了代码丑化、压缩; 五大核心 入口(entry):指定打包入口&…

【(数据结构)—— 基于单链表实现通讯录】

(数据结构)—— 基于单链表实现通讯录 一.通讯录的功能介绍1.基于单链表实现通讯录(1). 知识要求(2). 功能要求 二.通讯录的代码实现1.通讯录的底层结构(单链表)(1).思路展示(2).底层代码实现(单链表)1.单链表头文件 —— (函数的定义&#x…

【分类讨论】CF1747D

Problem - D - Codeforces 题意 思路 一看这个做法一定就是分类讨论 先判无解 显然,如果区间异或和不是0一定无解 如果区间内全是0,答案一定是0 之后怎么讨论 注意到需要讨论区间长度 如果长度是奇数,那么直接操作即可,答…

【Overload游戏引擎细节分析】鼠标键盘控制摄像机原理

在上文中分析了摄像机类的实现,在计算投影视图矩阵时需要给摄像机输入其位置及转动四元数。这两个量一般通过鼠标键盘来控制,从而达到控制摄像机的目的。本文分析一下其控制原理。 Overload的摄像机控制实现在类CameraController中,其有三个个…

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据

您是否正在寻找最好的 iPad 恢复软件,但不知道哪个选项最好?没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外,前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…

ArmSoM-W3之RK3588硬编解码MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不 同芯片的差异,为使用者…

基于Java+Springboot+Vue前后端分离的商品库存销售管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 当今社会,…

Python--循环中的两大关键词 break 与 continue

在Python循环中,经常会遇到两个常见的关键词:break 与 continue break:代表终止整个循环结构 continue:代表中止当前本次循环,继续下一次循环 break: 英 /breɪk/ v. 打破,打碎&#xff0c…

看《软能力》的读后感

最近在图书大夏看了一本书的一部分,书名是《软能力》。本人看到了几个有意思的观点。一是接一些兼职项目。 二是分享自己的技术,让同事能干自己的工作,让自己的工作变得别人也能干,才有机会让自己的职位提升。 三是让手动操作变…

使用imx 8m 测试matter协议功能

参考网址: https://github.com/nxp-imx/meta-matter 请使用Ubuntu-20.04。18.04python版本太老 注意repo会出现此报错,可以无视: git checkout imx_matter_2023_q3 这一步在这个目录下操作 项目交流、学习、开发,欢迎私信。

shell_37.Linux参数传递和读取

1.传递参数 向 shell 脚本传递数据的最基本方法是使用命令行参数。命令行参数允许运行脚本时在命令行中添加数据: $ ./addem 10 30 2.读取参数 (1)bash shell 会将所有的命令行参数都指派给称作位置参数(positional parameter)的特殊变量。…

logback-spring.xml 中根据不同的业务表示,分类打印到不同的文件夹、时区动态设置

logback-spring.xml 中根据不同的业务表示&#xff0c;分类打印到不同的文件夹、时区动态设置 logback-spring.xml 完整配置 <?xml version"1.0" encoding"UTF-8"?> <configuration debug"false" scan"true" scanPeriod&…

【RNA biology】RNA的多功能性与早期生命进化

文章目录 RNARNA plays core functions in Central Dogma of BiologyrRNAsnRNA RNA worldReplication催化作用感知环境变化并作出响应 来自Manolis Kellis教授&#xff08;MIT计算生物学主任&#xff09;的课 油管链接&#xff1a;6.047/6.878 Lecture 7 - RNA folding, RNA wo…

TCP和UDP的原理及其区别(三次握手、四次挥手)

TCP和UDP都是在传输层上工作的协议&#xff0c;用于在网络中传输数据。 1、TCP和UDP之间的区别 TCP和UDP的主要区别在于它们提供的服务和特性。TCP提供可靠的、有序的、基于连接的数据传输&#xff0c;适用于对数据完整性和可靠性要求较高的应用&#xff08;邮件、短信&#xf…

Java多线程编程

文章目录 Java多线程编程线程概念线程常用方法线程创建线程优先级终止线程等待线程线程状态线程安全synchronizedvolatilewait和notify方法ThreadLocal的使用标准库线程安全类 Java多线程编程 线程概念 线程概念&#xff1a; 一个线程就是一个 “执行流”. 每个线程之间都可…

JavaPTA练习题 7-4 计算给定两数之间的所有奇数之和

本题目要求接收输入的2个整数a和b&#xff0c;然后输出a~b之间的所有奇数之和。 输入格式: 分别用两行输入两个整数a,b 输出格式: 输出a~b之间的所有奇数之和 输入样例: 在这里给出一组输入。例如&#xff1a; 1 30输出样例: 在这里给出相应的输出。例如&#xff1a; …