private void DoThreadWork() { //int videoFailCount = 0; //int audioFailCount = 0; while (true) { if (!threadWorking) { return; } IAVFrame packet = null; if (queue.Dequeue(out packet) == false) { return; } if (packet.Decode()) { PushToNext(packet); } packet.Close(); } }
private void DoThreadWork() { while (true) { if (!threadWorking) { return; } IAVFrame frame = stream.GetNext(); PushToNext(frame); } }
public bool OnReceiveData(object obj) { IAVFrame packet = (IAVFrame)obj; if (packet == null) { return(false); } IPipe pipe = null; lock (router) { if (router.ContainsKey(packet.FrameType)) { pipe = router[packet.FrameType]; } } if (pipe == null) { List <IPipe> list = null; lock (nextComponents) { list = new List <IPipe>(nextComponents); } foreach (IPipe p in list) { AvDecoder decoder = p as AvDecoder; if (decoder == null) { continue; } lock (router) { router.Add(decoder.FrameType, p); } if (decoder.FrameType == packet.FrameType) { pipe = p; } } } if (pipe == null) { return(false); } RecordLog(); pipe.OnReceiveData(obj); return(true); }
protected void Click_Handler(object sender, EventArgs e) { Gtk.FileChooserDialog dialog = new FileChooserDialog("Choose a file", this, FileChooserAction.Open, new object[] { Gtk.Stock.Open, Gtk.ResponseType.Ok }); dialog.Run(); string file = dialog.Filename; dialog.Destroy(); //writer.Seek(44, SeekOrigin.Begin); workingThread = new Thread(new ThreadStart(() => { var stream = FFMpegBase.Instance.GetAVStream(file); IAVFrame frame = null; while (((frame = stream.GetNext()) != null) && (!closing)) { if (frame.FrameType == AVFrameType.Video) { SharpFFmpeg.VideoFrame video = (SharpFFmpeg.VideoFrame)frame; if (frame.Decode()) { var data = video.ImgData; DrawImage(data); } } else if (frame.FrameType == AVFrameType.Audio) { SharpFFmpeg.AudioFrame audio = (SharpFFmpeg.AudioFrame)frame; if (audio.Decode()) { var data = audio.WaveDate; audioPlayer.PutSample(data); } } frame.Close(); } audioPlayer.Stop(); stream.Close(); })); workingThread.Start(); }
public IAVFrame GetNext() { IAVFrame frame = null; IntPtr pPacket = Marshal.AllocHGlobal(Marshal.SizeOf(new AV.AVPacket())); if (AV.av_read_frame(rawFormatCtx, pPacket) != 0) { Marshal.FreeHGlobal(pPacket); pPacket = IntPtr.Zero; return(null); } AV.AVPacket packet = new NativeGetter <AV.AVPacket>(pPacket).Get(); if (!decoderTable.ContainsKey(packet.stream_index) || !mediaTypeTable.ContainsKey(packet.stream_index)) { Marshal.FreeHGlobal(pPacket); pPacket = IntPtr.Zero; return(null); } var codec = decoderTable[packet.stream_index]; var type = mediaTypeTable[packet.stream_index]; switch (type) { case AV.AVMediaType.AVMEDIA_TYPE_AUDIO: frame = new AudioFrame(pPacket, codec); return(frame); case AV.AVMediaType.AVMEDIA_TYPE_VIDEO: frame = new VideoFrame(pPacket, codec); return(frame); default: throw new Exception("Not support media type " + type.ToString()); } return(null); }
//private void WriteWaveHeader(BinaryWriter writer, WaveDataType format) //{ // WAVE_Header wav_Header = new WAVE_Header(); // wav_Header.RIFF_ID[0] = 'R'; // wav_Header.RIFF_ID[1] = 'I'; // wav_Header.RIFF_ID[2] = 'F'; // wav_Header.RIFF_ID[3] = 'F'; // wav_Header.File_Size = waveDataSize + 36; // wav_Header.RIFF_Type[0] = 'W'; // wav_Header.RIFF_Type[1] = 'A'; // wav_Header.RIFF_Type[2] = 'V'; // wav_Header.RIFF_Type[3] = 'E'; // wav_Header.FMT_ID[0] = 'f'; // wav_Header.FMT_ID[1] = 'm'; // wav_Header.FMT_ID[2] = 't'; // wav_Header.FMT_ID[3] = ' '; // wav_Header.FMT_Size = 16; // wav_Header.FMT_Tag = 0x0001; // wav_Header.FMT_Channel = (ushort)format.channel; // wav_Header.FMT_SamplesPerSec = format.sample_rate; // var nBlockAlign = (short)(format.channel * (format.bit_per_sample / 8)); // var nAvgBytesPerSec = format.sample_rate * nBlockAlign; // wav_Header.AvgBytesPerSec = nAvgBytesPerSec; // wav_Header.BlockAlign = (ushort)nBlockAlign; // wav_Header.BitsPerSample = (ushort)format.bit_per_sample; // wav_Header.DATA_ID[0] = 'd'; // wav_Header.DATA_ID[1] = 'a'; // wav_Header.DATA_ID[2] = 't'; // wav_Header.DATA_ID[3] = 'a'; // wav_Header.DATA_Size = waveDataSize; // int waveHdrSize = Marshal.SizeOf(wav_Header); // var ptr = Marshal.AllocHGlobal(waveHdrSize); // byte[] data = new byte[waveHdrSize]; // Marshal.StructureToPtr(wav_Header, ptr, false); // Marshal.Copy(ptr, data, 0, waveHdrSize); // writer.Seek(0, SeekOrigin.Begin); // writer.Write(data); // writer.Flush(); // Marshal.FreeHGlobal(ptr); //} private void button1_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.ShowDialog(); string file = dialog.FileName; //writer.Seek(44, SeekOrigin.Begin); WaveDataType first = null; workingThread = new Thread(new ThreadStart(() => { var stream = FFMpegBase.Instance.GetAVStream(file); IAVFrame frame = null; while (((frame = stream.GetNext()) != null) && (!closing)) { if (frame.FrameType == AVFrameType.Video) { SharpFFmpeg.VideoFrame video = (SharpFFmpeg.VideoFrame)frame; if (frame.Decode()) { var data = video.ImgData; DrawImage(data); } } else if (frame.FrameType == AVFrameType.Audio) { SharpFFmpeg.AudioFrame audio = (SharpFFmpeg.AudioFrame)frame; if (audio.Decode()) { var data = audio.WaveDate; audioPlayer.PutSample(data); } } frame.Close(); } stream.Close(); audioPlayer.Stop(); })); workingThread.Start(); }