コード例 #1
0
ファイル: PSAnalyze.cs プロジェクト: zz110/GB28181.Solution
        private MediaFrame CreateAudioMediaFrame(byte[] data, long tick)
        {
            if (_firstAudioFrame)
            {
                var adts       = new AAC_ADTS(data);
                var frequencys = new int[] { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 2000, 11025 };
                Frequency   = frequencys[adts.MPEG_4_Sampling_Frequency_Index];
                Channel     = adts.MPEG_4_Channel_Configuration;
                AudioFormat = 16;
                Samples     = 0;
            }
            VideoFrameCount++;
            var mf = new MediaFrame()
            {
                IsAudio           = 1,
                IsKeyFrame        = 1,
                Size              = data.Length,
                Channel           = Channel,
                Frequency         = Frequency,
                AudioFormat       = AudioFormat,
                NTimetick         = tick,
                Offset            = 0,
                Encoder           = MediaFrame.AAC_Encoder,
                Ex                = (byte)(_firstAudioFrame ? 0 : 1),
                MediaFrameVersion = 1,
            };

            mf.SetData(data);
            _firstAudioFrame = false;

            return(mf);
        }
コード例 #2
0
        public void Test264FileFrame()
        {
            int width = 320, height = 240;
            var x264 = new X264Native(new X264Params(width, height, 10, 320));

            //x264.SetIKeyIntMax(10);
            x264.Init();
            var        fs    = new FileStream("./testfile.test", FileMode.CreateNew);
            var        ls    = StreamingKit.Media.ReadFile.GetBuffByFile1(@".\test.yuv");
            AVCodecCfg cf    = AVCodecCfg.CreateVideo(width, height, (int)StreamingKit.AVCode.CODEC_ID_H264, 100000);
            FFImp      ffimp = new FFImp(cf, true);
            //FFScale ffscale = new FFScale(width, height, 26, 12, width, height, 12, 12);
            FFScale ffscale = new FFScale(width, height, 0, 12, width, height, 3, 24);

            foreach (var item1 in ls)
            {
                var item    = ffscale.FormatS(item1);
                var in_buf  = FunctionEx.BytesToIntPtr(item);
                var out_buf = Marshal.AllocHGlobal(item.Length);
                //var bKeyFrame = false;
                //var nOutLen = 0;
                var nInLen = item.Length;
                //  var size = X264Encode(x264.obj, in_buf, ref nInLen, out_buf, ref nOutLen, ref bKeyFrame);
                // var buf = FunctionEx.IntPtrToBytes(out_buf, 0, size);
                var buf = x264.Encode(item);
                Console.WriteLine(buf.To16Strs(0, 16));
                var size = buf.Length;

                if (w == null)  //OK
                {
                    w = new BinaryWriter(new FileStream("4567.es", FileMode.Create));
                }
                w.Write(buf);

                var mf = new MediaFrame();
                mf.IsKeyFrame = (byte)(x264.IsKeyFrame() ? 1 : 0);
                mf.Width      = width;
                mf.Height     = height;
                mf.Encoder    = MediaFrame.H264Encoder;
                //mf.Timetick = 0;
                mf.Size = size;
                mf.SetData(buf);
                buf = mf.GetBytes();
                fs.Write(BitConverter.GetBytes(buf.Length), 0, 4);
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
                // IntPtr intt = IntPtr.Zero;
                //var sssss = ffimp.VideoDec(buf, ref intt);
                //Console.WriteLine(buf.Take(32).ToArray().To16Strs());
                // var size = Encode1(ii, in_buf, ref nInLen, out_buf);
            }

            fs.Close();
        }
