fmp4打包H265视频流

2023-11-02

1 fmp4打包H265视频流


本文只介绍H265/HEVC的fmp4封包与fmp4封包H264不通的地方,其他有关mp4基础知识及fmp4封装和264视频流相关内容参照:
fmp4打包H264详解

1.1 码流存储和传输格式介绍

这里主要介绍下H264和H265存储和传输格式的基本知识介绍,如果知识想了解如何fmp4封装,本节可以跳过。

H265和H265标准中指定了视频如何编码成独立的包,但如何存储和传输这些包却未作规范,虽然标准中包含了一个Annex附件,里面描述了一种可能的格式Annex B,但这并不是一个必须要求的格式,为了针对不同的存储传输需求,出现了两种打包方法:一种即Annex B格式,另一种称为AVCC/HVCC格式。

1.1.1 Annex B封装格式

Annex B格式及我们厂家的HECVC或者H264码流封装格式,其格式如下:
[StartCode][NALU Header][NALU PAYLOAD]
起始码一般为00000001或者000001开头,通过定位起始码,解码器就可以识别NALU的边界,为了防止编码数据中存在与起始码相同的数据,在构建NALU时,需要将数据中的0x000000,0x000001,0x000002,0x000003中插入防竞争字节(Emulation Prevention Bytes)0x03,使其变为:

0x000000 = 0x0000 03 00
0x000001 = 0x0000 03 01
0x000002 = 0x0000 03 02
0x000003 = 0x0000 03 03

因此,解码器在检测到0x000003时,将0x03抛弃,恢复原始数据。

1.1.2 AVCC封装格式

AVCC格式不使用StartCode作为NALU的分界,而是在每个NALU前都加上一个指定NALU长度的大端格式表示的前缀,这个前缀可以是1、2或4个字节,所以在解析AVCC格式的时候需要将指定的前缀字节数的值保存在一个头部对象中,通常称为extradata或者sequence header,其中SPS和PPS数据也需要保存在extradata中。这里需要注意SPS和PPS都是去掉起始头的
H.264 extradata语法如下:
extradata

其中第5字节的后2位NALULengthSizeMinusOne表示的就是NALU size的字节数,NALU前缀长度减1,假设前缀长度为4,那么这个值应该为3。如果此之为3表示此码流所有nalu前需要加上四字节size,去掉起始码。

fmp4打包H264详解文章中我们已经使用过此种封装方式来打包程avcc的box,详见此文章中的avcC box解释:moov->trak->media->minf->stbl->stsd->avc1->avcC,需要trak带有此box表示mp4封装的H264码流,此trackID的流中mdat的box中封装的是去除起00000001始码的码流,解码时需要注意这里虽然去掉了起始码,但是但防竞争字节还是有的,需要转换一下。

1.1.2 HVCC封装格式

与H.264类似,H.265(HEVC)码流也有两种封装格式,一种是用起始码作为分界的Annex B格式,另一种则是在NALU头添加NALU长度前缀的格式称为HVCC,与AVCC类似,需要通过extradata来保存视频流的编解码参数,其格式定义如下:
extradata

表示extradata后半段是一段格式重复的数组数据,其中numOfArrays表示数组的个数,一般为0x03,表示包含VPS/SPS/PPS,
封装方式示意如下(《ISO-14496-15 AVC file format》中有详细说明):

// The CodecPrivate syntax shall follow the
// syntax of HEVCDecoderConfigurationRecord
// defined in ISO/IEC 14496-15.
//
// The number zero (0) shall be written to
// the configurationVersion variable until
// official finalization of 14496-15, 3rd ed.
//
// After its finalization, this field and the
// following CodecPrivate structure shall
// follow the definition of the
// HEVCDecoderConfigurationRecord in 14496-15.

