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