コード例 #3
0
ファイル: VideoPlayer.cs プロジェクト: zz110/GB28181.Solution
        private void PlayBackward(Stack <MediaFrame> stack)
        {
            Stack <MediaFrame> yuvStack = new Stack <MediaFrame>();

            while (_queueRewindStack.Count > 3)
            {
                Thread.Sleep(10);
            }

            if (_PlayBackwardResetPos)
            {
                return;
            }

            while (stack != null && stack.Count > 0 && !_PlayBackwardResetPos)
            {
                var frame = _stackRewindFrame.Pop();
                if (!CheckInit(frame))
                {
                    continue;
                }
                var    bufferData = new byte[_yuvDataBuffer.Length];
                byte[] yuv        = _ffimp.VideoDec(frame.GetData(), bufferData);
                if (yuv != null)
                {
                    var mf = new MediaFrame()
                    {
                        NTimetick = frame.NTimetick,
                        Size      = yuv.Length,
                    };
                    mf.SetData(yuv);
                    yuvStack.Push(mf);
                }
            }
            if (!_PlayBackwardResetPos)
            {
                _queueRewindStack.Enqueue(yuvStack);
            }
        }
コード例 #4
0
ファイル: WinTool.cs プロジェクト: zlsyl/GB28181.Solution
        private void HandlES(List <PESPacket> videoPESList)
        {
            try
            {
                var stream = new MemoryStream();
                foreach (var item in videoPESList)
                {
                    stream.Write(item.PES_Packet_Data, 0, item.PES_Packet_Data.Length);
                }
                if (videoPESList.Count == 0)
                {
                    stream.Close();
                    return;
                }
                long tick   = videoPESList.FirstOrDefault().GetVideoTimetick();
                var  buffer = stream.GetBuffer();
                stream.Close();
                videoPESList.Clear();

                _analyzer.InputData(1, buffer, (uint)buffer.Length, 0, 0, (int)0, 0);
                var packet = _analyzer.GetMediaFramePacket();
                var frame  = new MediaFrame()
                {
                    IsAudio    = 0,
                    IsKeyFrame = packet.KeyFrame,
                    Height     = packet.Height,
                    Width      = packet.Width,
                    Channel    = 1
                };
                frame.SetData(packet.Buffer);
                playerWin.Play(frame);
            }
            catch (Exception ex)
            {
            }
        }
コード例 #5
0
        protected void CameraCapturer_CallBack(byte[] yuv)
        {
            if (!_isworking)
            {
                return;
            }
            try
            {
                Draw(yuv);

                if ((Environment.TickCount - _lastTick) < 1000 / _fps)
                {
                    return;
                }

                _lastTick = Environment.TickCount;

                var yv12 = _ffscale.Convert(yuv);

                if (_needForceIDRFrame)
                {
                    _needForceIDRFrame = false;
                    _x264.ForceIDRFrame();
                }

                var enc = _x264.Encode(yv12);



                var mf = new MediaFrame()
                {
                    Width             = _cfgVideo.Width,
                    Height            = _cfgVideo.Height,
                    Ex                = 1,
                    IsAudio           = 0,
                    Encoder           = MediaFrame.H264Encoder,
                    IsKeyFrame        = (byte)(_x264.IsKeyFrame() ? 1 : 0),
                    MediaFrameVersion = 0,
                    PPSLen            = 0,
                    SPSLen            = 0,
                    Size              = enc.Length,
                    NTimetick         = Environment.TickCount,
                };
                mf.SetData(enc);
                if (mf.IsKeyFrame == 1)
                {
                    var sps_pps = Media.MediaSteamConverter.GetSPS_PPS(enc);
                    mf.SPSLen = sps_pps[0].Length;
                    mf.PPSLen = sps_pps[1].Length;
                }
                mf.MediaFrameVersion = mf.IsKeyFrame;



                if (_needClearVideoTransportBuffer)
                {
                    _needClearVideoTransportBuffer = false;
                    var frame = CreateClearVideoTransportBufferMediaFrame(mf);
                    if (_callBack != null)
                    {
                        _callBack(frame);
                    }
                }

                if (_isFirstKeyFrame)
                {
                    if (mf.IsKeyFrame == 1)
                    {
                        mf.Ex = 0;
                    }
                    _isFirstKeyFrame = false;
                    var frame = CreateResetCodecMediaFrame(mf);
                    if (_callBack != null)
                    {
                        _callBack(frame);
                    }
                }

                if (_callBack != null)
                {
                    _callBack(mf);
                }
            }
            catch (Exception e)
            {
                if (_isworking)
                {
                    throw;
                }
            }
        }
