/// <summary> /// 初始化视频捕捉器 /// </summary> private void iniVideoCapturer() { canvasBitmap = new Bitmap(VideoSize.Width, VideoSize.Height); using (Graphics g = Graphics.FromImage(canvasBitmap)) g.FillRectangle(Brushes.Bisque, 0, 0, canvasBitmap.Width, canvasBitmap.Height); gfx = cLocal.CreateGraphics(); gfx.DrawImage(canvasBitmap, 0, 0, canvasBitmap.Width, canvasBitmap.Height); cam = new CamCapture(); var deviceList = cam.GetDeviceList(); //获得驱动列表 selectedDeviceMetrics = cam.SelectDevice(deviceList[0]); //获得尺寸大小 cam.SelectMetrics(selectedDeviceMetrics[0]); bool res = cam.Start(); //开始捕捉视频 if (res == false) { //IMLibrary3.Global.MsgShow("没有可用的摄像头。"); } metrics = cam.Metrics;//获得尺寸 encoder = new StreamCoders.Encoder.H264Encoder(); encoder.Framerate = 11; encoder.SetInputResolution((uint)VideoSize.Width, (uint)VideoSize.Height); encoder.IFrameFrequency = 40; encoder.Bitrate = 128000; encoder.PayloadType = 103; res = encoder.Init(); if (res == false) { //IMLibrary3.Global.MsgShow("无法初始化视频编码器。"); return; } byte[] zeroBuffer = new byte[VideoSize.Width * VideoSize.Height * 3]; byte[] initData = encoder.EncodeToArray(zeroBuffer); decoder = new StreamCoders.Decoder.H264Decoder(); decoder.SetInputResolution((uint)VideoSize.Width, (uint)VideoSize.Height); decoder.SetInputFrameRate(11); res = ((StreamCoders.Decoder.H264Decoder)decoder).Init(initData); if (res == false) { //IMLibrary3.Global.MsgShow("无法初始化视频解码器。"); return; } timer1.Interval = (int)(1000.0 / 25); timer1.Start(); }
private void timer1_Tick(object sender, EventArgs e) { if (cam != null) { byte[] buffer = cam.GetFrame(); if (buffer == null) { return; } Bitmap pBmp = StreamCoders.Tools.Visuals.ByteArrayToBitmap_RGB24((uint)metrics.Width, (uint)metrics.Height, buffer); //Console.WriteLine("metrics.Width:" + metrics.Width.ToString()+ "metrics.Height:" + metrics.Height.ToString()); pBmp.RotateFlip(RotateFlipType.Rotate180FlipX); using (Graphics g = Graphics.FromImage(canvasBitmap)) { g.DrawImage(pBmp, 0, 0, canvasBitmap.Width, canvasBitmap.Height); //g.DrawImage(pBmp, 0, 0, cLocal.Width,cLocal.Height); gfx.DrawImage(canvasBitmap, new Point(0, 0)); } } Bitmap t1 = new Bitmap(canvasBitmap, new Size(VideoSize.Width, VideoSize.Height)); Bitmap temp = t1.Clone(new RectangleF(0, 0, VideoSize.Width, VideoSize.Height), PixelFormat.Format24bppRgb); Rectangle dimension = new Rectangle(0, 0, temp.Width, temp.Height); BitmapData picData = temp.LockBits(dimension, ImageLockMode.ReadWrite, temp.PixelFormat); PixelFormat format = temp.PixelFormat; IntPtr pixelStartAddress = picData.Scan0; Byte[] rawData = new Byte[picData.Stride * VideoSize.Height]; System.Runtime.InteropServices.Marshal.Copy(pixelStartAddress, rawData, 0, rawData.Length); temp.UnlockBits(picData); Byte[] asmFrame = encoder.EncodeToArray(rawData); if (asmFrame != null) { frameTransmit.sendData(IMLibrary3.Protocol.TransmitType.Video, asmFrame);//将视频数据编码后发送给对方 } }
/// <summary> /// 初始化视频捕捉器 /// </summary> private void iniVideoCapturer() { canvasBitmap = new Bitmap(VideoSize.Width, VideoSize.Height); using (Graphics g = Graphics.FromImage(canvasBitmap)) g.FillRectangle(Brushes.Bisque, 0, 0, canvasBitmap.Width, canvasBitmap.Height); gfx = cLocal.CreateGraphics(); gfx.DrawImage(canvasBitmap, 0, 0, canvasBitmap.Width, canvasBitmap.Height); cam = new CamCapture(); var deviceList = cam.GetDeviceList();//获得驱动列表 selectedDeviceMetrics = cam.SelectDevice(deviceList[0]);//获得尺寸大小 cam.SelectMetrics(selectedDeviceMetrics[0]); bool res = cam.Start();//开始捕捉视频 if (res == false) { //IMLibrary3.Global.MsgShow("没有可用的摄像头。"); } metrics = cam.Metrics;//获得尺寸 encoder = new StreamCoders.Encoder.H264Encoder(); encoder.Framerate = 11; encoder.SetInputResolution((uint)VideoSize.Width, (uint)VideoSize.Height); encoder.IFrameFrequency = 40; encoder.Bitrate = 128000; encoder.PayloadType = 103; res = encoder.Init(); if (res == false) { //IMLibrary3.Global.MsgShow("无法初始化视频编码器。"); return; } byte[] zeroBuffer = new byte[VideoSize.Width * VideoSize.Height * 3]; byte[] initData = encoder.EncodeToArray(zeroBuffer); decoder = new StreamCoders.Decoder.H264Decoder(); decoder.SetInputResolution((uint)VideoSize.Width, (uint)VideoSize.Height); decoder.SetInputFrameRate(11); res = ((StreamCoders.Decoder.H264Decoder)decoder).Init(initData); if (res == false) { //IMLibrary3.Global.MsgShow("无法初始化视频解码器。"); return; } timer1.Interval = (int)(1000.0 / 25); timer1.Start(); }