public static byte[] GetMediaFrameEntityBytes(MediaFrameEntity entity) { var ms = new MemoryStream(); var bw = new BinaryWriter(ms); bw.Write(new byte[4]); bw.Write((byte)entity.MediaType); bw.Write(entity.Ex); bw.Write(entity.EncodTime); bw.Write(entity.Index); bw.Write(entity.Width); bw.Write(entity.Height); bw.Write(entity.FrameRate); bw.Write(entity.KeyFrame); bw.Write(entity.SampleRate); bw.Write(entity.Length); bw.Write(entity.Buffer); bw.Seek(0, SeekOrigin.Begin); bw.Write((int)(ms.Length - 4)); var r = ms.ToArray(); return(r); }
public static MediaFrameEntity MediaFrame2MediaSteamEntity(MediaFrame frame) { var result = new MediaFrameEntity() { Buffer = frame.Data, Length = (ushort)frame.nSize, EncodTime = frame.nTimetick, MediaType = frame.nIsAudio == 1 ? MediaType.AudioES : MediaType.VideoES, SampleRate = 32000, FrameRate = 25, Width = (ushort)frame.nWidth, Height = (ushort)frame.nHeight, KeyFrame = (byte)(frame.nIsAudio == 0 && frame.nIsKeyFrame == 1 ? 1 : 0), }; if (frame.nIsAudio == 1 && frame.nIsKeyFrame == 1) { result.SampleRate = (ushort)frame.nFrequency; } if (frame.IsCommandMediaFrame()) { result.Buffer = new byte[0]; result.Length = 0; } return(result); }
public static MediaFrameEntity GetMediaFrameEntity(byte[] bytes) { var ms = new MemoryStream(bytes); var br = new BinaryReader(ms); MediaFrameEntity entity = new MediaFrameEntity(); entity.MediaType = (MediaType)br.ReadByte(); entity.Ex = br.ReadInt32(); entity.EncodTime = br.ReadInt64(); entity.Index = br.ReadInt32(); entity.Width = br.ReadUInt16(); entity.Height = br.ReadUInt16(); entity.FrameRate = br.ReadUInt16(); entity.KeyFrame = br.ReadByte(); entity.SampleRate = br.ReadUInt16(); entity.Length = br.ReadInt32(); entity.Buffer = br.ReadBytes(entity.Length); return(entity); }
public static MediaFrame MediaSteamEntity2MediaFrame(MediaFrameEntity entity, ref StreamInfo streamInfo) { if (entity.MediaType == MediaType.VideoES) { if (entity.KeyFrame == 0) { MediaFrame mf = null; if (streamInfo != null && streamInfo.SPS_PPSInited && streamInfo.Width == entity.Width && streamInfo.Height == entity.Height) { mf = new MediaFrame() { nIsAudio = 0, nIsKeyFrame = 0, Data = entity.Buffer, nSize = entity.Length, nHeight = entity.Height, nWidth = entity.Width, nSPSLen = (short)streamInfo.Video_SPS.Length, nPPSLen = (short)streamInfo.Video_PPS.Length, nTimetick = ThreadEx.TickCount, nOffset = 0, nEncoder = MediaFrame.H264Encoder, nEx = 1, MediaFrameVersion = 0x00, }; } return(mf); } else if (entity.KeyFrame == 1) { bool needResetCodec = false; if (streamInfo == null || (streamInfo != null && (streamInfo.Width != entity.Width || streamInfo.Height != entity.Height))) { streamInfo = new StreamInfo(); var sps_pps = GetSPS_PPS(entity.Buffer); if (sps_pps != null) { streamInfo.Video_SPS = sps_pps[0]; streamInfo.Video_PPS = sps_pps[1]; streamInfo.Video_SPSString = streamInfo.Video_SPS.To16Strs(); streamInfo.Video_PPSString = streamInfo.Video_PPS.To16Strs(); streamInfo.SPS_PPSInited = true; streamInfo.Width = entity.Width; streamInfo.Height = entity.Height; needResetCodec = true; } } if (streamInfo.Video_SPS == null) { var mf = new MediaFrame() { nIsAudio = 0, nIsKeyFrame = 1, Data = entity.Buffer, nSize = entity.Length, nHeight = entity.Height, nWidth = entity.Width, nSPSLen = 0, nPPSLen = 0, nTimetick = ThreadEx.TickCount, nOffset = 0, nEncoder = MediaFrame.H264Encoder, nEx = (byte)(needResetCodec ? 0 : 1), //nEx=(byte)entity.Ex, MediaFrameVersion = 0x01, }; return(mf); } else { var mf = new MediaFrame() { nIsAudio = 0, nIsKeyFrame = 1, Data = entity.Buffer, nSize = entity.Length, nHeight = entity.Height, nWidth = entity.Width, nSPSLen = (short)streamInfo.Video_SPS.Length, nPPSLen = (short)streamInfo.Video_PPS.Length, nTimetick = ThreadEx.TickCount, nOffset = 0, nEncoder = MediaFrame.H264Encoder, nEx = (byte)(needResetCodec ? 0 : 1), //nEx=(byte)entity.Ex, MediaFrameVersion = 0x01, }; return(mf); } } else { throw new Exception("帧类型错误"); } } else if (entity.MediaType == MediaType.AudioES) { if (streamInfo == null) { streamInfo = new StreamInfo(); } try { var mf = new MediaFrame() { nIsAudio = 1, nIsKeyFrame = 1, Data = entity.Buffer, nSize = entity.Length, nChannel = 1, nFrequency = 32000, nAudioFormat = 2, nTimetick = ThreadEx.TickCount, nOffset = 0, nEncoder = MediaFrame.AAC_Encoder, nEx = 1, MediaFrameVersion = 0x01, }; //if (mf.nIsKeyFrame == 1) // mf.nEx = 0; mf.StreamID = (short)entity.Index;//区分俩路音频数据 streamInfo.IsFirstAudioFrame = false; return(mf); } catch (Exception ex) { throw ex; } } else { throw new Exception("流类型错误"); } }