コード例 #6
0
ファイル: PSAnalyze.cs プロジェクト: zz110/GB28181.Solution
        private MediaFrame CreateVideoMediaFrame(byte[] data, long tick)
        {
            int keyFrameFlagOffset = 0;

            if (data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 1 && data[4] == 0x09)
            {
                keyFrameFlagOffset = 6;
            }
            if (data[keyFrameFlagOffset + 4] == 0x67 || data[keyFrameFlagOffset + 4] == 0x68 | data[keyFrameFlagOffset + 4] == 0x27)
            {//sps ,这里sps及pps及载荷会被放置到不同的pes包里
                try
                {
                    #region
                    if (this.SPS == null || this.PPS == null)
                    {
                        var tdata = data;
                        if (keyFrameFlagOffset > 0)
                        {
                            tdata = new byte[data.Length - keyFrameFlagOffset];
                            Array.Copy(data, keyFrameFlagOffset, tdata, 0, tdata.Length);
                        }
                        var sps_pps = SliceHeader.GetSPS_PPS(tdata);
                        var sps     = mp4parser.h264.model.SeqParameterSet.Read(new MemoryStream(sps_pps[0], 1, sps_pps[0].Length - 1));
                        var pps     = mp4parser.h264.model.PictureParameterSet.read(new MemoryStream(sps_pps[1], 1, sps_pps[1].Length - 1));
                        Width    = (sps.pic_width_in_mbs_minus1 + 1) * 16 - 2 * sps.frame_crop_left_offset - 2 * sps.frame_crop_right_offset;
                        Height   = (sps.pic_height_in_map_units_minus1 + 1) * 16 - 2 * sps.frame_crop_top_offset - 2 * sps.frame_crop_bottom_offset;
                        this.SPS = sps_pps[0];
                        this.PPS = sps_pps[1];
                    }
                    #endregion
                }
                catch
                {
                    if (this.SPS == null && data[keyFrameFlagOffset + 4] == 0x67)
                    {
                        SPS = data.Skip(4).ToArray();
                    }
                    if (this.PPS == null && data[keyFrameFlagOffset + 4] == 0x68)
                    {
                        PPS = data.Skip(4).ToArray();
                    }
                    if (this.SPS != null && this.PPS != null)
                    {
                        var sps = mp4parser.h264.model.SeqParameterSet.Read(new MemoryStream(this.SPS, 1, this.SPS.Length - 1));
                        // var pps = mp4parser.h264.model.PictureParameterSet.read(new MemoryStream(this.PPS, 1, this.PPS.Length - 1));
                        Width  = (sps.pic_width_in_mbs_minus1 + 1) * 16 - 2 * sps.frame_crop_left_offset - 2 * sps.frame_crop_right_offset;
                        Height = (sps.pic_height_in_map_units_minus1 + 1) * 16 - 2 * sps.frame_crop_top_offset - 2 * sps.frame_crop_bottom_offset;
                    }
                    return(null);
                }
                if (data[keyFrameFlagOffset + 4] == 0x67 && this.SPS != null && data.Length == this.SPS.Length + 4)
                {
                    return(null);
                }
                if (data[keyFrameFlagOffset + 4] == 0x68 && this.PPS != null && data.Length == this.PPS.Length + 4)
                {
                    return(null);
                }
            }
            if (this.SPS != null && this.PPS != null)
            {
                if (data[keyFrameFlagOffset + 4] == 0x65)
                {
                    var h264 = new MemoryStream();
                    h264.Write(new byte[] { 0, 0, 0, 1 }, 0, 4);
                    h264.Write(this.SPS, 0, this.SPS.Length);
                    h264.Write(new byte[] { 0, 0, 0, 1 }, 0, 4);
                    h264.Write(this.PPS, 0, this.PPS.Length);
                    // h264.Write(new byte[] { 0, 0, 0, 1 }, 0, 4);
                    h264.Write(data, 0, data.Length);

                    var mf = new MediaFrame()
                    {
                        IsAudio    = 0,
                        IsKeyFrame = 1,
                        Size       = (int)h264.Length,
                        Width      = Width,
                        Height     = Height,
                        SPSLen     = SPS.Length,
                        PPSLen     = PPS.Length,
                        NTimetick  = tick,
                        Offset     = 0,
                        Encoder    = MediaFrame.H264Encoder,
                        Ex         = 1,
                    };
                    mf.SetData(h264.ToArray());
                    mf.MediaFrameVersion = (byte)(mf.IsKeyFrame == 1 ? 1 : 0);
                    VideoFrameCount++;
                    return(mf);
                }
                else
                {
                    if (this.SPS != null)
                    {
                        var mf = new MediaFrame()
                        {
                            IsAudio    = 0,
                            IsKeyFrame = 0,
                            Size       = data.Length,
                            Width      = Width,
                            Height     = Height,
                            SPSLen     = (short)this.SPS.Length,
                            PPSLen     = (short)this.PPS.Length,
                            NTimetick  = tick,
                            Offset     = 0,
                            Encoder    = MediaFrame.H264Encoder,
                            Ex         = 1,
                        };
                        mf.SetData(data);
                        mf.MediaFrameVersion = (byte)(mf.IsKeyFrame == 1 ? 1 : 0);
                        VideoFrameCount++;
                        return(mf);
                    }
                }
            }
            return(null);
        }
