为什么在iOS上使用Xamarin Forms进行实时摄像机捕获控制会冻结?

斯滕·彼得罗夫(Sten Petrov)

从GitHub下载了Xamarin Moments的源代码,现在我正尝试将CameraPage渲染器Page转换为ContentView

然后,我重构了代码以使其成为ContentView渲染器。实时预览和图像捕获的大多数实际设置来自Moments应用,并在需要/首选的地方进行了一些重构。

实时预览出现了,但是当我按下按钮拍照时,应用程序毫无例外地冻结,即使在Xcode的控制台视图中也是如此。

//this is how it's called: 
btnTakePicture.Clicked += (s,e)=> { GetCameraImage().Wait(); };

// this method freezes
public async Task<byte[]> GetCameraImage()
{
    byte[] imageBuffer = null;

    if (captureDeviceInput != null)
    { 
        var videoConnection = stillImageOutput.ConnectionFromMediaType(AVMediaType.Video);
        Console.WriteLine("[HASFIQWRPPOA] This message shows up");

// this is where the app freezes, even though the live preview still moves.
        var sampleBuffer = await stillImageOutput.CaptureStillImageTaskAsync(videoConnection);
        Console.WriteLine("[CLKJFADSFQXW] THIS DOESN'T SHOW UP");

        // var jpegImageAsBytes = AVCaptureStillImageOutput.JpegStillToNSData (sampleBuffer).ToArray ();
        var jpegImageAsNsData = AVCaptureStillImageOutput.JpegStillToNSData(sampleBuffer);
        Console.WriteLine("[ROIAJDGNQWTG]");
        // var image = new UIImage (jpegImageAsNsData);
        // var image2 = new UIImage (image.CGImage, image.CurrentScale, UIImageOrientation.UpMirrored);
        // var data = image2.AsJPEG ().ToArray ();
        imageBuffer = jpegImageAsNsData.ToArray();
        Console.WriteLine("[FIOUJGAIDGUQ] Image buffer: "+imageBuffer.Length);
    } 

    if (imageBuffer != null && imageBuffer.Length > 100)
    {
        using (var ms = new MemoryStream(imageBuffer))
        {
            var uiimg = UIImage.LoadFromData(NSData.FromStream(ms)); 
            this.Add(new UIImageView(uiimg)); 
        }
    }

    return imageBuffer;
}

这是我设置实时预览的方式

// This method runs fine and the camera preview is started as expected
    public void SetupLiveCameraStream()
    {
        try
        {   
// add a UIView to the renderer
            liveCameraStream = new UIView()
            { 
                Frame = new CGRect(0f, 0f, Element.Width, Element.Height),  
            };   

            this.Add(liveCameraStream);  
// find a camera
            var captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);

            if (captureDevice != null)
            { 
                Console.WriteLine("[ZKSDJGWEHSY] Capture device found"); // not the case on simulator

                captureSession = new AVCaptureSession(); 

                videoPreviewLayer = new AVCaptureVideoPreviewLayer(captureSession)
                {
                    Frame = liveCameraStream.Bounds
                };

                liveCameraStream.Layer.AddSublayer(videoPreviewLayer);

                ConfigureCameraForDevice(captureDevice);

                captureDeviceInput = AVCaptureDeviceInput.FromDevice(captureDevice);

                var dictionary = new NSMutableDictionary();
                dictionary[AVVideo.CodecKey] = new NSNumber((int)AVVideoCodec.JPEG);
                stillImageOutput = new AVCaptureStillImageOutput()
                {
                    OutputSettings = new NSDictionary()
                };

                captureSession.AddInput(captureDeviceInput);
                captureSession.AddOutput(stillImageOutput);
                captureSession.StartRunning();
                Console.WriteLine("[OIGAJGUWRJHWY] Camera session started"); 
            }
            else
            {
                Console.WriteLine("[OASDFUJGOR] Could not find a camera device");
            } 
        }
        catch (Exception x)
        {
            Console.WriteLine("[QWKRIFQEAHJF] ERROR:" + x);
        }
    }
彭珊珊

我遇到了这个问题,由于使用async/ awaitwith的组合,事实证明我陷入僵局Task.Result猜测您可能会遇到与使用相似的情况Task.Wait()

代码的两部分:

btnTakePicture.Clicked += await (s,e) => { GetCameraImage().Wait(); };

和:

var sampleBuffer = await stillImageOutput.CaptureStillImageTaskAsync(videoConnection);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用MediaMuxer进行Muxing摄像机预览h264编码的基本流

来自分类Dev

使用一个特定的应用程序在视频捕获中打开摄像机的adb命令是什么?

来自分类Dev

threejs在使用变换控制时禁用轨道摄像机

来自分类Dev

使用OpenCV访问IP摄像机

来自分类Dev

如何使用OpenGLES 2.0在libgdx中的背景上实时渲染Android的YUV-NV21摄像机图像?

