java封装264成flv,将H.264封装为FLV格式-Go语言中文社区
本文将介绍如何将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:01
TypeFlagsReserved [Bit 3-7]:0
TypeFlagsAudio [Bit 2]:0
TypeFlagsReserved [Bit 1]:0
TypeFlagsVideo [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,下面放出源码。
java封装264成flv,将H.264封装为FLV格式-Go语言中文社区相关推荐
- java.强引用软引用,java 强引用、软引用、弱引用、虚引用-Go语言中文社区
这篇文章的一个评论很有特点: 强引用: (一)强引用就是在程序代码之中普遍存在的,类似Object obj = new Object()这类的引用, 只要强引用还存在,垃圾收集器永远不会回收掉被引用的 ...
- java mysql查询界面_Java GUI小程序 实现数据库查询界面-Go语言中文社区
源代码如下:package 数据库图形化界面3; import java.awt.*; import javax.swing.*; import java.awt.event.*; public cl ...
- java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...
完成效果如下 客户端: 服务器端: 客户端功能: 输入服务器对应的端口,IP号,用户名(昵称),可以互相发送消息 服务器端功能: 输入端口号,启动,可以向所有客户端发送消息,IP地址自动获取. 下面是 ...
- java pdf stamper_java 通过pdf模板,生成PDF,并下载到本地-Go语言中文社区
注意:本例子是从向模板定义的变量赋值,而不是从无到有的来生成pdf 直接就能用 maven依赖: com.lowagie itext 4.2.1 工具类: package com.upincar.pd ...
- java设置窗体焦点_JAVA之关于swing窗体设置默认焦点-Go语言中文社区
画了个简单的dialog, 但是焦点总是停在User Name的text field上. 想把焦点放在OK button上, 按回车的时候就能执行Ok button的功能. 加了dialog.getR ...
- 【音视频数据数据处理 12】【H.264篇】解析H.264原始码流中的I帧 / P帧 / B帧数据(暂未解决,本文先放着,来日更新)
[音视频数据数据处理 12][H.264篇]解析H.264原始码流中的I帧 / P帧 / B帧数据 一.如何判断是 I帧 / P帧 / B帧 1.1 slice_type 1.2 slice_head ...
- 如何将AD类型的封装导成Allegro库中的封装
1.首先使用的是LCSC下载的封装,以电容0201封装为例.下载下来格式如下: 2.中间需要使用PADS转一下格式,转成asc格式的.AD的不知道可不可以直接转,我也是之前在某个教程中学的,可能操作复 ...
- java面向对象之封装,java面向对象之封装-Go语言中文社区
一直感觉自己对面向对象编程理解的不是很深刻 所以总结下这篇文章留作笔记 共勉 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方 ...
- java采用匈牙利命名法_【Java】工具类,如何将匈牙利命名法转换成驼峰命名法-Go语言中文社区...
一.概念介绍 1.1.匈牙利命名法:user_id,字母均小写,不同单词间用下划线分割: 1.2.驼峰命名法:userId,除了第一个单词的首字母小写,其余单词的首字母均大写,单词之间没有符号,仅仅通 ...
最新文章
- 客快物流大数据项目(四十九):开发环境初始化
- 一个具有20位地址和32位字长的存储器_step7编程之地址概念详解
- 概率论-3.4 多维随机变量的特征数
- 9、linux内存管理子系统
- MFC导出对话框类DLL的实现
- linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验
- [Ext JS 4]性能优化
- 1、深入理解 Laravel Eloquent(一)——基本概念及用法
- html清除两端浮动,HTML中如何实现浮动与清除浮动
- 【转】货币的未来取决于打破关于货币历史的虚构谎言
- ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
- 学习到第一个国庆的感想
- 尤雨溪 vue 3.0 Bate
- ncre报名系统服务器不可用,新版NCRE考试系统问题及解决方法.doc
- uiautomator2+ tesseract 智能识别文字实现手游辅助外挂,打怪刷装备快人一步
- android返回到首页,android中实现返回首页功能
- 文件大小单位Bytes, KB, MB, GB, TB, PB等及换算关系,英语怎么说?
- [matlab] 7.快速搜索随机树(RRT---Rapidly-exploring Random Trees) 路径规划
- c语言中双星号,C中的双星号和`malloc`
- Brother HL-2260D打印机添加墨粉方法
热门文章
- JAVA增删查改的实现
- 【OpenCV 例程200篇】06. 像素的编辑(img.itemset)
- php spss,spss新手入门
- linux vg备份还原,Oracle Linux 6.4 误删VG之恢复过程
- 多个服务器数据互通_5月23日部分服务器数据互通公告!
- C/C++混淆点-运算符短路
- Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理
- 如何提高写前端的效率?干货,快进!
- web api 权限控制
- 程序员怎样锻炼编程思维(学习方法)