unsigned int(8)  configurationVersion;
unsigned int(2)  general_profile_space;
unsigned int(1)  general_tier_flag;
unsigned int(5)  general_profile_idc;
unsigned int(32) general_profile_compatibility_flags;
unsigned int(48) general_constraint_indicator_flags;
unsigned int(8)  general_level_idc;
bit(4) reserved = ‘1111’b;
unsigned int(12) min_spatial_segmentation_idc;
bit(6) reserved = ‘111111’b;
unsigned int(2)  parallelismType;
bit(6) reserved = ‘111111’b;
unsigned int(2)  chromaFormat;
bit(5) reserved = ‘11111’b;
unsigned int(3)  bitDepthLumaMinus8;
bit(5) reserved = ‘11111’b;
unsigned int(3)  bitDepthChromaMinus8;
bit(16) avgFrameRate;
bit(2)  constantFrameRate;
bit(3)  numTemporalLayers;
bit(1)  temporalIdNested;
unsigned int(2) lengthSizeMinusOne;
unsigned int(8) numOfArrays;
for (j=0; j < numOfArrays; j++) {
  bit(1) array_completeness;
  unsigned int(1)  reserved = 0;
  unsigned int(6)  NAL_unit_type;
  unsigned int(16) numNalus;
  for (i=0; i< numNalus; i++) {
    unsigned int(16) nalUnitLength;
    bit(8*nalUnitLength) nalUnit;
  }
}
bits 描述 备注
1 array_completeness 默认0
1 reserved 默认0
6 NAL_unit_type 帧类型
16 numNalus 此种类型的帧个数,一般为1,如果大于1,下面进入循环
16 nalUnitLength 2字节表示附加帧的长度
N NALU data 附加帧的数据

一般在fmp4封装时,hvcC box的box负载采用此种方式封装,其中相关的编码参数获取是从HEVC的SPS帧中分析出来的,附加帧数据VPS/SPS/PPS。

1.2 fmp4封装H265

fmp4封装H265,仅有两个box需要修改ftyp box和stsd box

1.2.1 ftyp box

ftyp box格式与H264封装一样,其中compatible brands赋值为isom、iso2、mp41,HEVC ftype示例如下:

0x00,0x00,0x00,0x1C,//box size
0x66,0x74,0x79,0x70,//ftyp的ascii 
0x69, 0x73, 0x6f, 0x6d, // major_brand: isom
0x0, 0x0, 0x02, 0x0, // minor_version: 0x01
0x69, 0x73, 0x6F, 0x6D, // isom
0x69, 0x73, 0x6F, 0x32, // iso2
0x6d, 0x70, 0x34, 0x31, // mp41

经过验证,这里直接用isom也能够正常播放,所以此box可与H264保持一致。

1.2.2 stsd box

有关H265的fmp4打包,此box需要把avc1 box替换成hvc1 box,hvc1 box的封装格式与avc1类似,只是把avcC子box替换程hvcC,其格式如下:
[4字节size][4字节type][6字节预留][2字节data_reference_index][2字节pre_defined][2字节预留][12字节pre_defined][2字节宽][2字节高][4字节horizresolution][四字节 vertresolution][4字节预留][2字节视频帧数量][Compression name长度][Compression name][Compression name预留位(32-Compression name长度-1)][2字节深度][2字节pre_defined][hvcC box][btrt box]

这里主要对与H264不同的hvcC box进行说明,其结构如下:
[4字节size][4字节type][hevc extradata]

其中hevc extradata格式见1.1.2 HVCC封装格式,其后半段附加了VPS、SPS、PPS帧数据,HVCC附加的解码信息字段可从SPS中解析得到,具体解析方式参照文章:
https://www.cnblogs.com/sddai/p/14366110.html

sps1
sps2
sps3

示例及详解如下:

00 00 00 6E 68 76 63 43 01 01 60 00 00 00 B0 00 00 00 00 00 7B F0 00 FC FD F8 F8 00 00 03 03 20 00 01 00 17 40 01 0C 01 FF FF 01 60 00 00 03 00 B0 00 00 03 00 00 03 00 7B AC 09 21 00 01 00 22 42 01 01 01 60 00 00 03 00 B0 00 00 03 00 00 03 00 7B A0 03 C0 80 10 E5 8D AE 49 32 F4 DC 04 04 04 02 22 00 01 00 07 44 01 C0 F2 F0 3C 90 
  • 00 00 00 6E:box长度为110
  • 68 76 63 43: boxtype=hvcC
  • 后续为hevc extradata,具体解释按照上文方式解析

