投屏开发音视频基础知识--h264相关介绍部分

音视频开发基础概述 - PCM、YUV、H264、常用软件介绍 前言 相对而言,音视频开发应该算门槛稍高的,记得我刚开始学习的时候,看别人的博客几乎都看不懂。后来总结了一下,看不懂的原因是没有掌握相关基础知识,比如一些概念(码率、采样率、帧率等),音视频中的颜色格式(RGB、YUV)、音频格式(PCM)等,写代码之前不了解这些,会写得非常痛苦——因为你不知道为什么要这么写,也不知道写出来的效果是怎样的。 基础概念 声波 声波有三要素: 1) 频率,代... 阅读详情

背景

在学习投屏专题开发相关课程时候,不可以避免的就是需要了解音视频相关的知识点,虽然可以使用标准的mediacodec接口等,只是实现功能的话可以不知道音视频的具体原理等。但一旦出现问题,或者深入问题分析,及相关原理等,就不得不认真学习相关音视频基础知识。比如视频最大的代表h264,还有音频最大代表aac等。

H.264的功能分两层

VCL (VideoCoding Layer,视频编码层):负责高效的视频内容表示。

NAL(NetworkAbstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传送。

简单直观理解如下:

VCL关心如何进行视频压缩
NAL关心压缩后的视频流如何被网络传输和解码播放

H.264码流格式情况

在这里插入图片描述

使用start code分隔NAL(start code为三字节或四字节,0x000001或0x00000001,为了节省码流, H.264 没有另外在 NAL 的头部设立表示起始的句法元素 。 但是如果编码数据时,由于 NAL 是依次紧密排列,解码器将无法在数据流中分辨每个 NAL的起始和终止,所以必须要有另外的机制来解决这个问题 。所以,H.264 提出方案,在存储或传输时,在每个NALU前加上0x00000001或0x000001。
在这里插入图片描述

NALU

VCL层是对核心算法引擎、块、宏块及片的语法级别的定义,最终输出压缩编码后的数据 SODB。VCL数据在传输或存储之前,先被映射或封装进NAL单元中。NAL层将SODB打包成RBSP然后加上NAL头,组成一个NALU(NAL单元)。
NAL层定义片级以上的语法级别(如序列参数集和图像参数集,针对网络传输),同时支持以下功能:独立片解码,起始码唯一保证,SEI以及流格式编码数据传送。
每个NAL单元是一个一定字语法元素的可变长字节字符串,包括一个字节的头信息(用来表示数据类型),以及若干个整数字节的原始字节序列负荷(RBSP)。
在这里插入图片描述

H264编码中数据形式相关解释

在这里插入图片描述
SODB(String of Data Bits)数据比特串:最原始的编码数据,即VCL数据,没有任何附加数据。

RBSP(Raw ByteSequence Payload)原始字节序列载荷:在SODB的后面填加了结尾比特(RBSP trailing bits),一个bit“1”,若干bit “0”,以便字节对齐;

EBSP(EncapsulationByte Sequence Packets)扩展字节序列载荷:在RBSP基础上加了仿校验字节(0X03)。它的原因是:需要添加每组NALU之前的起始码StartCode。解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。
起始码引入的问题:如果在NAL内部出现0x00 00 00 或者0x 00 00 01怎么办?而且这种可能性是很大的!

解决引入问题的方案:“防止竞争”机制

具体操作如下:
当编码器编码完一个NAL后,检查该NAL单元内部是否出现以下左侧的四个字节序列,如果存在,编码器将在最后一个字节前插入一个新的字节:0x03
从而使其变成右侧的样子,这样在NAL内部就不会出现0x00 00 00或者0x00 00 01了;然后解码器在NAL内部检测到0x00 00 03的序列时,将0x03丢弃,
恢复原始数据。

            0x00 00 00  -----> 0x00 00 03 00
            0x00 00 01  -----> 0x00 00 03 01
            0x00 00 02  -----> 0x00 00 03 02
            0x00 00 03  -----> 0x00 00 03 03
            
0x00 00 02是做保留用,0x00 00 03是为了避免原始数据中0x00 00 03序列
NALU HEADER

在这里插入图片描述

forbidden_zero_bit (F,占1bit)
在 H.264 规范中规定了这⼀位必须为 0 。

nal_ref_idc (NRI,占2bit)
NAL重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU,而不影响图像的回放 。 如果当前NALU是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

nal_unit_type(Type,占5bit):

这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用。

NALU类型的对照表 :
在这里插入图片描述
常见的一些类型列表:
在这里插入图片描述

SPS和PPS简单介绍

SPS(Sequence Paramater Set)又称作序列参数集。对应的是针对一段连续编码视频序列的参数。包含 帧数、POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等信息。

PPS(Picture Parameter Set)又称作图像参数集。对应的是一个序列中某一副图像或者某几幅图像的参数。包含 熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等信息。

SPS、PPS的内容都是编码器写入的。解码时,解码器一开始要收到SPS、PPS来做初始化,如果H.264码流中没有SPS或PPS的话,解码器是无法解析码流数据,自然是无法播放。如果编码参数改变,则还需要一组新的SPS、PPS。

VCL和NAL的关系

(1)VCL只关心编码部分,重点在于编码算法以及在特定硬件平台的实现,VCL输出的是编码后的纯视频流信息,没有任何头信息

(2)NAL关心的是VCL的输出纯视频流如何被表达和封包以利于网络传输

(3)SODB:String Of Data Bits(VCL输出的纯视频流)

(4)RBSP:Raw Byte Sequence Payload

(5)NALU:Network Abstraction Layer Units NALU是H264文件的基本组成单元

(6)关系:

SODB + RBSP trailing bits = RBSP

NALU header(1 byte) + RBSP = NALU

实战观察h264文件相关NALU单元情况:

在这里插入图片描述

传递依次是:
SPS
PPS
SEI
IDR

参考书:
《新一代视频压缩编码标准H.264/AVC》——毕厚杰主编

更多framework技术干货,请关注下面“千里马学框架”

音视频入门H264&AAC 音视频基础知识简述: 录像、录音,实质上是一个压缩采集到的图像或者音频数据的过程,这个过程又称为编码,混合。那为什么需要编码(压缩)呢?因为设备采集到的音视频数据太大了,如果不进行压缩,占用的空间太大,不利于传输等。 而播放视频或者音频文件,实质上是一个解压缩的过程,这个过程又称为解码。那为什么又要解码(解压缩)呢?因为播放器播放需要的是音频采样数据、视频像素数据,通俗一点来说就是需要的是编码之前... 阅读详情

相关推荐

音视频开发需要你懂得的 H264 编码原理

在时间方向的一条直线的点如果在空间方向具有相等的间隔,就对应了在实际空间中连续移动的点;,具体来说是描述前面一帧(相邻在这里表示在编码关系上的前面,在播放顺序上未必在当前帧前面)的每个小块怎样移动到当前帧中的某个位置去。通常在视频信息中,每一帧所包含的物体对象与其前后帧之间存在运动关系,这种物体的运动关系即构成帧与帧之间的时间冗余;可选预测模式,独立预测每一个4×4亮度子块,适用于带有大量细节的图像编码;该模型仅仅使用少数的参数对全局的运行进行描述,参数所占用的码率基本上可以忽略不计。

m0_62167422的博客 1337

H264的NAL解析

H264的NAL解析 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。 一段h.264的码流通常是由多个GOP组成的,GOP内一般包含1sps+1pps+1sei+1I帧+若干p帧(加上B帧一共有6种单元结构)。

weixin_49071468的博客 1667

【音视频处理】H264/H265详解,为什么H264更常用?

本期我们介绍视频编码格式H264 1、编码格式的作用 2、I帧、P帧、B帧、GOP 3、不同使用场景需要关注的点 4、H264、H265的选择

池鱼 - YiiGaa 6089

安卓开发投屏反控实现方式

在远程设备上,可以通过Socket通信接收发送的数据,并将数据解码成Bitmap对象。在安卓开发中,可以通过MediaProjection API来实现屏幕投屏的功能,同时也可以通过Socket通信实现反控功能。在Activity中,我们可以通过MediaProjection.createVirtualDisplay()方法创建一个虚拟显示器来进行屏幕投影。接下来,我们需要将虚拟显示器的输出流转换成Bitmap或者ByteBuffer对象,并使用Socket通信将数据发送给远程设备。

工宗浩生财指南针 2851

音视频系列--Camera2+MediaCodec制作相互投屏效果

接着之前写的 音视频系列–MediaProjection+MediaCodec制作简单投屏效果,继续使用Camera2+MediaCodec来制作相互实时投屏效果,为后面的直播学习打下基础。 一、效果 模拟器作为客户端,手机作为服务端,用模拟器实时接收的手机投屏数据,如果是两个手机可以相互投屏。 整个过程使用Camera2来获取数据,获取的数据通过MediaCodec编码,使用H264协议,传输通过WebSocket来实现,接收端接收到数据之后解码,然后通过TextureView渲染,大概是这么一个流程

夏的专栏 1443

音视频开发系列--H264编解码总结

NAL层:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。

yinshipin007的博客 2414

h264 NAL解析

视频由frame组成,frame由slice组成。每一个Slice分为Slice header(用于保存Slice的总体信息)和Slice body组成(通常是一组连续的宏块结构或者宏块跳过信息),如下图所示: SI和SP:即Switch I和Switch P,是一种特殊的编解码条带,可以保证在视频流之间进行有效的切换,并且解码器可以任意的访问。比如,同一个视频源被编码成各种码率的码流,在传输的过程中可以根据网络环境进行实时的切换; 1 slice header first_mb_in_.

wangbuji的博客 4089

音视频流媒体高级开发进阶:从音视频基础知识到技术实践

站在音视频行业风口 站在风口,猪也能飞”。在已经到来的2022年,音视频行业依旧是怎么也绕不过去的风口。 一方面,随着各项5G政策的落实,音视频+5G风口,将会深入挖掘音视频产业的无限潜力,加速与云计算、人工智能等领域的深度融合,不断催生新的业态和新的商业模式。 另一方面,实时音频也在助力在线教育风口,因为疫情,让越来越多的学生、家长、教育者都意识到了在线教育的重要性。音视频技术,无疑是在线教育背后一只强大的推手。 提前储备高薪技术力 面对音视频风口的重锤出击,你还不了解什么是音视频技术?让我们一探究竟。

C/C++Linux、音视频、DPDK 2953

【FFmpeg实战】H264 NALU分析

RTP包的NALU类型介绍单一类型:一个RTP包只包含一个NALU组合类型:一个RTP包含多个NALU,类型是24 —— 27分片类型:一个NALU单元分成多个RTP包,类型是28和29单一NALU的RTP包组合NALU的RTP包分片NALU的RTP包。

C/C++Linux、音视频、DPDK 1021

【Flink cdc】Data row is smaller than a column index, internal schema representation is probably xxx

翻译一下:当scan.startup.mode=EARLIEST_OFFSET时,如果在最早的offset之后表结构有过变化就无法支持。原因应该是在binlog 的earliest_offset之后,表结构被修改过。我的解决方案:source配置中使用。mysql source配置使用。,以时间戳为消费依据。

integrity 2085

TI电量计BQ40Z50R2循环学习实战:从量产文件生成到关键标志位解析

本文详细解析了TI电量计BQ40Z50R2的循环学习实战流程,从量产文件生成到关键标志位解析。通过实战案例和易错分析,帮助工程师避开常见陷阱,提升电量计配置效率。重点介绍了循环学习前的准备工作、量产文件生成步骤及关键标志位的深度解读,适用于电池管理系统开发人员。

weixin_30505225的博客 439

2021-03-10

 最近入门音视频技术,一直在学习H264编解码标准,了解了不少关于H264的相关知识,对于网上各种类型的资料,始终没有找到一篇适合的知识梳理资料。可能是查找方式不对,所以花费了比较多的时间。经过一段时间的熟悉后结合网上各类大神的指导资料和自己的理解决定自己整理一下关于H264编解码标准的知识。以后方便自己查阅,也让更多刚入门的人提供一个参考资料,由于是初次涉及,所以有些地方可能有理解不全面或有误,望各位前辈大神多多指导,不胜感激;  ...

weixin_47247728的博客 220

BLDC方波控制双闭环Simulink仿真模型

无刷直流电机方波控制双闭环Simulink仿真模型搭建详细教程,包括速度PI环、电流PI环、换向逻辑和受控电压源,仿真结果良好。

m0_57458432的博客 6870

基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件QtScrcpy

基于Qt ffmpeg opengl开发跨平台安卓实时投屏软件 课程介绍 课程地址:https://edu.youkuaiyun.com/course/detail/10750 本课程是一个音视频相关的Qt项目的实战教程,涉及Qt开发实际项目的完整流程。基于qt ffmpeg opengl实现了安卓手机实时投屏到电脑端,电脑端键鼠控制安卓手机的功能。可以自定义按键映射从而实现键鼠玩吃鸡手游的效果。基于Qt的跨...

Barry的博客 35万+

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1045

Linux7 挂载 nfs 远程目录

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 1万+

音视频及H264/H256编码相关原理

我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。如FFmpeg 视频文件就是一个容器 (视频流(H264) 音频流(aac))。

wangyongyao1989的博客 5911

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

【投屏】Scrcpy源码分析三(Client篇-投屏阶段)

Scrcpy源码分析之Client端投屏阶段

ZivXu的博客 7004

【OpenClaw从入门到精通】第34篇:医疗AI的“Agent OS”时代:基于WiseClaw构建医院专属智能体平台(2026实测版)

2026年医疗AI迈入实战落地新阶段,全球首个医疗OpenClaw平台WiseClaw正式发布,香港中文大学(深圳)医院完成业内首个私有化部署。本文基于真实医疗场景需求与公开技术资料,系统拆解医疗智能体平台的建设逻辑:从医疗Agent OS的五大核心特性切入,详解门诊病历质控、用药审查、医院运行管理三大临床场景的智能体搭建流程,提供完整的私有化部署代码、安全配置方案与实操演示。文章兼顾新手入门与进阶需求,严格遵循医疗合规要求,强调“只读不写+人工复核”原则,所有方案均经过虚拟实测验证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 788

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 音视频开发——录屏直播

获取录屏数据对数据进行 h264 编码Rtmp 数据包上传到直播服务器推流地址。

2501_90499577的博客 1660

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Miracast/WifiDisplay开发相关的深入调研分析-android投屏实战开发

MiracastMiracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的消费性电子产品(又称3C设备)可透过无线方式分享视频画面,例如手机可透过Miracast将影片或照片直接在电视或其他设备播放而无需任何连接线,也不需透过无线热点(AP,Access Point)。

learnframework的博客 2437

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

音视频基础1:H264、H265、MPEG-4、VP8、VP9编码基础知识

这里写自定义目录标题个人认知,程序员职业发展出路 个人认知,程序员职业发展出路 随着5G时代的到来,音视频成功走上风口,程序员如何发展,其实不管是入门级选手还是30岁,35岁中年危机的IT开发者,异或是更年长的IT开发者,都会有自己的职业发展路线。总结来说,目前大部分人的职业路线,职业出路,或者说职业遇到瓶颈以后解决方案可以总结为一下几种,程序员是天天解决问题,天天给各种问题解决方案的人,对于自己的职业当然也得给出最好的解决方案: ,转行;最简单粗暴的,从写代码的工作变换到开个杂货铺,开个烧烤摊,或者考个

jakezhang1990的专栏 1万+

2024了,为什么说音视频技术是技术风口?Android音视频开发这么吃香

此外,那么,而如今音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验;而音视频从业者基本上有两个层面:一个层面是搞音视频算法,这类人非常少,需要有深的数学能力和算法背景,这类人一般都会选择去大公司,薪水百万是最low 的。另一个层面是搞工程,这类人相对较多,他们有扎实的理论基础,很强的技术功底,对音频、视频都非常熟悉。这些人工资要比一般开发者高20%左右;随着5G时代的到来,音视频慢慢变成人们日常生活中的必须品。

2301_79058515的博客 955
上一篇: android12/13/14上支持新加入Hidl的hal方法-No more HIDL interfaces can be added to Android. Please use AIDL
下一篇: 手把手教你做投屏AAC的详细介绍-千里马带你学framework
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值