将H.264封装为FLV格式
本文将介绍如何将H.264封装成flv格式。
在看本文之间,建议先看一看下面两篇文章:
H.264码流结构
FLV格式详解
首先说一说构建一个FLV文件需要什么?
FLV Header + FLv script tag + FLV Video tag + FLV Audio tag
由于这里只是封装H.264,所以不包括Audio tag。
下面将通过分析示例来说明FLV Header + FLv script tag + FLV Video tag
这三部分如何构建。
1、FLV Header
通过阅读上面的文章《FLV格式详解》应该就很清楚FLV Header的内容了。
下面来分析一个实例:
Signature:0x46('F')
Signature:0x4c('L')
Signature:0x56('V')
Version:01
Flags:01TypeFlagsReserved [Bit 3-7]:0TypeFlagsAudio [Bit 2]:0TypeFlagsReserved [Bit 1]:0TypeFlagsVideo [Bit 0]:1
DataOffset:00 00 00 09
preTagSize:00 00 00 00 // 第一个tag默认为0
2、FLv script tag
又称Metadata Tag,位于flv header后的第一个tag
下面来分析一个实例
Tag Header:
TagType:12(表示这是一个script tag)
Datasize:00 00 9f(Tag Data 部分的大小)
Timestamp:00 00 00(该Tag的时间戳)
Timestamp_ex:00(时间戳的扩展部分)
StreamID::00 00 00(总是0)
Tag data:
因为TagType为0x12,所以这部分的数据为两个AMF包
第一个AMF包:
type:02(表示字符串)
stringLen:00 0a(字符串长度为10)
string:6f 6e 4d 65 74 61 44 61 74 61(onMetaData)
第二个AMF包:
type:08(表示数组)
arrayNum:00 00 00 07(数组元素个数)
stringLen:00 08(第一个数组元素字符串长度)
string:64 75 72 61 74 69 6f 6e(duration)
valType:00(数据类型,double型)
val:40 03 70 a3 d7 0a 3d 71(double型)
stringLen:00 05
string:77 69 64 74 68(width)
...
end:00 00 09
preTagSize:00 00 00 aa
3、FLV Video Tag
这部分封装着图像数据,也就是H.264的数据封装在这里。
H.264是由一个一个NALU组成,NALU的类型有(SPS、PPS、I帧的SLICE、非I帧的SLICE)
封装H.264就是将这些NALU一个一个取出来,然后封装成Tag。
需要注意的是,SPS与PPS必须封装在一个Tag中。
下面分别通过实例来分析各种NALU(SPS、PPS、I帧的SLICE、SEI、非I帧的SLICE)是怎么封装的。
1、SPS与PPS
Tag Header:
TagType:09(Tag的类型,包括音频(0x08)、视频(0x09)、script data(0x12))
Datasize:00 00 2e(Tag Data 部分的大小)
Timestamp:00 00 00(时间戳,19ms)
Timestamp_ex:00(时间戳的扩展部分)
StreamID:00 00 00(总是0)
Tag data:
FrameType | CodecID:17(keyframe | AVC)(视频tag的参数)
AVCVideoPaket:(因为CodecID==7,所以VideoData为AVCVideoPaket)
AVCPaketType:00(ACVPacket的类型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 00
(因为ACVPaketType==0,所以Data=AVCDecoderConfigurationRecord)
AVCDecoderConfigurationRecord:
configurationVersion:01
AVCProfileIndication:64
profile_compatibility:00
AVCLevelIndication:1e
lengthSizeMinusOne:ff
numOfSequenceParameterSets:e1(低五位为SPS的个数,计算方法为:numOfSequenceParameterSets & 0x1F=1)
sequenceParameterSetLength:00 18(SPS的长度,24)
sequenceParameterSetNALUnits:67 64 00 1e ac d9 40 a0 33 b0 11 00 00 03 02 47 00 00 6d 34 0f 16 2d 96(SPS)
numOfPictureParameterSets:01(PPS的个数)
pictureParameterSetLength:00 06(PPS的长度)
pictureParameterSetNALUnits:68 eb e3 cb 22 c0(PPS)
previousTagSize:00 00 00 39
2、I帧的SLICE
Tag Header:
TagType:09(Tag的类型,包括音频(0x08)、视频(0x09)、script data(0x12))
Datasize:00 35 78(Tag Data 部分的大小)
Timestamp:00 00 0a(时间戳,19ms)
Timestamp_ex:00(时间戳的扩展部分)
StreamID:00 00 00(总是0)
Tag data:
FrameType | CodecID:17(key frame | AVC)(视频tag的参数)
因为CodecID==7,所以VideoData为AVCVideoPaket
AVCVideoPaket:
AVCPaketType:01(ACVPacket的类型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 0a
NaluLen:00 00 35 6f
NaluData:...
preTagSize:00 00 35 83
对于SEI的封装跟I帧是一样的。
3、非I帧的SLICE
非I帧的封装格式和I帧的封装格式基本一样,唯一不同的是FrameType | CodecID:部分,应该设置为:
FrameType | CodecID:27(inter frame | AVC)(视频tag的参数)
总结:以上通过实例讲解了FLV的头部信息,script tag,以及H.264不同类型的NALU如何封装成tag,下面放出源码。
GitHub:https://github.com/ImSjt/H.264toFLV
CSDN下载:https://download.csdn.net/download/weixin_42462202/11037715
将H.264封装为FLV格式相关推荐
- java封装264成flv,将H.264封装为FLV格式-Go语言中文社区
本文将介绍如何将H.264封装成flv格式. 在看本文之间,建议先看一看下面两篇文章: 首先说一说构建一个FLV文件需要什么? FLV Header + FLv script tag + FLV Vi ...
- H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式
H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +------------ ...
- 将h.264视频流封装成flv格式文件(一.flv格式)
原帖地址:http://blog.csdn.net/yeyumin89/article/details/7932368 原帖虽然贵为好贴,看感觉看起来有点乱,没有层次感,贴过来,修改下格式,阅读起来方 ...
- H.264视频RTP负载格式/NALU的类型
1. 网络抽象层单元类型(NALU) NALU 头由一个字节组成, 它的语法如下: +===============+ |0|1|2|3|4|5|6|7| +=+= ...
- 将h.264视频流封装成flv格式文件
https://blog.csdn.net/leixiaohua1020/article/details/84519384 https://blog.csdn.net/xin_hua_3/articl ...
- linux mp4转h264工具,在Ubuntu下批量转换视频为H.264编码的mp4格式
是目前比较流行的视频编码方式,比起MPEG2在画质大致相同的情况下能再压缩2-4倍,即如果一个DVD视频大小是1GB,用H264编码后能缩小到250MB左右,同时H264视频还能用时髦的浏览器(比如F ...
- RTMP推流H.264
t通过对以下内容的学习完成H.264的推流 1.H.264格式分析 https://time.geekbang.org/column/article/461658 2.FLV格式分析 https:// ...
- H.264 RTP payload 格式
H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+ |0|1|2|3|4|5|6| ...
- 音视频 FLV格式解析
前言 本文介绍FLV封装格式,直播场景下拉流比较常见的是http-flv直播流,具有延时低.易传输等特点. 格式概览 总体上看,FLV包括文件头(File Header)和文件体(File Body) ...
- 流媒体解码及H.264编码推流
简介 相关理论 程序流程 Opencv解析视频流 像素格式转换 FFmpeg进行H.264编码 FFmpeg进行格式封装和推流 这里我们使用了FFmpge的sdk和Opencv的sdk.为了方便测试, ...
最新文章
- C#多线程编程介绍——使用thread、threadpool、timer
- 1.2 @Override注解
- 从1.5k到18k, 一个程序员的5年成长之路【转载】
- 昇腾AI处理器软件栈--流程编排器(Matrix)
- 基于Django的博客系统
- 由浅入深理解索引的实现(2)【转】
- 会员注册审核状态更新计算
- 不能从远程创建com+对象_链路追踪SkyWalking源码分析——Collector Remote远程通信服务...
- 【学习笔记】生成下一个排列(STL库函数next——permutation)
- 头歌c语言答案循环结构,C语言的“汤头歌”
- google 翻译 api
- LDO:低压差线性稳压芯片
- stm32 看门狗 BKP(HAL库)
- 【系列】重新认识Java——基本类型和包装类
- 高精度地图,从入门到入行
- Mac下载安装配置maven
- 网页PDF下载,有了这3种方法,文档随便下
- 机器学习--鸢尾花数据集实战
- Bugku之聪明的小羊
- 计算机毕业设计Java高校游泳馆信息管理(源码+系统+mysql数据库+Lw文档)
热门文章
- Windows下和Linux下VS Code与C/C++ Python Go Java Vue3 Git vim Latex开发环境搭建和配置史上最详细易懂的讲解
- 链表A拆分成奇数和偶数值链表B和C
- 优化网站提高打开速度
- Android setLayoutparams失效几个原因
- 三菱Q系列PLC数据采集随笔
- 代码实现HelloMeituanCom转换为hello.meituan.com
- 韦东山第3期嵌入式Linux项目-视频监控-1-v4l2视频框架分析
- 联盛德 HLK-W806 (三): 免按键自动下载和复位
- matlab编程螺旋oam,一种多模态OAM涡旋电磁波微带阵列天线制造技术
- 虹科AR智能眼镜是什么?好用吗?