public List <MUX> ParseEntireMUX(Stream currentStream) { List <MUX> muxs = new List <MUX>(); MultiplexFrameHeader _mf1ConfigHeader = ParseMultiplexFrameHeader(0, currentStream); // 解析 控制帧 int offset = SearchServiceMultiplexConfigTable(currentStream, _mf1ConfigHeader); if (offset != -1) { ParseServiceMultiplexConfigTable(offset, currentStream); } // fill the MF length foreach (var v in _msConfigTable.mfConfigTables) { uint len = MFLengthLookupTable(v); v.Length = len; } // 初始化结束,开始解视频帧 uint offset2 = _msConfigTable.mfConfigTables[0].Length + _msConfigTable.mfConfigTables[1].Length; for (int i = 2; i < _msConfigTable.mpFameNum; i++) { uint offset3 = offset2; MUX mux = new MUX(); mux.stream = currentStream; // 从第二个复用帧开始 mux.muxHeader = ParseMultiplexFrameHeader((int)offset3, currentStream); offset3 += mux.muxHeader.headerLength + CRC_Size; mux.msf = new MSF(); mux.msf.msfHeader = ParseMSFHeader((int)offset3, currentStream); // 解析视频段’ offset3 += mux.msf.msfHeader.Length + CRC_Size; mux.msf.videoBlock = ParseVideoBlock((int)offset3, currentStream); //TODO 解析 音频段 offset3 += mux.msf.msfHeader.VideoBlockLenth; mux.msf.audioBlock = ParseAudioBlock((int)offset3, currentStream); // the next muxs.Add(mux); offset2 += _msConfigTable.mfConfigTables[i].Length; } return(muxs); }
public int SearchServiceMultiplexConfigTable(Stream s, MultiplexFrameHeader _mf1ConfigHeader) { //定位持续业务复用配置表 int MFHeaderOffset = 0; byte[] tmp = new byte[4]; //非业务复用帧 if (_mf1ConfigHeader.MD_ID != 0) { return(-1); } //复用帧头长度 MFHeaderOffset = (int)_mf1ConfigHeader.headerLength + CRC_Size; s.Seek(MFHeaderOffset, SeekOrigin.Begin); int offset = 0; bool re = false; //读取每个控制表的标示号(1byte),寻找 持续业务复用配置表 for (int i = 0; i < _mf1ConfigHeader.subFrameNum; i++) { s.Read(tmp, 0, 1); s.Seek(-1, SeekOrigin.Current); if (tmp[0] == 0x02) { re = true; break; } else { offset += _mf1ConfigHeader.subFrameLength[i]; s.Seek(offset, SeekOrigin.Current); } } if (re) { return(offset + MFHeaderOffset); } else { return(-1); } }
public MultiplexFrameHeader ParseMultiplexFrameHeader(int offset, Stream _stream) { _stream.Seek(offset, SeekOrigin.Begin); byte[] tmp = new byte[4]; int r = _stream.Read(tmp, 0, 4); // read the start code, if (r != 4) { return(null); } if (BitTools.FindBytePattern(tmp, frameStartCode) != 0) { return(null); // start code not match, return } MultiplexFrameHeader mfHeader = new MultiplexFrameHeader(); mfHeader.startAddr = 0x0; // parse frame header length 1 byte. _stream.Read(tmp, 0, 1); mfHeader.headerLength = tmp[0]; // 再读两个字节,协议版本号5 bit, 最低版本号5 bit, 复用帧标示 6 bit _stream.Read(tmp, 0, 2); mfHeader.MD_ID = (uint)BitTools.MaskBits(tmp, 10, 6); // 跳过4个字节, 包括从紧急广播提示-ESG更新序列号 _stream.Seek(4, SeekOrigin.Current); // 读一个字节,取出 subFrame number (4 bit) _stream.Read(tmp, 0, 1); mfHeader.subFrameNum = (uint)BitTools.MaskBits(tmp, 4, 4); //读取子帧长度 (3 byte) mfHeader.subFrameLength = new int[mfHeader.subFrameNum]; for (int i = 0; i < mfHeader.subFrameNum; i++) { _stream.Read(tmp, 0, 3); mfHeader.subFrameLength[i] = BitTools.MaskBits(tmp, 0, 24); } return(mfHeader); }
public int SearchServiceMultiplexConfigTable(Stream s, MultiplexFrameHeader _mf1ConfigHeader) { //定位持续业务复用配置表 int MFHeaderOffset = 0; byte[] tmp = new byte[4]; //非业务复用帧 if (_mf1ConfigHeader.MD_ID != 0) return -1; //复用帧头长度 MFHeaderOffset = (int)_mf1ConfigHeader.headerLength + CRC_Size; s.Seek(MFHeaderOffset, SeekOrigin.Begin); int offset = 0; bool re = false; //读取每个控制表的标示号(1byte),寻找 持续业务复用配置表 for (int i = 0; i < _mf1ConfigHeader.subFrameNum; i++) { s.Read(tmp, 0, 1); s.Seek(-1, SeekOrigin.Current); if (tmp[0] == 0x02) { re = true; break; } else { offset += _mf1ConfigHeader.subFrameLength[i]; s.Seek(offset, SeekOrigin.Current); } } if (re) return offset + MFHeaderOffset; else return -1; }
public MultiplexFrameHeader ParseMultiplexFrameHeader(int offset, Stream _stream) { _stream.Seek(offset, SeekOrigin.Begin); byte[] tmp = new byte[4]; int r = _stream.Read(tmp, 0, 4); // read the start code, if (r !=4) return null; if (BitTools.FindBytePattern(tmp, frameStartCode) != 0) return null; // start code not match, return MultiplexFrameHeader mfHeader = new MultiplexFrameHeader(); mfHeader.startAddr = 0x0; // parse frame header length 1 byte. _stream.Read(tmp, 0, 1); mfHeader.headerLength = tmp[0]; // 再读两个字节,协议版本号5 bit, 最低版本号5 bit, 复用帧标示 6 bit _stream.Read(tmp, 0, 2); mfHeader.MD_ID = (uint)BitTools.MaskBits(tmp, 10, 6); // 跳过4个字节, 包括从紧急广播提示-ESG更新序列号 _stream.Seek(4, SeekOrigin.Current); // 读一个字节,取出 subFrame number (4 bit) _stream.Read(tmp, 0, 1); mfHeader.subFrameNum = (uint)BitTools.MaskBits(tmp, 4, 4); //读取子帧长度 (3 byte) mfHeader.subFrameLength = new int[mfHeader.subFrameNum]; for (int i = 0; i < mfHeader.subFrameNum; i++) { _stream.Read(tmp, 0, 3); mfHeader.subFrameLength[i] = BitTools.MaskBits(tmp, 0, 24); } return mfHeader; }