flv格式的投屏方法: 重温投屏技术
这里我决定采用flv作为我的投屏格式,为什么呢?应为他可以做直播,刚好满足我桌面投屏的需求。
推荐一个视频测试源地址
samples.mplayerhq.hu
测试源找到之后,还需要一个解析工具,这里使用FlvParse工具
接下来,进入到一个漫长的过程,,,研究他的格式。。参考下面这位大哥的
**********************************解析过程********************************
上定义
我们对照定义,比较一下值
Signature:0x46
Signature:0x4C
Signature:0x56
Version:0x01
TypeFlagReserved: 0x05----->0000 0101--->0
TypeFlagsAudio:1
TypeFlagsReserved:0
TypeFlagsVideo:1
DataOffset:00 00 00 09--->9个
*********************flv头之后就是flv的body,他的格式如下:
通过这个定义,其实通俗一点说就是tag与previoustagsize的交互
file header之后的第一个previoustagsize为0,如下图:
接下来是tag了,我们看tag的定义:
通过上诉描述,可以看到,tag有3种格式,我们直接上码流进行解析
TagType:0x12 --->18
DataSize:0x00 0x00 0xB7--->183
Timestamp:0x00 0x00 0x00
TimestampExtended:0x00
StreamID :0x00 0x00 0x00
这里的tagtype为18的时候,定义非常复杂,我就就事论事,研究我的这一段格式
Type:0x02 --->2 String Type
StringLength:0x00 0x0A --->10
StringData:0x6F 0x6E 0x4D 0x65 0x74 0x61 0x44 0x61 0x74 0x61(10个字符)
Type:0x08--->ECMA array type
EcmAArrayLength:0x00 0x00 0x00 0x07--->7 表示有7个描述对象
StringLength:0x00 0x08 --->8
duration:
type:0x00 ->double 表示下面有8个字节的数据
ScriptDataValue: 0x40 0x67 0xA2 0x8F 0x5C 0x28 0xF5 0xC3 (8个字节) --->这里是double的内存数据
终于找到了定义
Type:0x00 -->numbertype
*****************************************************20190609**************
再继续往下看
这里的pre tag size 为什么是194呢?
他的值是上一个tag的字节数量
我们算一下,一共11*16+15+3 = 176+18 = 194,这里就对应上了。
再往下分析一个audio tag
TagType:0x08 ---》代表audio
DataSize:0x00 0x01 0x3A-->314 表示后面的tagData的大小
Timestamp:0x00 0x00 0x00
TimestampExtended:0x00
StreamID: 0x00 0x00 0x00
AudioData:
上定义:
SoundFormat :0010 --》2 mp3格式
SoundRate:11 ---》3 44KHZ
SoundSize:1 ---》Snd16BIt
SoundType:1---》sndStereo (立体声)
*****************************audio tag相对好简单*************************
下面开始video tag
先看定义:
这里我直接上一段码流:
TagType:0x089 ---》代表Video
DataSize:0x00 0x30 0xDE-->12510 表示后面的tagData的大小
Timestamp:0x00 0x00 0x00
TimestampExtended:0x00
StreamID: 0x00 0x00 0x00
video tag解析
TagType :0001 --》keyFrame
CoderID:0010---》H.263
VideoData:H263Data
*****************至此flv的格式解析结束了*****************
由于我的实际使用中,是H264的码流格式,所以,我想再分析一段H264的码流。
所以我找了一段mp4的文件,用ffmpeg命令合成了一段flv文件
ffmpeg -i test.mp4 -c:v libx264 test.flv
pause
再次打开文件
TagType :0001 --》keyFrame
CoderID:0111---》7---》AVC(H264)
AVCPacketType:00 --》AVC Sequence header
CompositionTime:00 00 00
第一包防止sps 与pps
各个数字如下:
configurationVersion: 0x01
AVCProfileIndication:0x64 (sps[1])
profile_compatibility:0x00 (sps[2])
AVCLevelIndication:0x1E (sps[3])
Reserved:111111
lengthSi*usOne:11--->3
reserved:111
numofSequenceParameterSets:00001 --->1
sequenceParameterSelLength:0x00 0x19 --->25
numofPicyurePatameterSets:0x01 --->1
pictureParameterSetLength:0x00 0x06 --->6
再看下一包的视频
TagType :0001 --》keyFrame
CoderID:0111---》7---》AVC(H264)
AVCPacketType:01 --》AVC NALU
CompositionTime:0x00 0x00 0x53 -->83
Length:0x00 0x00 0x02 0xAE--->686
data:
Length:0x00 0x00 0x65 0x37---》25911
不过这个定义我在文档上面没有找到。