本文将介绍如何将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语言中文社区相关推荐

  1. java.强引用软引用,java 强引用、软引用、弱引用、虚引用-Go语言中文社区

    这篇文章的一个评论很有特点: 强引用: (一)强引用就是在程序代码之中普遍存在的,类似Object obj = new Object()这类的引用, 只要强引用还存在,垃圾收集器永远不会回收掉被引用的 ...

  2. java mysql查询界面_Java GUI小程序 实现数据库查询界面-Go语言中文社区

    源代码如下:package 数据库图形化界面3; import java.awt.*; import javax.swing.*; import java.awt.event.*; public cl ...

  3. java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...

    完成效果如下 客户端: 服务器端: 客户端功能: 输入服务器对应的端口,IP号,用户名(昵称),可以互相发送消息 服务器端功能: 输入端口号,启动,可以向所有客户端发送消息,IP地址自动获取. 下面是 ...

  4. java pdf stamper_java 通过pdf模板,生成PDF,并下载到本地-Go语言中文社区

    注意:本例子是从向模板定义的变量赋值,而不是从无到有的来生成pdf 直接就能用 maven依赖: com.lowagie itext 4.2.1 工具类: package com.upincar.pd ...

  5. java设置窗体焦点_JAVA之关于swing窗体设置默认焦点-Go语言中文社区

    画了个简单的dialog, 但是焦点总是停在User Name的text field上. 想把焦点放在OK button上, 按回车的时候就能执行Ok button的功能. 加了dialog.getR ...

  6. 【音视频数据数据处理 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 ...

  7. 如何将AD类型的封装导成Allegro库中的封装

    1.首先使用的是LCSC下载的封装,以电容0201封装为例.下载下来格式如下: 2.中间需要使用PADS转一下格式,转成asc格式的.AD的不知道可不可以直接转,我也是之前在某个教程中学的,可能操作复 ...

  8. java面向对象之封装,java面向对象之封装-Go语言中文社区

    一直感觉自己对面向对象编程理解的不是很深刻 所以总结下这篇文章留作笔记 共勉 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方 ...

  9. java采用匈牙利命名法_【Java】工具类,如何将匈牙利命名法转换成驼峰命名法-Go语言中文社区...

    一.概念介绍 1.1.匈牙利命名法:user_id,字母均小写,不同单词间用下划线分割: 1.2.驼峰命名法:userId,除了第一个单词的首字母小写,其余单词的首字母均大写,单词之间没有符号,仅仅通 ...

最新文章

  1. 客快物流大数据项目(四十九):开发环境初始化
  2. 一个具有20位地址和32位字长的存储器_step7编程之地址概念详解
  3. 概率论-3.4 多维随机变量的特征数
  4. 9、linux内存管理子系统
  5. MFC导出对话框类DLL的实现
  6. linux cached释放_正点原子Linux第四十一章嵌入式Linux LED驱动开发实验
  7. [Ext JS 4]性能优化
  8. 1、深入理解 Laravel Eloquent(一)——基本概念及用法
  9. html清除两端浮动,HTML中如何实现浮动与清除浮动
  10. 【转】货币的未来取决于打破关于货币历史的虚构谎言
  11. ajax authorization,ajax跨域,_ajax Authorization 鉴权失败,ajax跨域 - phpStudy
  12. 学习到第一个国庆的感想
  13. 尤雨溪 vue 3.0 Bate
  14. ncre报名系统服务器不可用,新版NCRE考试系统问题及解决方法.doc
  15. uiautomator2+ tesseract 智能识别文字实现手游辅助外挂,打怪刷装备快人一步
  16. android返回到首页,android中实现返回首页功能
  17. 文件大小单位Bytes, KB, MB, GB, TB, PB等及换算关系,英语怎么说?
  18. [matlab] 7.快速搜索随机树(RRT---Rapidly-exploring Random Trees) 路径规划
  19. c语言中双星号,C中的双星号和`malloc`
  20. Brother HL-2260D打印机添加墨粉方法

热门文章

  1. JAVA增删查改的实现
  2. 【OpenCV 例程200篇】06. 像素的编辑(img.itemset)
  3. php spss,spss新手入门
  4. linux vg备份还原,Oracle Linux 6.4 误删VG之恢复过程
  5. 多个服务器数据互通_5月23日部分服务器数据互通公告!
  6. C/C++混淆点-运算符短路
  7. Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理
  8. 如何提高写前端的效率?干货,快进!
  9. web api 权限控制
  10. 程序员怎样锻炼编程思维(学习方法)