分析使用mediarecord采集的实时流格式
qq:9611153 微信lgs9611153
时间: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单元丢失或者没有传递,仅仅传递了数据,这时候如何播放呢?
如果只能使用流形式进行播放,需要设置好解码配置,输入关键帧,然后一帧帧的传递媒体数据到解码器进行解码播放。
传递到解码的数据必须是annexb格式而不能是rtp格式或者3gp这种必须配合索引才能解码的格式。