【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

news/2024/9/16 21:51:43/ 标签: 音视频, H.264

目录

  • ✨播放一个视频的流程
  • ✨为什么要编码(压缩)视频数据?
  • ✨如何编码(压缩)数据
    • 🎄简单的例子
    • 🎄音视频编码方式
    • 🎄视频编码格式
      • H264编码
      • 是什么?发展历程?
      • H.264基本单元
      • H.264的I帧,P帧,B帧
    • 🎄音频编码格式
  • ✨视频文件封装格式
  • ✨解封装格式
  • ✨视频解码
  • ✨H264分层结构
    • 🎄网络上传输H264视频数据的流程
      • VCL的结构关系
    • 🎄NAL单元
  • ✨ 参考文章

✨播放一个视频的流程

1.对音视频进行编码,一般用H.264编码标准
2.对编码后的音视频进行封装,一般封装为MP4格式
3.播放MP4视频,必须要解封装
4.解封装之后得到的是编码后的音视频编码流,必须解编码(压缩)
在这里插入图片描述

✨为什么要编码(压缩)视频数据?

在这里插入图片描述

视频是又一帧一帧的图片组成的,人眼有视觉暂留效应,当帧序列以一定的速率播放,我们就能看到连续的视频。

比如一个1920x1080分辨率,32位,每秒30帧的视频。一秒钟就要流过 1920x1080x32x30 = 237M的数据!!!

一个.rgb文件75.5mb,编码为.h264文件之后大概为525KB.

✨如何编码(压缩)数据

🎄简单的例子

比如大话西游朱茵的经典照,取两张图片,一个图片右眼是睁开的,一个图片右眼是闭着的。那么保存第二张图片的时候只需要记录这张图片和上一张图像的区别信息即可。

编码就是去除冗余。

在这里插入图片描述


从计算机的角度来说:比如一个全黑的图片,存储方法是100x100的数组,每个矩阵的值都是0。该数组是Int型,存储这个图片需要100x100x4字节的大小。

只需要用一个int记录该数组的数,即0。
然后再用两个int分别记录矩阵的长和宽。

就可以用这三个int变量来复原该图像。

🎄音视频编码方式

音视频开发——H264编解码总结

🎄视频编码格式

视频编码的作用: 将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。常用的音频编码方式有以下几种:
在这里插入图片描述

H264编码

打开斗鱼直播间,右键点击查看参考信息选项,会发现直播的视频流用的是H264编码方式。

在这里插入图片描述

是什么?发展历程?

H264,通常也被称之为H264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)

H264是一种编码算法。是主流的编码标准。

像大多数看到的视频,如rmvb、avi、mp4、flv大多数是由h264进行编码,当然也会有不同的,如mpeg4、vp9这样冷门的编码。


H264视频编码发展历程
在这里插入图片描述

H.264基本单元

H.264定义的结构中,一个视频图像编码后的数据叫做一帧。 一帧是由一个或多个片(slice)组成的,一个片是由一个或多个宏块(MB)组成的(宏块是H264编码的基本单位),一个宏块是由16x16的yuv数据组成的。

H.264的I帧,P帧,B帧

I帧:关键帧,就是把一个图片直接压缩,压缩之后的内容就是I帧,它可以单独解码出一个完整的图像。


P帧:前向预测编码帧。记录本帧和之前的一个关键帧的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。

比如记录第三张图片,只需记录右下角的粉矩形,然后用这个信息 叠加第一张图片,即可复原第三张图片。
在这里插入图片描述


B帧:双向预测编码帧,既要参考前面的,又要参考后面的。

比如想要记录第二张图片,它只需要记录右上角的椭圆,然后将它与第一张原始图片和第三张原始图片叠加即可复原第二张图片。
在这里插入图片描述

这种方法压缩效果很强。本来第二张图片是个很复杂的图片,它只需要记录第一张图片然后记录第二张第三张图片的部分信息就能复原第二张图片。

