gpt4 book ai didi

ios - AVCaptureSession CMSampleBuffer 问题

转载 作者:行者123 更新时间:2023-11-29 13:41:23 24 4
gpt4 key购买 nike

我在从 AVCaptureSession 相机中的 CMSampleBuffer 释放内存时遇到问题。这是我设置捕获 session 的代码。如果我处置 imageDataSampleBuffer,应用程序会崩溃。

using MonoTouch.CoreVideo;
using MonoTouch.CoreMedia;
using MonoTouch.AVFoundation;
using MonoTouch.ImageIO;
using MonoTouch.UIKit;
using MonoTouch.CoreFoundation;
using MonoTouch.Foundation;
using System.Drawing;
using System;
namespace myNamespace
{
public class AVFoundationCamera : UIViewController
{
public AVFoundationCamera (CameraController parView)
{
parentView = parView;
}

NSError error;
AVCaptureSession session;
AVCaptureDevice device;
AVCaptureDeviceInput input;
AVCaptureStillImageOutput output;
AVCaptureVideoPreviewLayer captureVideoPreviewLayer;
NSDictionary outputSettings;


AVCaptureConnection captureConnection;

UIButton buttCaptureImage;

public UIImageView imageV;
NSData imageData;

CameraController parentView;

public override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
CreateControls();
SetupSession();

}

public override void DidReceiveMemoryWarning ()
{
imageData.Dispose();
session.Dispose();
device.Dispose();
input.Dispose();
output.Dispose();
captureVideoPreviewLayer.Dispose();
base.DidReceiveMemoryWarning ();
}

private void CreateControls()
{
imageV = new UIImageView(new RectangleF(0, 0, UIScreen.MainScreen.ApplicationFrame.Width, UIScreen.MainScreen.ApplicationFrame.Height - UIApplication.SharedApplication.StatusBarFrame.Height));
View.AddSubview(imageV);

buttCaptureImage = UIButton.FromType(UIButtonType.RoundedRect);
buttCaptureImage.Frame = new RectangleF(0, 60, 150, 30);
buttCaptureImage.SetTitle("Take a photo", UIControlState.Normal);
buttCaptureImage.TouchUpInside += HandleButtCaptureImageTouchUpInside;

View.AddSubview(buttCaptureImage);
}

void HandleButtCaptureImageTouchUpInside (object sender, EventArgs e)
{
captureConnection = null;

foreach (AVCaptureConnection capConn in output.Connections)
{
foreach (AVCaptureInputPort port in capConn.inputPorts)
{
if (port.MediaType == AVMediaType.Video)
{
captureConnection = capConn;
break;
}
}
if (captureConnection != null)
break;
}

output.CaptureStillImageAsynchronously(captureConnection, HandleAVCaptureCompletionHandlercompletionHandler);
buttCaptureImage.Enabled = false;
}

void HandleAVCaptureCompletionHandlercompletionHandler (CMSampleBuffer imageDataSampleBuffer, NSError error)
{
try
{
using (var pool = new NSAutoreleasePool ()) {
imageData = AVCaptureStillImageOutput.JpegStillToNSData(imageDataSampleBuffer);
//imageDataSampleBuffer.Dispose();
parentView.DismissModalViewControllerAnimated(true);
parentView.HandlePickedImage(imageData);
session.StopRunning();
}
}
catch (Exception exc)
{
Console.WriteLine(exc);
}
}

private void SetupSession()
{

session = new AVCaptureSession();
session.BeginConfiguration();
session.SessionPreset = AVCaptureSession.PresetPhoto;

captureVideoPreviewLayer = new AVCaptureVideoPreviewLayer(session);
captureVideoPreviewLayer.Frame = imageV.Bounds;

imageV.Layer.AddSublayer(captureVideoPreviewLayer);

device = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);

input = new AVCaptureDeviceInput(device, out error);

session.AddInput(input);

output = new AVCaptureStillImageOutput();
output.OutputSettings = NSDictionary.FromObjectAndKey(new NSString("AVVideoCodecKey"), new NSString("AVVideoCodecJPEG"));

session.AddOutput(output);

session.CommitConfiguration();
session.StartRunning();
}
}

这只是一个用于拍照的普通相机。我尝试使用您在此处发布的 UIImagePickerController:https://github.com/migueldeicaza/TweetStation/blob/master/TweetStation/UI/Camera.cs这消除了 UIImagePickerController 错误,但每当我单击“拍照”按钮时,都会显示分配内存的预览窗口。如果我按下“Retake”,内存将被释放,但在 FinishedPiCkingMedia 事件处理程序中我无法释放它。所以,几张照片后它崩溃了。

任何解决方案都适合我,但很高兴看到我做错了什么。

再次感谢您。

最佳答案

这是一个 bug在 MonoTouch 中。

在获得修复之前,您可以使用一种解决方法:

[DllImport ("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation")]
extern static void CFRetain (IntPtr handle);

void HandleAVCaptureCompletionHandlercompletionHandler (CMSampleBuffer imageDataSampleBuffer, NSError error)
{
try {
CFRetain (imageDataSampleBuffer.Handle);
(...)
} finally {
imageDataSampleBuffer.Dispose ();
}
}

我已经添加了一个 Dispose 调用,可用缓冲区的数量可能有限,这样您可以确保应用程序不会耗尽它们(因为 GC 可能需要一些时间才能自动释放它)

另请注意,一旦安装了带有真正修复程序的 MonoTouch 版本,就应该删除解决方法,否则会泄漏缓冲区。

关于ios - AVCaptureSession CMSampleBuffer 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com