private void TryProcessFrame() { if (FrameQueue != null) { FramePacket packet = FrameQueue.Pop(); //Debug.Log((packet == null ? "no frame to consume." : "frame consumed.") + "framesCount : " + frameQueue.Count); if (packet != null) { ProcessFrameBuffer(packet); } } }
/// <summary> /// Internal helper that attempts to process frame data in the frame queue /// </summary> private void TryProcessFrame() { if (FrameQueue != null) { FramePacket packet = FrameQueue.Pop(); if (packet != null) { ProcessFrameBuffer(packet); FrameQueue.Pool(packet); } } }
public unsafe int RunVideo(int gap_h, int gap_w, int width, int height, SDLHelper sdlVideo) //这个是用来渲染整个大画面的 { int frame_count = 0; Produce_data p = new Produce_data(); fq = new FrameQueue(); p.gap_h = gap_h; p.gap_w = gap_w; p.target_height = height; p.target_width = width; IsRun = true; exit_thread = false; pause_thread = false; threadVideo = Thread.CurrentThread; SDL.SDL_Event even = new SDL.SDL_Event(); Thread refresh = new Thread(() => sfp_refresh_thread()); Thread produce = new Thread(() => ProduceFrame(ref p)); refresh.Start(); produce.Start(); System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); try { for (; ;) { //Wait SDL.SDL_WaitEvent(out even); if (even.type == SFM_REFRESH_EVENT) { FrameBuffer fb; // 退出线程 if (exit_thread) { break; } // 暂停解析 if (pause_thread) { while (pause_thread) { Thread.Sleep(1); } } while (true) { GetFrame(out fb); if (fb == null) { Thread.Sleep(1); } else { fq.Pop(); break; } // Console.WriteLine("尚味获取到帧"); } frame_count++; //SDL播放YUV数据 //var data = fb.outbuffer; int out_buffer_size = fb.outbuffersize; AVFrame pFrameYUV = fb.av; sdlVideo.SDL_Display(width * gap_w, height * gap_h, (IntPtr)(pFrameYUV.data[0]), out_buffer_size, pFrameYUV.linesize[0]); // Console.WriteLine("渲染第" + frame_count.ToString() + "帧"); if (frame_count == 1) { stopwatch.Start(); } if (frame_count == 1000) { stopwatch.Stop(); TimeSpan timespan = stopwatch.Elapsed; Console.WriteLine(timespan.TotalSeconds.ToString()); Thread.Sleep(100000); } } else if (even.type == SDL.SDL_EventType.SDL_KEYDOWN) { //Pause if (even.key.keysym.sym == SDL.SDL_Keycode.SDLK_SPACE) { thread_pause = 1 - thread_pause; } } else if (even.type == SDL.SDL_EventType.SDL_QUIT) { thread_exit = 1; } else if (even.type == SFM_BREAK_EVENT) { break; } } } catch (Exception ex) { Console.WriteLine(ex); } finally { } IsRun = false; return(0); }