当前位置: 首页 > news >正文

音视频入门知识(四):封装篇

⭐四、封装篇

H264封装成mp4、flv等格式,那为什么需要封装?

​ h264也能播放,但是按照帧率进行播放,可能不准

★FLV

**FLV(Flash Video)**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒体和网页视频播放,尤其在 Flash 技术流行时期,是视频流媒体的标准格式之一。FLV 格式结构简单、文件体积小,适合网络传输。

特点:

  • FLV 作为容器格式,可以封装视频、音频和元数据。通常情况下,FLV 中的视频流编码为 H.264,音频流编码为 AAC 或 MP3。
  • FLV 文件体积较小,数据流封装效率高,适合网络视频播放,能够减少延迟,便于在带宽较低的情况下流畅播放。
  • 设计用于流媒体,FLV 文件支持按时间戳分块封装,便于播放时随时从任意位置读取和加载数据,增强了网络流媒体传输的稳定性。
  • FLV 可支持渐进式下载(Progressive Download),边下载边播放

播放过程:在流媒体播放过程中,FLV 文件按照上述标签顺序依次传输。播放器读取并解析文件头,然后根据标签中的时间戳同步音频和视频。脚本标签包含的元数据会在播放前提供相关信息,而每个标签的类型和数据大小字段用于解析和播放音视频内容。

封装格式

文件头(Header) + 前一个标签大小(Previous Tag Size)+ 标签(Tag)

文件头(9B)

用于标识文件格式和版本信息

  • Signature:固定的三个字节 FLV,用于标识这是一个 FLV 文件。
  • Version:表示 FLV 的版本,通常为 0x01
  • Type Flags:指示文件中是否包含音频(Audio)和视频(Video)数据。
  • Data Offset:表示 FLV 文件头的长度。

640

FLV Body = Previous Tag Size + Tag

Previous Tag Size : 4 字节字段,表示前一个标签的大小。这一字段的作用是便于解析器快速跳到下一个标签的位置。

Tag = Tag Header + Tag Data

  • Tag Type:表示标签类型(0x08 表示音频标签,0x09 表示视频标签,0x12 表示脚本/元数据标签)。
  • Data Size:表示该标签的数据部分的大小。
  • Timestamp:用于同步音视频的时间戳。对于视频文件,这个时间戳决定了标签在播放中的位置。
  • Stream ID:流标识,一般设置为 0,保留供未来使用。
  • Tag Data:实际的数据部分,包含音频、视频或元数据。

640 11

★TS

一种流媒体传输格式,全称为 MPEG-TS(MPEG Transport Stream),广泛用于数字视频和音频的传输。设计目的在于有效传输视频和音频数据,同时保证在不同网络环境下的传输稳定性。

特点:

封装结构:TS 是一种容器格式。每个流在 TS 中都作为一个独立的“包”(packet)传输,通常每个包的大小为 188 字节,便于同步和处理。

高容错性:TS 包含冗余数据和错误校验信息,使其能够在传输中发现和纠正错误,适合在不稳定的网络环境下使用

实时流传输:TS 具有实时传输的特点,通过加入时间戳来保证音视频同步(PTS/DTS),能够支持音视频的实时流式播放。

灵活性:可以封装多种格式的音频(如 AAC、MP3)和视频(如 H.264、H.265),适合多路流媒体传输,也支持动态切换多个音视频流。*

分层结构

分层结构是分层结构是基于 ISO/OSI 模型,专为高效、多路传输设计。它分为三层结构,以支持多路音视频和数据流的实时、可靠传输:,专为高效、多路传输设计。它分为三层结构,以支持多路音视频和数据流的实时、可靠传输:

  • ES层

    内容:最底层的数据流,包含压缩编码后的原始音视频数据,如 H.264 编码的图像数据或 AAC 编码的音频数据。

    作用:不包含任何时间戳或识别信息,主要专注于原始的音视频内容编码

    一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。

  • PES层

    内容:PES 层在 ES 层的基础上增加了时间戳(PTS/DTS)等信息,确保音视频同步

    作用:将原始的 ES 数据打包成更小的片段,便于在传输流中处理;PES 包头还包含信息以区分视频、音频或其他数据。

    ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头(类似于传输层的做法)

  • TS层

    内容:在 PES 层的基础上加入了数据流的识别信息(PID)和传输相关的控制信息

    作用:TS 层是传输的最终封装格式,将 PES 包切分成 188 字节的 TS 包,每个包中包含同步字、PID、错误校验等信息,确保在网络传输中能够恢复数据,便于多路流的管理与传输。

    ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。

    • TS Header:控制和识别,确保接收端识别数据包类型和顺序。

      包含的字节内容:

      • 同步字节(Sync Byte):固定为 0x47,用于包头识别和数据同步。

      • 传输错误指示(TEI):用于标识传输错误。

      • 有效负载单元起始指示(Payload Unit Start Indicator, PUSI):指示是否为新的 PES 包的起始。

      • ★PID(Packet Identifier):识别和区分不同类型的数据流,如音频、视频或信令数据(PAT/PMT 等)。

        • pid 决定了负载内容的类型,主要包括:PAT表PMT表,视频流,音频流。常用的PID值:

          • PAT 0x0000

            作用:PAT 是节目关联表,包含 TS 流中所有节目的 PID 信息。

            用途帮助接收端找到每个节目的 PMT(Program Map Table)位置,理解流中有哪些节目以及各节目对应的 PMT PID。

          • PMT:PMT 是节目映射表通过 PAT 表找到 PMT PID 后,可以解析某个节目具体的音视频流的 PID

          • 视频流 PID:音视频的 PID 在 PMT 中定义,通常为一个特定节目中的视频数据流。接收端通过 PMT 获取特定节目的视频 PID

          • 音频流 PID:与视频流类似,PMT 还定义了音频流的 PID,接收端通过 PMT 找到并解码音频流。

      • 控制字段:包括优先级、加扰控制和连续计数器等,用于数据流的管理和加密。

    • Adaptation Field:用于同步和补充,确保数据流的时间准确性。

    • Payload:实际的音视频数据或信令信息,是 TS 包中最核心的内容。

    image-20241109150016204

