Exemplo n.º 1
0
        public static MediaFrameEntity MediaFrame2MediaSteamEntity(MediaFrame frame)
        {
            var result = new MediaFrameEntity()
            {
                Buffer     = frame.GetData(),
                Length     = (ushort)frame.Size,
                EncodTime  = frame.NTimetick,
                MediaType  = frame.IsAudio == 1 ? MediaType.AudioES : MediaType.VideoES,
                SampleRate = 32000,
                FrameRate  = 25,
                Width      = (ushort)frame.Width,
                Height     = (ushort)frame.Height,
                KeyFrame   = (byte)(frame.IsAudio == 0 && frame.IsKeyFrame == 1 ? 1 : 0),
            };

            if (frame.IsAudio == 1 && frame.IsKeyFrame == 1)
            {
                result.SampleRate = (ushort)frame.Frequency;
            }
            if (frame.IsCommandMediaFrame())
            {
                result.Buffer = new byte[0];
                result.Length = 0;
            }
            return(result);
        }
Exemplo n.º 2
0
        //System.IO.BinaryWriter bw = new BinaryWriter(new System.IO.FileStream(@"D:\\aac.aac", FileMode.Create));
        protected virtual void _Play(MediaFrame frame)
        {
            if (_isDisoseing || _isDisosed)
            {
                return;
            }

            if (!_inited && frame.IsKeyFrame == 1)
            {
                Init(frame);
            }
            if (!_inited)
            {
                return;
            }
            if (frame.IsCommandMediaFrame() && frame.GetCommandType() == MediaFrameCommandType.ResetCodec)
            {
                //在这里重置解码器,这里因为音频格式一般不会发生变化,所以暂时没有做处理
                return;
            }

            //string b = DateTime.Now.TimeOfDay + " begin  end:";


            byte[] buf = null;
            if (_aac != null)
            {
                buf = DecMultiAAC(frame.GetData());
            }
            if (_speex != null)
            {
                buf = DecSPEX(frame.GetData());
            }
            if (buf != null && buf.Length > 0)
            {
                _Play(buf);
            }
            else
            {
            }

            //Console.WriteLine(b + DateTime.Now.TimeOfDay + " : " + frame.Data.Length + " aac:" + buf.Length);
        }
Exemplo n.º 3
0
        private void PlayForward(MediaFrame frame)
        {
            if (frame != null)
            {
                if (frame.NTimetick < _curPlayMediaTimetick)
                {
                    _isHasBFrame = true;
                }
                if (_curPlayMediaTimetick < frame.NTimetick)
                {
                    _curPlayMediaTimetick = frame.NTimetick;
                }
            }
            if (frame != null)
            {
                if (!_isHasBFrame)
                {
                    if (Speed == 1)
                    {
                        long a = frame.NTimetick - ccc;

                        if (a < 150)
                        {
                            coutnnn += a - (int)bb;
                            i++;
                            if (i == 20)
                            {
                                b       = (int)coutnnn / 20;
                                i       = 0;
                                coutnnn = 0;
                            }
                        }
                        if (max == 0)
                        {
                            max = b;
                        }
                        if (min == 0)
                        {
                            min = b;
                        }
                        int sleep = (int)b;

                        if (sleep > max)
                        {
                            max = sleep;
                        }
                        if (sleep < min)
                        {
                            min = sleep;
                        }
                        if (_queue.Count < 4)
                        {
                            //int mid = (max + min) / 2;
                            //sleep += 1;
                            //b += 1;
                            if (min != 0 && max != 0 && min != max)
                            {
                                sleep = (min + max) / 2 + (min + max) % 2;
                                b     = sleep;
                                min   = 0;
                                max   = 0;
                            }
                            else
                            {
                                sleep += 1;
                                b     += 1;
                            }
                            //max = mid;
                            //min = mid;
                        }
                        if (_queue.Count > 6)
                        {
                            if (min != 0 && max != 0 && min != max)
                            {
                                sleep = (min + max) / 2;
                                b     = sleep;
                                min   = 0;
                                max   = 0;
                            }
                            else
                            {
                                sleep -= 1;
                                b--;
                            }
                        }
                        if (sleep <= 0)
                        {
                            sleep = 10;
                        }
                        //var sleep = (int)(_syncPlayTime);
                        //if (sleep > 200)
                        //    sleep = 40;
                        //if (sleep < 0)
                        //    sleep = 10;
                        //  Console.WriteLine("tick:" +a+ " cachecount:" + _queue.Count);

                        ccc = frame.NTimetick;

                        // Console.WriteLine("tick:" + sleep + " cachecount:" + _queue.Count);
                        Thread.Sleep(sleep);
                    }
                    else
                    {
                        var sysSpan = Environment.TickCount - _lastPlaySystemTime;
                        var sleep   = (int)((frame.NTimetick - _lastPlayMediaTimetick - sysSpan) / Speed);
                        if (sleep > 200 || sleep < 0)
                        {
                            sleep = 40;
                        }
                        Thread.Sleep(sleep);
                        _lastPlayMediaTimetick = frame.NTimetick;
                    }
                }
                long dd = DateTime.Now.Ticks;
                if (!CheckInit(frame))
                {
                    return;
                }

                byte[] yuv = _ffimp.VideoDec(frame.GetData(), _yuvDataBuffer);

                //_drawHandle.BeginInvoke(frame.Data, null, null);
                DateTime db = DateTime.Now;
                Draw(yuv);
                bb = (DateTime.Now.Ticks - dd) / 10000;

                Console.WriteLine(DateTime.Now.TimeOfDay + "  Consume: " + (DateTime.Now - db).TotalMilliseconds);
            }
            else
            {
                ThreadEx.Sleep(10);
            }
        }