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("流类型错误");
     }
 }