★MP4

常用的多媒体容器格式,广泛用于存储音频、视频、字幕以及元数据

特点:

  • 容器格式:MP4 本身不是编码格式,而是一个封装格式,可以包含多种编码格式的音视频内容(例如 H.264、AAC)。

    高兼容性:MP4 格式在各种设备(如手机、电脑、电视)和平台上都有很高的兼容性,广泛支持。

    流媒体支持:MP4 支持流式传输,可以用于网络环境中按需播放音视频。

    灵活的内容组合:MP4 容器可以同时包含视频、音频、字幕和元数据,方便实现多语言字幕、章节、封面等丰富内容。

MP4的文件结构

MP4 文件结构基于 box(盒子) 的概念,每个box包含不同的信息,这些box以树形结构的方式组成。每个 Box 都包含一个 Header(头部)Payload(有效载荷)

box 由 header 和 body 组成,header 指明 box 的 size 和 type。size 是包含 box header 的整个 box 的大小。

  • Header:包括盒子的大小和类型。

    • box type,通常是4个ASCII码的字符如“ftyp”、“moov”等
      • ftyp(File Type Box):指定 MP4 文件的格式、兼容性和品牌,位于文件开头。它描述了文件的主品牌(Major Brand)、次要版本(Minor Version)、兼容品牌(Compatible Brands)。
      • moov(Movie Box):存储文件级的元数据,包含有关整个媒体文件的信息。
      • mdat(Media Data Box):存储音视频实际数据的 Box。
  • Payload:存储媒体数据或控制信息,可以嵌套其他 Box

!

MP4 文件播放流程

播放器在播放 MP4 文件时通常会按以下流程读取:

  1. 读取 ftyp Box:判断文件格式和兼容性。
  2. 读取 moov Box:获取文件的元数据和轨道信息。
  3. 读取 mdat Box:加载实际的音视频数据,并根据 moov 中的索引信息解码播放。
  4. 分段播放(moof/mfra):对于流媒体或按需播放的 MP4 文件,播放器可以利用 moofmfra 快速访问并流式播放片段。
    在这里插入图片描述

相关文章:

音视频入门知识(四):封装篇

⭐四、封装篇 H264封装成mp4、flv等格式,那为什么需要封装? ​ h264也能播放,但是按照帧率进行播放,可能不准 ★FLV **FLV(Flash Video)**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒…...

在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?

堆(Heap)和栈(Stack)的概念和区别 在基于 IMX6ULL 的 Linux 嵌入式编程中,堆(Heap)和栈(Stack)是两种不同的内存分配方式,各自具有不同的特点和用途。以下是它们的主要区别: 1. 存储位置 堆&am…...

Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

随着技术的成熟和 AI 的崛起,很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成。于是乎,单个开发者的能力得到了极大的提升 - 借助各种工具,一个人就可以完成开发、测试、运维等整条链路上的工作,渡劫飞…...

pthread.h互斥锁与原子操作

一:互斥锁 pthread.h 是 POSIX 线程库的头文件,它提供了多线程编程所需的各种功能。其中,互斥锁(mutex)的实现涉及多个底层机制: 1. 互斥锁的基本结构 在 POSIX 线程库中,互斥锁通常包含以下…...

网络基础入门到深入(3):网络协议-HTTP/S

