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的内容了。

下面来分析一个实例:

756f80fa8e8a503fec7b99c0081ee19e.png

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

下面来分析一个实例

ff450a64e0b7406dff4e2ae841e1bb4c.png

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

806a7c8229580407cae59d0ced684dfd.png

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

fbbfacbce62bb5131b115d94b36815e9.png

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,下面放出源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]iis7.5+win2008 出现 HTTP Error 503. The service is unavailable.

解决: 应用程序池启动32位应用程序 设置托管管道为集成 (仍然有问题) 试试以下方法: http://phpwind.me/1222.html 楼主 发表于: 2011-11-26 图片:123.png 访问网站之前 应用程序池是开启的 访问后 网页报503 service unavailabl…

sublime php运行环境,sublime php 运行环境

sublime php 运行环境sublime php 运行环境有时候需要用运行一段 PHP 代码,比如测试某个函数返回值等等,如果启动Http Server,再打开浏览器,那黄花菜都凉了。我们可以在 Sublime Text 3 中创建 php 的 build system,这…

用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句

实用的适合早上发的早安问候语语录汇编39句不管梦想是什么,只有带着淡然的态度,做好当前的事情。早安!下面是小编精心准备的适合早上发的早安问候语39句,欢迎大家前来欣赏。1、世上除了生死,其它都是小事。不管遇到了什么烦心事&a…

JQuery合并表格单元格

转:http://www.cnblogs.com/xuguoming/p/3412124.html JQuery合并表格单元格 一、需求 如果存在一个表格,想把其中某一列内容相同的部分合并单元格,用JQ动态如何操作,原始表格如下: 合并单元格之后的表格如下&#xff…

[音视频]H264码流分析工具

[音视频]H264码流分析工具 CTI-TS EasyICE Elecardstreameyetools VideoEye H264VideoESViewer 学习H264码流,H264码流进行分析 http://blog.csdn.net/leixiaohua1020/article/details/17933821 H264BSAnalyzer https://github.com/latelee/H264BSAnalyzer.g…

手机型号识别 手机PID UID 驱动识别 数据库包

主要用在手机驱动识别,列如手机助手开发,都需要用到这个.QQ9711-5034 整套数据库以及源码包含如下: 1) 包含1160 张手机外壳图片,78 个手机驱动文件。 2) 支持192 个品牌,2293 款手机,还有山寨机没有统计进…

Chart.js学习

一、简介 Chart.js是一个基于HTML5的简单的面向对象的图表库,支持包括IE7和8的所有现代浏览器。图表库中有6种表,分别是:曲线图(Linecharts)、柱状图(Barcharts)、雷达图(Radarchart…

php将图片导入,php中图片文件的导入,上传与下载

---------------------------------------------图片的导入-------------------------------------------------------------------图片的上传与下载上传图片:序号图片添加时间操作//打开目录$diropendir("./images");//遍历目录$i;while($freaddir($dir)){if($f!&qu…

用parsetInt解析数字,并求和

实现代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"en"> <h…

oracle arp绑定mac地址,使用ARP命令来绑定IP和MAC地址

使用ARP命令来绑定IP和MAC地址前言&#xff1a;我本来没有想过写关于ARP绑定的文章&#xff0c;坦白的说一句&#xff0c;在你理解ARP工作的原理时&#xff0c;这其实比较简单。只是看到最近论坛很多人在问关于绑定IP和MAC地址的问题&#xff0c;所以才决定写这个文章&#xff…

阿里巴巴2013年实习生笔试题A

一、单项选择题 1.下列说法不正确的是&#xff1a;&#xff08;B&#xff09; A.SATA硬盘的速度速度大约为500Mbps/s B.读取18XDVD光盘数据的速度为1Gbps C.前兆以太网的数据读取速度为1Gpbs D.读取DDR3内存数据的速度为100Gbps 解析&#xff1a;有说B的&#xff0c;有说D的&am…

linux之间安全传输文件,使用SCP安全地传输文件[Linux] | MOS86

终端访问远程Linux机器的最常见方法是使用安全Shell(SSH)。要工作&#xff0c;Linux服务器需要运行SSH服务器(OpenSSH)&#xff0c;另一端需要一个SSH客户端&#xff0c;像Windows中的PuTTy&#xff0c;或者Linux上的ssh命令行工具&#xff0c;或者其他类似Unix的操作系统&…

putty远程登录linux有啥用,putty 自动远程登录linux

在实际的开发和学习中我们会频繁的使用某些远程登录工具&#xff0c;通过网络登录到linux系统中进行程序编写和调试。Putty是比较流行的工具&#xff0c;但是在putty下每次链接到远端linux都要重新输入用户名和密码&#xff0c;就显得有些麻烦了。那么&#xff0c;有没有什么方…

eclipse中对单独JS文件取消报错的处理

eclipse中对单独JS文件取消报错的处理 eclipse中js文件报错的情况&#xff0c;或许大家早已习以为常了&#xff0c;那么有什么好的方法可以将其忽略掉呢&#xff1f;如果你也在寻找此问题&#xff0c;那么本文或许可以帮助到你 - 忽略某个js文件报错的方法&#xff1a; Project…

c语言方向变量,C语言,变量与内存

一、数在计算机中的二进制表示符号位&#xff1a;最高位为符号位&#xff0c;正数该位为0&#xff0c;负数该位为1&#xff1b;原码&#xff1a;原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值反码&#xff1a;正数的反码是其本身&#xff1b;负数的反码是…

新距离

1、这是个现实的社会&#xff0c;感情不能当饭吃&#xff0c;贫穷夫妻百事哀。不要相信电影里的故事情节&#xff0c;那只是个供许多陌生人喧嚣情感的场所。只有不理智和不现实的人才相信。  2、给自己定目标&#xff0c;一年&#xff0c;两年&#xff0c;五年&#xff0c;也…

android开发 文件分享到应用,Android开发之——7.0适配之应用之间共享文件(FileProvider)...

前言Android 7.0强制启用了被称作StrictMode的策略&#xff0c;带来的影响就是你的App对外无法暴露file://类型的URI了。如果你使用Intent携带这样的URI去打开外部App(比如&#xff1a;打开系统相机拍照)&#xff0c;那么会抛出FileUriException异常。官方给出解决这个问题的方…

android涂鸦板保存功能,android实现涂鸦,保存涂鸦后的图片,清屏

自定义view的类&#xff0c;代码如下&#xff1a;[html]package com.xy.tuya;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android…

浏览器与服务器响应流程-----(转)

一. 解析域名地址为IP地址 浏览器DNS缓存&#xff1a;以Chrome为例&#xff0c;在浏览器窗口中输入chrome://net-internals/#dns&#xff0c;就可以查看当前浏览器DNS缓存记录&#xff0c;chrome的DNS缓存过期时间还是比较短的&#xff0c;大约为1分钟。 本机DNS缓存&#xff1…

Pc-98 android,PC安卓多功能搞机助手3.98

V3.98版本更新日志&#xff1a;1.全新多设备检测机制&#xff0c;底层代码重写&#xff1b;2.新增支持检测安卓用户是否允许当前电脑调试设备&#xff1b;3.软件冻结#卸载中新增清除指定应用数据&#xff1b;4.小米线刷检测功能优化&#xff0c;修复之前版本不能正确识别设备是…