来自分类Dev

使用来自网络摄像头的HTML输入类型文件捕获便携式摄像机录制视频

来自分类Dev

使用Live555从连接到H264编码器的IP摄像机流式传输实时视频

来自分类Dev

QT,C ++:在QGraphicsview上从摄像机绘制实时图像流的快速方法

来自分类Dev

使用相同的控件控制多台摄像机

来自分类Dev

使用DirectShow预览时无法捕获摄像机源

来自分类Dev

无法使用Angular显示实时摄像机RTSP流

来自分类Dev

如何使用OpenCV对IP摄像机进行身份验证

来自分类Dev

如何在swiftui中使用实时摄像机流?

来自分类Dev

使用python使用IP摄像机捕获单个图像

来自分类Dev

Flask / Python-如何使用来自多个IP摄像机的实时镜头填充HTML页面?

来自分类Dev

为什么使用Xamarin Forms的iOS应用程序无法显示“真棒字体”?

来自分类Dev

为什么使用Xamarin.Forms在iOS上工具栏会重复而不隐藏?

来自分类Dev

使用Raspberry Pi和Android IP摄像机以及Python和OpenCV进行对象检测

来自分类Dev

为什么将我的游戏对象移动限制在摄像机框架内会阻止移动?

来自分类Dev

使用摄像机的闪光灯

来自分类Dev

如何使用OpenGLES 2.0在libgdx中的背景上实时渲染Android的YUV-NV21摄像机图像?

来自分类Dev

如果有多台摄像机,则使用RayCast在Sprite上捕获触摸

来自分类Dev

使用来自网络摄像头的HTML输入类型文件捕获便携式摄像机录制视频

来自分类Dev

在Arch Linux上使用Point Grey BlackFly GigE视觉摄像机进行远程访问

来自分类Dev

如何使用openCV在实时摄像机中检测运动对象

来自分类Dev

使用OpenCV进行摄像机校准:使用失真和旋转平移矩阵

来自分类Dev

使用移动摄像机照明场景

来自分类Dev

为什么 Xamarin Forms Webview 绑定不会在 iOS 上刷新?

来自分类Dev

使用 Tkinter python2 在标签中实时流摄像机

Related 相关文章

  1. 1

    使用MediaMuxer进行Muxing摄像机预览h264编码的基本流

  2. 2

    使用一个特定的应用程序在视频捕获中打开摄像机的adb命令是什么?

  3. 3

    threejs在使用变换控制时禁用轨道摄像机

  4. 4

    使用OpenCV访问IP摄像机

  5. 5

    如何使用OpenGLES 2.0在libgdx中的背景上实时渲染Android的YUV-NV21摄像机图像?

  6. 6

    使用来自网络摄像头的HTML输入类型文件捕获便携式摄像机录制视频

  7. 7

    使用Live555从连接到H264编码器的IP摄像机流式传输实时视频

  8. 8

    QT,C ++:在QGraphicsview上从摄像机绘制实时图像流的快速方法

  9. 9

    使用相同的控件控制多台摄像机

  10. 10

    使用DirectShow预览时无法捕获摄像机源

  11. 11

    无法使用Angular显示实时摄像机RTSP流

  12. 12

    如何使用OpenCV对IP摄像机进行身份验证

  13. 13

    如何在swiftui中使用实时摄像机流?

  14. 14

    使用python使用IP摄像机捕获单个图像

  15. 15

    Flask / Python-如何使用来自多个IP摄像机的实时镜头填充HTML页面?

  16. 16

    为什么使用Xamarin Forms的iOS应用程序无法显示“真棒字体”?

  17. 17

    为什么使用Xamarin.Forms在iOS上工具栏会重复而不隐藏?

  18. 18

    使用Raspberry Pi和Android IP摄像机以及Python和OpenCV进行对象检测

  19. 19

    为什么将我的游戏对象移动限制在摄像机框架内会阻止移动?

  20. 20

    使用摄像机的闪光灯

  21. 21

    如何使用OpenGLES 2.0在libgdx中的背景上实时渲染Android的YUV-NV21摄像机图像?

  22. 22

    如果有多台摄像机,则使用RayCast在Sprite上捕获触摸

  23. 23

    使用来自网络摄像头的HTML输入类型文件捕获便携式摄像机录制视频

  24. 24

    在Arch Linux上使用Point Grey BlackFly GigE视觉摄像机进行远程访问

  25. 25

    如何使用openCV在实时摄像机中检测运动对象

  26. 26

    使用OpenCV进行摄像机校准:使用失真和旋转平移矩阵

  27. 27

    使用移动摄像机照明场景

  28. 28

    为什么 Xamarin Forms Webview 绑定不会在 iOS 上刷新?

  29. 29

    使用 Tkinter python2 在标签中实时流摄像机

热门标签

归档