🎄音频编码格式

在这里插入图片描述
MP3 MP3,英文全称 MPEG-1 or MPEG-2 Audio Layer III,是曾经非常流行的一种数字音频编码和有损压缩格式,它被设计来大幅降低音频数据量。它是在 1991 年,由位于德国埃尔朗根的研究组织 Fraunhofer-Gesellschaft 的一组工程师发明和标准化的。MP3 的普及,曾对音乐产业造成极大的冲击与影响。

✨视频文件封装格式

上一步编码(压缩)之后必须要把编码后的内容按照一定的格式放在一个文件中,这个文件相当于一个外壳,它就是封装格式(容器)。常见的格式为 .mp4。

或者把它当成一个放视频轨和音频轨的文件夹也可以。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗,或者一个锅,用来盛放饭菜的容器。 下面是几种常用的视频文件后缀类型与其相对应的封装格式。

在这里插入图片描述

✨解封装格式

如果要播放一个MP4文件,MP4是一个封装格式数据,是一个容器,要想播放它首先要打开它。然后把数据从容器中取出来。

✨视频解码

直接从容器里面拿出来的音视频数据不能直接拿出来播放。这些都是编码(压缩)后的数据。

这样的数据显然不能直接转成图片然后播放。所以要对数据进行解码,比如上面的例子,我们拿到区别信息之后,参考第一张图片,进行整合,然后才能拿到完整的图像进行展示。

✨H264分层结构

H.264码流文件分为两层:
1.VCL (Video Coding Layer 视频编码层):它是被编码(压缩)后的视频数据。
2.NAL(Netword Abstraction layer 网络提取层):VCL数据被封装到NAL单元中之后,才可以用于传输或者存储。

🎄网络上传输H264视频数据的流程

在网络上传输H264视频数据与服务器段的java代码一样:
在这里插入图片描述

VCL的结构关系

参考博客:h.264(2)——VCL/NAL/切片/宏块
在这里插入图片描述
在这里插入图片描述

🎄NAL单元

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

✨ 参考文章

音视频开发——H264编解码总结

强烈推荐:【音视频 | H.264H.264视频编码及NALU详解


http://www.ppmy.cn/news/1522909.html

相关文章

UnLua环境搭建

一、环境搭建 1、下载UnLua工程:https://github.com/Tencent/UnLua 2、复制Plugins/UnLua目录下的插件到自己的项目中 3、重新生成自己的VS工程 4、打开VS工程的项目名.Build.cs文件,引用UnLua插件,重新编译工程 PublicDependencyModuleNames.AddRan…

数组与贪心算法——605、121、122、561、455、575(5简1中)

605. 种花问题(简单) 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xf…

【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成&#xff…

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中…

【网络安全】Exif 数据储存型XSS

未经许可,不得转载。 文章目录 Exif步骤Exif EXIF(Exchangeable Image File Format)数据是一种存储在图像文件中的元数据格式,常用于数码照片和扫描图像。它包含了与图像相关的各种信息,比如拍摄日期和时间、相机品牌和型号、拍摄时的设置(如曝光时间、光圈、ISO等)、地…

Java Kafka生产者实现

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

Android 9.0 SystemUI状态栏/快捷设置介绍

Android 9.0 SystemUI状态栏/快捷设置介绍 状态栏 状态栏是SystemUI里的重要功能之一,状态栏的一大功能就是显示功能图标,以告知用户一些最基本的信息状态,在 Android 9.0 版本中,状态栏一般包含运营商信息、时间、日期、电池、通…

python简单计算入门教程|加减法

python通过调用numpy模块,非常擅长数学计算。再通过调用matplotlib模块,可以自由自在地输出numpy计算的结果。 今天,我们就尝试一些基本计算。 下述是正弦函数和余弦函数的加法和减法计算结果。 图1 代码为: import matplotli…

UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示