以下是用mp4reader解析的结果,有关fmp4示例文件及mp4reader安装包获取,请关注微信公众号壹零仓,发送fmp4,获取:
hvcC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fmp4打包H265视频流 的相关文章

  • 如何开发一个音视频播放器(ffmpeg3.2+sdl2.0)

    如何开发一个音视频播放器 ffmpeg3 2 SDL2 0 前言 创建一个音视频播放器的步骤 一 播放音频 二 播放视频 三 音视频同步 源码分析 一 正式开始前的准备工作 二 配置音视频基本参数 获取文件基本信息 初始化音频参数 初始化视
  • Windows平台实现Unity下窗体

    技术背景 随着Unity3D的应用范围越来越广 越来越多的行业开始基于Unity3D开发产品 如传统行业中虚拟仿真教育 航空工业 室内设计 城市规划 工业仿真等领域 基于此 好多开发者苦于在Unity环境下 没有低延迟的推拉流解决方案 前几
  • EasyGBS国标GB28181视频平台添加针对H.265视频流的告警信息

    EasyGBS国标视频云服务支持设备 平台通过国标GB28181协议注册接入 可实现视频的实时监控直播 录像 检索与回看 语音对讲 云存储 告警 平台级联等功能 平台支持将接入的视频流进行全终端 全平台分发 分发的视频流包括RTSP RTM
  • Android平台GB28181设备接入端如何实现本地录像?

    实现Android平台GB28181设备接入的时候 有个功能点不可避免 那就是本地录像 实际上 在实现GB28181设备接入模块之前 我们前些年做RTMP推送和轻量级RTSP服务的时候 早已经实现了本地录像功能 本地录像功能 我们实现的主要
  • RTSP和RTP、RTCP协议介绍

    一 RTSP 1 简介 RTSP Real Time Stream Protocol 协议是一个基于文本的多媒体播放控制协议 属于应用层 RTSP以客户端方式工作 对流媒体提供播放 暂停 后退 前进等操作 它主要用来控制具有实时特性的数据的
  • WebRTC建立会话流程分析

    WebRTC建立会话流程总结 了解如何运行PeerConnection Demo后 熟悉运行流程可以做为深入学习WebRTC的切入点 本节重点解释客户端双方建立会话时交互的主要信令 控制会话的文本协议 和与信令相关的 WebRTC API
  • 如何快速实现Android平台前端设备接入能力

    技术背景 SIP 会话初始化协议 是在 IP网络上进行多媒体通信的应用层控制协议 以几种RFC的形式提供 其中最重要的是包含核心协议规范的RFC3261 该协议用于创建 修改和终止与一个或多个参与者的会话 通过会话 我们了解了一组进行通信的
  • 在html5中播放RTSP/RTMP/HLS/HTTP视频流媒体的几种方案,并支持H.265

    经过多年的项目实战和研发经验的积累 总结了一下对于H5视频可视化在视频播放上如何做到无插件H5展示的方法 尤其是契合安防行业的方案 除了HTTP WebSocket类的传输协议 其他是无法通用地传输到浏览器的 所以 如果要做一款通用的H5视
  • [轻量级RTSP服务]Linux

    背景 随着国产操作系统的推进 传统行业对Linux平台的呼声和需求越来越大 之前几年 我们发布了Linux平台运营商级的RTSP转RTMP推送模块 RTMP推送模块和RTSP RTMP播放模块 前段时间 有开发者问我们 是不是可以在Linu
  • GB/T28181-2022针对H.265、AAC的说明和技术实现

    GB T28181 2022规范说明 GB T28181 2022相对来GB T28181 2016针对H 265 AAC的更新如下 更改了 联网系统通信协议结构图 媒体流通道增加了 H 265 G 722 1 AAC 见 4 3 1 20
  • H.265 3D视频编码

    实验方案 实验目的 对单视点视频 深度使用HEVC编码 编码使用不同量化步长 2 方案1 HTM 使用HTM 16 2 dev编码 选用3 view depth Nview depth qp seqContent 联合编码 注意修改3 vi
  • 视频编码格式发展史

    1 编码标准之战 想预测未来 就回顾历史 先来看看H 264这些编码的从标准化到现在普及的过程 人们一直在想尽办法提高视频编码的效率 让它在尽可能小的体积内提供最好的画面质量 从而满足人们对于视频传输 存储的需求 长期以来 视频编码标准主要
  • live555 流媒体开源库

    live555对每一个从事过流媒体开发的从业者而言 都不曾陌生 就像每一个从事音视频行业的从业者而言 ffmpeg也不曾陌生 随着行业需求的发展 live555也是越见强大 因前几天帮朋友项目查找问题 重拾live555 没想到时隔10年
  • Building Simulation Packet-Loss System in Channel

    Step 1 Produce a series of random frame numbers There is three input GOP and loss ratio For instance there is a 264 with
  • GB28181控制、传输流程和协议接口之注册

    注册和注销基本要求 SIP客户端 网关 SIP设备 联网系统等 SIP代理 SIP UA 使用IETFRFC3261中定义的方法 15 GB T28181 2016Register进行注册和注销 注册和注销时应进行认证 认证方式应支持数字摘
  • H5播放之Rtsp转Websocket点播录像抓拍

    H5播放之Rtsp转Websocket点播录像抓拍 HLS的延时 websocket播放 实现思路 广大网友们 很久没上CSDN了 暨上次RTSP转HLS文章发布以来 一直还有一个问题没有解决 如何避免HLS切片带来的不可避免的高延时 HL
  • windows使用小技巧 ━━ Windows 10 HEVC扩展要收费怎么办?教你怎么免费下载HEVC扩展

    现在最新的方法 Download K Lite Codec Pack Full 可以无视下面的内容 平时我一般都使用potplayer打开视频 但在整理视频的时候mov格式的文件总是不能显示缩略图 如果用windows10自带图片查看器打开
  • 如何使用 gstreamer 以 h265 进行流式传输?

    我正在尝试同时使用最新的 gstreamer 和 x265enc 我看到有人已经发布了一些提交http cgit freedesktop org gstreamer gst plugins bad log ext x265 gstx265e
  • 如何将 HEVC 文件解码为 YUV?

    我想将 HEVC 编码文件解码为 YUV 文件 有没有简单的方法可以做到这一点 可执行文件会很好 但我会使用易于编译的源代码 它就像 引导假定的Linux 根据您的需要调整它 一样简单 克隆官方参考编解码器 官方 官方是一个 svn rep
  • 如何修复“AVDRegister - AppleAVDCheckPlatform() 返回 FALSE”

    我使用此代码来检查我的 iPhone 是否支持 hevc 硬解码 BOOL hardwareDecodeSupported VTIsHardwareDecodeSupported kCMVideoCodecType HEVC 但在控制台上我

