天天看点

分析使用mediarecord采集的实时流格式

分析使用mediarecord采集的实时流格式

​​编者:李国帅​​

时间:2013-7-13

背景原因:

对使用android自身的录像接口采集的实时流进行远程播放,需要写一个专门的播放程序对流进行适当处理才能进行播放。

差异说明:

采集mediarecord实时流传输时,和3gp或者mp4文件格式不同,因为实时流中每一帧的第一个4字节是该帧大小,而文件格式裸流的第一个4字节是标记000010BX等,所以不能混淆。

流分析:

以3gp格式

如果以3gp格式录制,编码格式如果是mp4v,

0x 00000018 66747970 69736F6D00000000 69736F6D33677034 文件头0x18字节

0x 0008737B 6D646174 文件头后面是媒体标记(mdat大小-包含大小和标记,"mdat")

0x 000001B6 10631996 CFACCFB6FF36DBFC 后面是mp4v帧分隔符000001B6,以及真正的视频数据,这个地方实际上是不符合mp4格式BOX标准的。

0x DB6FB9B6 DFE6DF7F 9F6DFE6DB7F9B6DF

在这个文件中,媒体帧的大小是从moov单元中分析出来的,所以在mdat单元中没有给出大小。

再后面就是moov单元了,放在文件最后。

以h264格式

如果编码格式是h264,也就是avc1,那么媒体是

00000018 667479703367703400000000 69736F6D33677034 文件头 ftyp box

00067DF5 6D646174  mdat

3C1CA8A5B89DE9C7  音频头,说明音频帧没有指明大小----------我们的测试中暂时不考虑音频

00000480 65B8407FFFF0BC50001070F7 视频帧前面的00000480指的是不包含长度的视频帧的数据大小。

补充说明:

从网络获取流的时候,可能3gp或者mp4的moov单元丢失或者没有传递,仅仅传递了数据,这时候如何播放呢?

继续阅读