一、效果: 在很多游戏中为了玩家能看到墙面背后是否有敌人,会给被遮挡的敌人增加描边显示,效果如下: 参考: https://zhuanlan.zhihu.com/p/81310476 https://zhuanlan.zhihu.com/p/358140547 二、所需知识 知识点…

3.C_数据结构_栈

概述 什么是栈: 栈又称堆栈,是限定在一段进行插入和删除操作的线性表。具有后进先出(LIFO)的特点。 相关名词: 栈顶:允许操作的一端栈底:不允许操作的一端空栈:没有元素的栈 栈的作用: 可…

如何在 Linux 系统中禁用用户登录 ?

管理 Linux 系统上的帐户是系统管理员的一项重要任务。一个常见的任务是禁用帐户,由于各种原因可能需要禁用帐户,例如当员工离开公司或出于安全目的需要临时禁用访问时。 本指南将以简单易懂的步骤引导您完成在 Linux 系统上禁用帐户的过程。 Step 1: …

2024.9.8

打了一上午又一下午的比赛 DABOI Round 1 【MX-X3】梦熊周赛 未来组 3 & RiOI Round 4 第一场还好,共得180pts 难度比较合理,偏向正常noip 然后就发现自己计数问题很难做到推广思路,只会部分分 梦熊的模拟赛就抽象了 题目难度夸大…

IDEA安装教程配置java环境(超详细)

引言 IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),广泛用于 Java 开发,但也支持多种编程语言,如 Kotlin、Groovy 和 Scala。本文将为你提供一步一步的指南,帮助你在 Windows 系统上顺利安装 Intelli…

Qt:解决player->duration()第一次获取媒体时长为0的问题

前言 最近想做一个白噪声播放器,中间就用到了QMediaplayer这个类,其中遇到两个问题,一个是未初始化好就调用player->state()导致程序异常崩溃的问题(这个问题留到下一个文章去说);还有一个就是调用player->duration()第一次…

Mendix 创客访谈录|Mendix赋能汽车零部件行业:重塑架构,加速实践与数字化转型

在当前快速发展的技术时代,汽车行业正经历着前所未有的数字化转型。全球领先的汽车零配件制造商面临着如何利用最新的数字技术优化其制造车间管理的挑战。从设备主数据管理到生产执行工单管理,再到实时监控产量及能耗,需要一个灵活、快速且高…

基于单片机智能电源插座设计

本设计基于单片机智能电源插座设计,该系统主要包括:单片机、WIFI模块、显示模块、继电器模块、按键输入模块、功率检测模块及手机APP,实现对用电量的实时监测的功能。功率检测模块实时测量用电器的供电电压、电流、功率;按键输入模…

微信小程序:navigateTo跳转无效

关于 navigateTo 跳转无效问题,在IOS、模拟器上面都能正常跳转,但是在安卓上面不能跳转,过了一段时间IOS也不能跳转了。仔细找了下问题结果是要跳转的页面是tab,不能使用navigateTo 取跳转修改为: wx.switchTab({url:…

经验笔记:跨站脚本攻击(Cross-Site Scripting,简称XSS)

跨站脚本攻击(Cross-Site Scripting,简称XSS)经验笔记 跨站脚本攻击(XSS:Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者将恶意脚本注入到看起来来自可信网站的网页上。当…

Spring Boot集成PDFBox实现电子签章

概述 随着无纸化办公的普及,电子文档的使用越来越广泛。电子签章作为一种有效的身份验证方式,在很多场景下替代了传统的纸质文件签名。Apache PDFBox 是一个开源的Java库,可以用来渲染、生成、填写PDF文档等操作。本文将介绍如何使用Spring …

Socket编程 (连接,发送消息) (Tcp、Udp) - Part1

Socket编程 (连接,发送消息) (Tcp、Udp) 本篇文章主要实现Socket在Tcp\Udp协议下相互通讯的方式。(服务器端与客户端的通讯) 1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息。 使用Tcp协议通讯需要具备…