随机推荐

  • 测试基础-动态黑盒测试

    1 动态黑盒测试 不深入代码细节测试软件的方法称为动态黑盒测试 动态 因为程序在运行 黑盒 测试时不知道程序如何工作 测试员输入数据 接受输出 检验结果 2 通过性测试和失效性测试 通过性测试 test to pass 确认软件至少能做什么
  • 50个渗透(黑客)常用名词及解释

    目录 前言 一 渗透测试 二 网络安全 三 安全攻击 四 黑客工具 五 渗透方法 六 网络钓鱼 七 攻击技术 八 其他名词 总结 前言 网络安全是当今互联网时代不可忽视的重要议题 随着科技的发展 黑客渗透技术也日益复杂和潜在危险 为了加强对
  • 首次参加字节飞书面试败北

    我17年正式本科毕业的 2021年是我自毕业后开始尝试投简历 以前大学有门课在智联上制作了简历 现在四年 我下载app上面就没了 我今年这次注册了boss直聘的这个 正好在315后面隔天注册的 发现挺多主动发起招呼的 我把猎头屏蔽了 个人有
  • swift4--页面跳转的几种方法

    首先要在appDelegate里添加导航视图控制器navigationColler func application application UIApplication didFinishLaunchingWithOptions launc
  • 《数据结构、算法与应用C++语言描述》线性表-链表描述

    11 数据结构 算法与应用C 语言描述 线性表 链表描述 11表示第11篇博文 6表示在 数据结构算法与应用C 语言描述 书中所在章节 本文包含了 数据结构 算法与应用C 语言描述 第六章主要练习题答案 给出了线性表链表描述完整测试代码 6
  • HTML中多种空格转义字符

    转自 http codenote mao li html nbsp 记录一下 空格的转义字符分为如下几种 1 nbsp 160 不断行的空白 1个字符宽度 2 ensp 8194 半个空白 1个字符宽度 3 emsp 8195 一个空白 2
  • Kubernetes安装手册(Ubuntu非高可用版-CNI-flannel)

    CKA考试环境 Kubernetes 安装手册 Ubuntu非高可用版 安装前准备工作 1 设置hosts解析 操作节点 所有节点 k8s master 均需执行 修改hostname hostname必须只能包含小写字母 数字 且开头结尾
  • keras中Sequential模型及方法

    Sequencial 序贯模型 序贯模型是函数式模型的简略版 为最简单的线性 从头到尾的结构顺序 不分叉 是多个网络层的线性堆叠 可以通过将层的列表传递给Sequential的构造函数 来创建一个Sequential模型 from kera
  • 假设利用两个线性表La和Lb分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的 集合A=AUB。这就要求对线性表作如下操作:扩大线性表La,将存在于线性表Lb中而不存在于线

    假设利用两个线性表La和Lb分别表示两个集合 和 即线性表中的数据元素即为集合中的成员 现要求一个新的 集合A AUB 这就要求对线性表作如下操作 扩大线性表La 将存在于线性表Lb中而不存在于线性表La中的数据元素插入 到线性表La中去
  • GPT系列模型

    Transformer发展 之 GPT系列模型结构 我按照Transformer的发展路线来学习入门 Transformer BERT GPT DETR ViT Swin ViT DeiT 上一篇写了Transformer 听了李宏毅和李沐
  • 美团多场景建模的探索与实践

    本文介绍了美团到家 站外投放团队在多场景建模技术方向上的探索与实践 基于外部投放的业务背景 本文提出了一种自适应的场景知识迁移和场景聚合技术 解决了在投放中面临外部海量流量带来的场景数量丰富 场景间差异大的问题 取得了明显的效果提升 希望能
  • 【知识分享】苹果Apple-Mac操作系统OS的Big Sur 和Monterey的异同

    问题提出 今天在电脑里突然发现有个Monterey的app 但是我记得我没有下载过 应该是电脑自己下的 我的系统是 到底要不要升级呢 这两东西又啥区别呢 答疑解惑 monterey和bigsur区别详细介绍 简单说 Monterey较big
  • 【Simulink Test】模型自动测试

    Simulink Test 模型自动测试 Test Manager简介 构建一个测试模型 使用TestManager新建一个测试模板 打开Simulink Test Manager 通过教程创建一个测试用例 修改测试输入输出进行测试 测试表
  • CentOS 7 安装 JAVA环境(JDK 1.8)

    首先去到Oracle官网 https www oracle com java technologies javase javase jdk8 downloads html 下载Linux64位版 2 下载命令 wget https down
  • linux+查内存数量,检查 Linux 中内存使用情况的 8 条命令

    作为一名 Linux 管理员 知道如何获取当前可用的和已经使用的资源情况 比如内存 CPU 磁盘等 是相当重要的 Magesh Maruthamuthu Linux 并不像 Windows 你经常不会有图形界面可供使用 特别是在服务器环境中
  • 一文2500字使用Python进行GRPC和Dubbo协议的高级测试

    01 GRPC测试 GRPC Google Remote Procedure Call 是一种高性能 开源的远程过程调用 RPC 框架 由 Google开发并基于Protocol Buffers protobuf 进行通信 它使用了HTTP
  • vue 设置下拉框三级联动

    如图中 用vue实现三个选择框是联动关系 首先选择厂商 然后品牌下拉框中出现的品牌是所选厂商包含的品牌 同理 选择完品牌后 车型也是所选品牌中包含的车型 例如有这样的对应关系 厂商 品牌 车型 长城 哈弗 HB01 HB02 HB03 WE
  • 【CTF_流量日志分析】来看看这段日志_提取日志中base64部分解码

    1 打开日志文件url解码进行观察 很明显传输的一段base64编码 随意解码一条发现为 var dump ord file get contents maybeinthisfile php 55 90 即对任意几条进行base64解码发现
  • python 深浅拷贝 赋值

    本质上和语言无关 是三种复制对象的方式 数据在物理地址中的内容 这个物理地址需要用地址寻址 那么复制就有多种办法 例如使两个变量指向同一个地址 或是创建一份新的物理地址存储同样内容 深拷贝 对象的本质是 名称 地址 引用 编程时用名称代替
  • fmp4打包H265视频流

    1 fmp4打包H265视频流 文章目录 1 fmp4打包H265视频流 1 1 码流存储和传输格式介绍 1 1 1 Annex B封装格式 1 1 2 AVCC封装格式 1 1 2 HVCC封装格式 1 2 fmp4封装H265 1 2