录制视频时获取图像帧

时间:2013-12-13 13:33:39

标签: c# windows-phone-7 windows-phone-8 windows-phone-8-sdk

我正在创建一个应用程序,可在录制视频时对照片进行采样。

是否有任何我可以订阅的活动,每x次获得一个帧?

在android中有一个方法OnPreviewCallback(或类似的东西)

2 个答案:

答案 0 :(得分:4)

您必须使用PhotoCamera类

PhotoCamera类包含一个方法GetPreviewBufferArgb32,用于将预览帧转换为字节数组,以便进行更深入的操作。

所以,对于每秒5帧,你需要制作一个计时器,并且在计时器上打勾,你必须调用该方法。

参考这些链接,这些可以帮到你很多

http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202956(v=vs.105).aspx

http://msdn.microsoft.com/en-us/magazine/hh708750.aspx

http://msdn.microsoft.com/en-US/library/windowsphone/develop/microsoft.devices.photocamera(v=vs.105).aspx

答案 1 :(得分:0)

我将以下代码用于我的一个项目(QrCode扫描)


    private static readonly ManualResetEvent _pauseFramesEvent = new ManualResetEvent(true);
        private PhotoCamera _cam; 
   private Thread _yFramesThread;
private Dictionary<object, object> _hintDictionary;

 protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            this._cam = new PhotoCamera();
            this._cam.Initialized += _cam_Initialized;
                this._pumpYFrames = true;
                this._isScanning = true;
            }


            CreateStandByTimer();
            this._yFramesThread = new Thread((PumpYFrames));
            this._yFramesThread.Start();
            base.OnNavigatedTo(e);

        }

    private void PumpYFrames()
            {
                var array = new byte[307200];
                while (_pumpYFrames)
                {
                    _pauseFramesEvent.WaitOne();
                    if (this._isScanning)
                    {
                        bool flag;
                        try
                        {
                            this._cam.GetPreviewBufferY(array);
                            flag = true;
                        }
                        catch
                        {
                            flag = false;
                        }
                        if (flag)
                        {
                            var source = new RGBLuminanceSource(array, 640, 480, false);
                            var binarizer = new HybridBinarizer(source);
                            var image = new BinaryBitmap(binarizer);
                            Reader reader = new QRCodeReader();
                            try
                            {
                                var results = reader.decode(image, _hintDictionary);
                                ProcessScan(results);

                            }
                            catch (Exception ex)
                            {//catch logic

                            }
                        }
                    }
                }
            }