コード例 #7
0
 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()
                 {
                     IsAudio           = 0,
                     IsKeyFrame        = 0,
                     Size              = entity.Length,
                     Height            = entity.Height,
                     Width             = entity.Width,
                     SPSLen            = (short)streamInfo.Video_SPS.Length,
                     PPSLen            = (short)streamInfo.Video_PPS.Length,
                     NTimetick         = ThreadEx.TickCount,
                     Offset            = 0,
                     Encoder           = MediaFrame.H264Encoder,
                     Ex                = 1,
                     MediaFrameVersion = 0x00,
                 };
                 mf.SetData(entity.Buffer);
             }
             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()
                 {
                     IsAudio    = 0,
                     IsKeyFrame = 1,
                     Size       = entity.Length,
                     Height     = entity.Height,
                     Width      = entity.Width,
                     SPSLen     = 0,
                     PPSLen     = 0,
                     NTimetick  = ThreadEx.TickCount,
                     Offset     = 0,
                     Encoder    = MediaFrame.H264Encoder,
                     Ex         = (byte)(needResetCodec ? 0 : 1),
                     //nEx=(byte)entity.Ex,
                     MediaFrameVersion = 0x01,
                 };
                 mf.SetData(entity.Buffer);
                 return(mf);
             }
             else
             {
                 var mf = new MediaFrame()
                 {
                     IsAudio    = 0,
                     IsKeyFrame = 1,
                     Size       = entity.Length,
                     Height     = entity.Height,
                     Width      = entity.Width,
                     SPSLen     = (short)streamInfo.Video_SPS.Length,
                     PPSLen     = (short)streamInfo.Video_PPS.Length,
                     NTimetick  = ThreadEx.TickCount,
                     Offset     = 0,
                     Encoder    = MediaFrame.H264Encoder,
                     Ex         = (byte)(needResetCodec ? 0 : 1),
                     //nEx=(byte)entity.Ex,
                     MediaFrameVersion = 0x01,
                 };
                 mf.SetData(entity.Buffer);
                 return(mf);
             }
         }
         else
         {
             throw new Exception("帧类型错误");
         }
     }
     else if (entity.MediaType == MediaType.AudioES)
     {
         if (streamInfo == null)
         {
             streamInfo = new StreamInfo();
         }
         try
         {
             var mf = new MediaFrame()
             {
                 IsAudio           = 1,
                 IsKeyFrame        = 1,
                 Size              = entity.Length,
                 Channel           = 1,
                 Frequency         = 32000,
                 AudioFormat       = 2,
                 NTimetick         = ThreadEx.TickCount,
                 Offset            = 0,
                 Encoder           = MediaFrame.AAC_Encoder,
                 Ex                = 1,
                 MediaFrameVersion = 0x01,
             };
             mf.SetData(entity.Buffer);
             //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("流类型错误");
     }
 }
