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); }
//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); }
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); } }