目录 一、HTTP和HTTPS协议简介 1.HTTP协议 .HTTP 协议 作用: 特点: 2.HTTPS协议 作用: 实现方式: 特点: 二.HTTP的请求与响应结构 1.HTTP请求结构 1.请求行:描述操作和资源 2.请求头: 3.请求体 : 2.HTTP…...

Git的.gitignore文件详解与常见用法

诸神缄默不语-个人CSDN博文目录 在日常使用 Git 进行版本控制时,我们经常会遇到一些不需要被提交到远程仓库的文件(例如日志文件、临时配置文件、环境变量文件等)。为了忽略这些文件的提交,Git 提供了一个非常有用的功能&#xf…...

UniApp 组件的深度运用

一、引言 在当今的移动应用开发领域,跨平台开发已成为主流趋势,而 UniApp 作为其中的佼佼者,备受开发者青睐。UniApp 的强大之处很大程度上源于其丰富且功能多样的组件体系,这些组件宛如精巧的积木,能够帮助开发者快速…...

k8s部署nginx+sshd实现文件上传下载

要通过 nginx 和 sshd 实现文件的上传和下载,通常的做法是结合 SSH 协议和 HTTP 协议,使用 nginx 提供 Web 服务器功能,同时使用 sshd(即 SSH 服务)来处理通过 SSH 协议进行的文件传输。 SSH 实现文件的上传和下载&…...

Spring-Mybatis 2.0

前言: 第一点:过于依赖代码生成器或AI,导致基于mybaits的CRUD通通忘了,所以为了找回遗忘的记忆,有了该系列内容。 第二点:通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能…...

Linux 的历史与发展:从诞生到未来

Linux 的历史与发展:从诞生到未来 1. 起源之前:操作系统的历史背景 在 Linux 问世之前,操作系统的发展经历了多个重要阶段,这些阶段为 Linux 的诞生奠定了基础: 1940-1950 年代:计算机初期 早期计算机如 [[…...

SQL Server实现将分组的其他字段数据拼接成一条数据

在 SQL Server 中,可以使用 STRING_AGG 函数(SQL Server 2017 及更高版本支持)将分组的其他字段数据拼接成一条数据。以下是示例代码: 假设有一个表 Orders,结构如下: OrderIDCustomerIDProduct1C001Appl…...

学习笔记 --C#基础其他知识点(同步和异步)

C#中的同步和异步《一》 以下理解借鉴博客:借鉴博客地址1 异步编程(Asynchronous) 允许任务在后台执行,而不会阻塞调用线程。C#使用async和await关键字 async Task AsynchronousMethod() {// 等待异步操作完成await Task.Dela…...

一维、线性卡尔曼滤波的例程(MATLAB)

这段 MATLAB 代码实现了一维线性卡尔曼滤波器的基本功能,用于估计在存在噪声的情况下目标状态的真实值 文章目录 一维线性卡尔曼滤波代码运行代码介绍1. **初始化部分**2. **数据生成**3. **卡尔曼滤波器实现**4. **结果可视化**5. **统计输出**源代码总结一维线性卡尔曼滤波 …...

极品飞车6的游戏手柄设置

极品飞车,既可以用键盘来控制车辆的前进、后退、左转、右转、加速与减速,也可以使用游戏手柄来操作车辆的运行。需要注意的是,极品飞车虽然支持手柄,但是仅支持常见的北通、罗技还有部分Xbox系列的手柄,至于其他的PS4手…...

FreeRTOS Lwip Socket APi TCP Server 1对多

源文件 /********************************************************************************* file lwip_tcp_driver.cpp* brief TCP Server implementation using LwIP******************************************************************************* at…...

逆袭之路(11)——python网络爬虫:原理、应用、风险与应对策略

困厄铸剑心,逆袭展锋芒。 寒苦凝壮志,腾跃绘华章。 我要逆袭。 目录 一、引言 二、网络爬虫的基本原理 (一)网络请求与响应 (二)网页解析 (三)爬行策略 三、网络爬虫的应用领…...

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…...

LVS 负载均衡原理 | 配置示例

注:本文为 “ LVS 负载均衡原理 | 配置” 相关文章合辑。 部分内容已过时,可以看看原理实现。 未整理去重。 使用 LVS 实现负载均衡原理及安装配置详解 posted on 2017-02-12 14:35 肖邦 linux 负载均衡集群是 load balance 集群的简写,翻…...

Hive分区再分桶表

在Hive中,数据通常是根据分区(partition)来组织的,但是对于大数据集,单层分区可能不够用,因此可以进一步细分为桶(bucket)。桶可以用于提供额外的并行处理和优化查询性能。在这种情况…...

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程,分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前,确保服务器已配置好 Docker、MySQL 和 Redis,可参考下列链接进行操作&#xff1…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) ​遍历字符串​:通过外层循环逐一检查每个字符。​遇到 ? 时处理​: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: ​与…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...