コード例 #8
0
            private MediaFrame CreateVideoMediaFrame(byte[] data, long tick)
            {
                int keyFrameFlagOffset = 0;

                if (data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == 1 && data[4] == 0x09)
                {
                    var tmp = new byte[data.Length - 6];
                    Array.Copy(data, 6, tmp, 0, tmp.Length - 6);
                    data = tmp;
                    keyFrameFlagOffset = 0;
                }

                if (data[keyFrameFlagOffset + 4] == 0x67 || data[keyFrameFlagOffset + 4] == 0x27)
                {
                    if (this.SPS == null)
                    {
                        var tdata = data;
                        if (keyFrameFlagOffset > 0)
                        {
                            tdata = new byte[data.Length - keyFrameFlagOffset];
                            Array.Copy(data, keyFrameFlagOffset, tdata, 0, tdata.Length);
                        }
                        var sps_pps = SliceHeader.GetSPS_PPS(tdata);
                        var sps     = mp4parser.h264.model.SeqParameterSet.Read(new MemoryStream(sps_pps[0], 1, sps_pps[0].Length - 1));
                        var pps     = mp4parser.h264.model.PictureParameterSet.read(new MemoryStream(sps_pps[1], 1, sps_pps[1].Length - 1));
                        Width    = (sps.pic_width_in_mbs_minus1 + 1) * 16 - 2 * sps.frame_crop_left_offset - 2 * sps.frame_crop_right_offset;
                        Height   = (sps.pic_height_in_map_units_minus1 + 1) * 16 - 2 * sps.frame_crop_top_offset - 2 * sps.frame_crop_bottom_offset;
                        this.SPS = sps_pps[0];
                        this.PPS = sps_pps[1];
                    }
                    var mf = new MediaFrame()
                    {
                        IsAudio    = 0,
                        IsKeyFrame = 1,
                        Size       = data.Length,
                        Width      = Width,
                        Height     = Height,
                        SPSLen     = SPS.Length,
                        PPSLen     = PPS.Length,
                        NTimetick  = tick,
                        Offset     = 0,
                        Encoder    = MediaFrame.H264Encoder,
                        Ex         = 1,
                    };
                    mf.SetData(data);
                    mf.MediaFrameVersion = (byte)(mf.IsKeyFrame == 1 ? 1 : 0);
                    VideoFrameCount++;
                    return(mf);
                }
                else
                {
                    if (this.SPS != null)
                    {
                        var mf = new MediaFrame()
                        {
                            IsAudio    = 0,
                            IsKeyFrame = 0,
                            Size       = data.Length,
                            Width      = Width,
                            Height     = Height,
                            SPSLen     = SPS.Length,
                            PPSLen     = PPS.Length,
                            NTimetick  = tick,
                            Offset     = 0,
                            Encoder    = MediaFrame.H264Encoder,
                            Ex         = 1,
                        };
                        mf.SetData(data);
                        mf.MediaFrameVersion = (byte)(mf.IsKeyFrame == 1 ? 1 : 0);
                        VideoFrameCount++;
                        return(mf);
                    }
                }
                return(null);
            }