AVCaptureSession 类

定义

协调录制会话。

[Foundation.Register("AVCaptureSession", true)]
[ObjCRuntime.Unavailable(ObjCRuntime.PlatformName.WatchOS, ObjCRuntime.PlatformArchitecture.All, null)]
[ObjCRuntime.Unavailable(ObjCRuntime.PlatformName.TvOS, ObjCRuntime.PlatformArchitecture.All, null)]
public class AVCaptureSession : Foundation.NSObject
type AVCaptureSession = class
    inherit NSObject
继承
AVCaptureSession
属性

注解

AVCaptureSession 对象协调视频或音频输入的录制,并将录制的信息传递给一个或多个输出对象。 随着 iOS 系列的进步,不同的设备获得了多个捕获设备, (特别是获得了多个相机) 。 应用程序开发人员可以使用 DefaultDeviceWithMediaType(String)DevicesWithMediaType(String),传入 中 AVMediaType定义的常量。

配置捕获包括设置 InputsAVCaptureSessionOutputs 属性。 请注意,可以有多个 AVCaptureInputAVCaptureOutput。 例如,若要捕获音频和视频,需要使用两个捕获输入:

var session = new AVCaptureSession();

var camera = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
var mic = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio);
if(camera == null || mic == null){
    throw new Exception("Can't find devices");
}

var cameraInput = AVCaptureDeviceInput.FromDevice (camera);
//info.plist _must_ contain NSMicrophoneUsageDescription key
var micInput = AVCaptureDeviceInput.FromDevice (mic);

if(session.CanAddInput(cameraInput)){
    session.AddInput(cameraInput);
}
if(session.CanAddInput(micInput)){
   session.AddInput(micInput);
}

请注意,访问麦克风的权限 (,在某些区域,相机) 必须由用户授予,要求开发人员将 添加到 NSMicrophoneUsageDescription 应用程序的 info.plist 文件中。

可以使用 直接将视频捕获到 文件中 AVCaptureMovieFileOutput。 但是,此类没有可显示的数据,并且不能与 AVCaptureVideoDataOutput同时使用。 相反,应用程序开发人员可以将它与 AVCaptureVideoPreviewLayer结合使用,如以下示例所示:

var layer = new AVCaptureVideoPreviewLayer (session);
layer.VideoGravity = AVLayerVideoGravity.ResizeAspectFill;

var cameraView = new UIView ();
cameraView.Layer.AddSublayer (layer);

var filePath = Path.Combine (Path.GetTempPath (), "temporary.mov");
var fileUrl = NSUrl.FromFilename (filePath);

var movieFileOutput = new AVCaptureMovieFileOutput ();
var recordingDelegate = new MyRecordingDelegate ();
session.AddOutput (movieFileOutput);

movieFileOutput.StartRecordingToOutputFile (fileUrl, recordingDelegate);

应用程序开发人员应注意, 函数 StopRecording() 是异步的;开发人员应等到 FinishedRecording(AVCaptureFileOutput, NSUrl, NSObject[], NSError) 委托方法后再操作文件 (,然后再将其保存到包含 SaveToPhotosAlbum(String, UIVideo+SaveStatus)WriteVideoToSavedPhotosAlbumAsync(NSUrl)) 的相册。

public class MyRecordingDelegate : AVCaptureFileOutputRecordingDelegate
{
    public override void FinishedRecording (AVCaptureFileOutput captureOutput, NSUrl outputFileUrl, NSObject [] connections, NSError error)
    {
        if (UIVideo.IsCompatibleWithSavedPhotosAlbum (outputFileUrl.Path))
        {
            var library = new ALAssetsLibrary ();
            library.WriteVideoToSavedPhotosAlbum (outputFileUrl, (path, e2) =>
            {
                if (e2 != null)
                {
                    new UIAlertView ("Error", e2.ToString (), null, "OK", null).Show ();
                }
                else
                {
                    new UIAlertView ("Saved", "Saved to Photos", null, "OK", null).Show ();
                    File.Delete (outputFileUrl.Path);
                }
            });
        }
        else
        {
            new UIAlertView ("Incompatible", "Incompatible", null, "OK", null).Show ();
        }

    }
}          

应用程序开发人员可以为捕获的数据配置一个或多个输出端口,这些端口可以是静止帧、具有计时信息的视频帧、音频样本、快速电影文件,也可以直接呈现到 CoreAnimation 层。

设置会话的输入和输出组件后,通过调用 StartRunning() 方法开始实际处理。


void SetupCapture ()
	/ configure the capture session for low resolution, change this if your code
	// can cope with more data or volume
	session = new AVCaptureSession () {
	        SessionPreset = AVCaptureSession.PresetMedium
	};

	// create a device input and attach it to the session
	var captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType (AVMediaType.Video);
	var input = AVCaptureDeviceInput.FromDevice (captureDevice);
	if (input == null){
	        Console.WriteLine ("No video input device");
	        return false;
	}
	session.AddInput (input);

	// create a VideoDataOutput and add it to the sesion
	var output = new AVCaptureVideoDataOutput () {
	        VideoSettings = new AVVideoSettings (CVPixelFormatType.CV32BGRA),

	        // If you want to cap the frame rate at a given speed, in this sample: 15 frames per second
	        MinFrameDuration = new CMTime (1, 15)
	};

	// configure the output
	queue = new MonoTouch.CoreFoundation.DispatchQueue ("myQueue");
	outputRecorder = new OutputRecorder ();
	output.SetSampleBufferDelegateAndQueue (outputRecorder, queue);
	session.AddOutput (output);

	session.StartRunning ();
}

public class OutputRecorder : AVCaptureVideoDataOutputSampleBufferDelegate {
        public override void DidOutputSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
        {
                try {
                        var image = ImageFromSampleBuffer (sampleBuffer);

                        // Do something with the image, we just stuff it in our main view.
                        AppDelegate.ImageView.BeginInvokeOnMainThread (delegate {
                                AppDelegate.ImageView.Image = image;
                        });

                        //
                        // Although this looks innocent "Oh, he is just optimizing this case away"
                        // this is incredibly important to call on this callback, because the AVFoundation
                        // has a fixed number of buffers and if it runs out of free buffers, it will stop
                        // delivering frames.
                        //
                        sampleBuffer.Dispose ();
                } catch (Exception e){
                        Console.WriteLine (e);
                }
        }

        UIImage ImageFromSampleBuffer (CMSampleBuffer sampleBuffer)
        {
                // Get the CoreVideo image
                using (var pixelBuffer = sampleBuffer.GetImageBuffer () as CVPixelBuffer){
                        // Lock the base address
                        pixelBuffer.Lock (0);
                        // Get the number of bytes per row for the pixel buffer
                        var baseAddress = pixelBuffer.BaseAddress;
                        int bytesPerRow = pixelBuffer.BytesPerRow;
                        int width = pixelBuffer.Width;
                        int height = pixelBuffer.Height;
                        var flags = CGBitmapFlags.PremultipliedFirst | CGBitmapFlags.ByteOrder32Little;
                        // Create a CGImage on the RGB colorspace from the configured parameter above
                        using (var cs = CGColorSpace.CreateDeviceRGB ())
                        using (var context = new CGBitmapContext (baseAddress,width, height, 8, bytesPerRow, cs, (CGImageAlphaInfo) flags))
                        using (var cgImage = context.ToImage ()){
                                pixelBuffer.Unlock (0);
                                return UIImage.FromImage (cgImage);
                        }
                }
        }
}

构造函数

AVCaptureSession()

不带参数初始化此类的新实例的默认构造函数。

AVCaptureSession(IntPtr)

创建非托管对象的托管表示形式时使用的构造函数;由运行时调用。

AVCaptureSession(NSObjectFlag)

用于调用派生类的构造函数,以跳过初始化并仅分配 对象。

属性

AutomaticallyConfiguresApplicationAudioSession

是否 AVCaptureSession 使用应用的共享音频会话。

AutomaticallyConfiguresCaptureDeviceForWideColor

获取或设置一个布尔值,该值控制会话是否应自动使用宽颜色(如果可用)。

Class

协调录制会话。

(继承自 NSObject)
ClassHandle

此类的句柄。

DebugDescription

此对象的开发人员有意义的说明。

(继承自 NSObject)
Description

对象的说明,即 ToString 的 Objective-C 版本。

(继承自 NSObject)
DidStartRunningNotification

DidStartRunning 的通知常量

DidStopRunningNotification

DidStopRunning 的通知常量

ErrorKey

表示与常量 AVCaptureSessionErrorKey 关联的值

Handle

处理指向非托管对象表示形式的 (指针) 。

(继承自 NSObject)
Inputs

捕获会话的输入。

Interrupted

会话是否已中断。

InterruptionEndedNotification

InterruptionEnded 的通知常量

InterruptionReasonKey

获取访问捕获会话中断原因的密钥。

InterruptionSystemPressureStateKey

协调录制会话。

IsDirectBinding

协调录制会话。

(继承自 NSObject)
IsProxy

协调录制会话。

(继承自 NSObject)
MasterClock

一个只读时钟,提供用于同步来自多个输入设备的时间戳的时基。

Outputs

捕获会话的输出。

Preset1280x720

表示与常量 AVCaptureSessionPreset1280x720 关联的值

Preset1920x1080

表示与常量 AVCaptureSessionPreset1920x1080 关联的值

Preset320x240

协调录制会话。

Preset352x288

表示与常量 AVCaptureSessionPreset352x288 关联的值

Preset3840x2160

表示与常量 AVCaptureSessionPreset3840x2160 关联的值。

Preset640x480

表示与常量 AVCaptureSessionPreset640x480 关联的值

Preset960x540

协调录制会话。

PresetHigh

表示与常量 AVCaptureSessionPresetHigh 关联的值

PresetiFrame1280x720

表示与常量 AVCaptureSessionPresetiFrame1280x720 关联的值

PresetiFrame960x540

表示与常量 AVCaptureSessionPresetiFrame960x540 关联的值

PresetInputPriority

表示与常量 AVCaptureSessionPresetInputPriority 关联的值

PresetLow

表示与常量 AVCaptureSessionPresetLow 关联的值

PresetMedium

表示与常量 AVCaptureSessionPresetMedium 关联的值

PresetPhoto

表示与常量 AVCaptureSessionPresetPhoto 关联的值

RetainCount

返回对象的当前 Objective-C 保留计数。

(继承自 NSObject)
Running

捕获会话当前是否正在运行。

RuntimeErrorNotification

RuntimeError 的通知常量

Self

协调录制会话。

(继承自 NSObject)
SessionPreset

会话预设。

Superclass

协调录制会话。

(继承自 NSObject)
SuperHandle

用于表示此 NSObject 基类中方法的句柄。

(继承自 NSObject)
UsesApplicationAudioSession

会话是否应使用应用程序的共享音频会话。

WasInterruptedNotification

WasInterrupted 的通知常量

Zone

协调录制会话。

(继承自 NSObject)

方法

AddConnection(AVCaptureConnection)

添加指定的捕获 connection

AddInput(AVCaptureInput)

将输入添加到捕获会话

AddInputWithNoConnections(AVCaptureInput)

在不形成任何新连接的情况下添加指定的 input

AddObserver(NSObject, NSString, NSKeyValueObservingOptions, IntPtr)

使用 NSString keyPath) 注册在外部 (观察到的对象。   观察到的更改将调度到观察者的 对象 ObserveValue(NSString, NSObject, NSDictionary, IntPtr) 方法。

(继承自 NSObject)
AddObserver(NSObject, String, NSKeyValueObservingOptions, IntPtr)

使用 string keyPath) 注册在外部 (观察到的对象。   观察到的更改将调度到观察者的 对象 ObserveValue(NSString, NSObject, NSDictionary, IntPtr) 方法。

(继承自 NSObject)
AddObserver(NSString, NSKeyValueObservingOptions, Action<NSObservedChange>)

注册一个对象,以便使用任意方法在外部观察到。

(继承自 NSObject)
AddObserver(String, NSKeyValueObservingOptions, Action<NSObservedChange>)

注册一个对象,以便使用任意方法在外部观察到。

(继承自 NSObject)
AddOutput(AVCaptureOutput)

将输出添加到捕获会话。

AddOutputWithNoConnections(AVCaptureOutput)

在不形成任何新连接的情况下添加指定的 output

AwakeFromNib()

从 nib 文件加载对象后调用。 重写程序必须调用 base。AwakeFromNib () 。

(继承自 NSObject)
BeginConfiguration()

启动事务以更改捕获会话的配置。

BeginInvokeOnMainThread(Action)

协调录制会话。

(继承自 NSObject)
BeginInvokeOnMainThread(Selector, NSObject)

在主 UI 线程上异步调用指定的代码。

(继承自 NSObject)
Bind(NSString, NSObject, String, NSDictionary)

协调录制会话。

(继承自 NSObject)
Bind(String, NSObject, String, NSDictionary)
已过时.

协调录制会话。

(继承自 NSObject)
BindingInfo(String)
已过时.

协调录制会话。

(继承自 NSObject)
BindingOptionDescriptions(String)
已过时.

协调录制会话。

(继承自 NSObject)
BindingValueClass(String)
已过时.

协调录制会话。

(继承自 NSObject)
CanAddConnection(AVCaptureConnection)

true如果可以添加指定的 connection ,则返回 。

CanAddInput(AVCaptureInput)

返回是否可以将给定输入添加到会话。

CanAddOutput(AVCaptureOutput)

返回是否可以将给定输入添加到会话。

CanSetSessionPreset(NSString)

会话是否支持一组特定的预定义捕获设置。

CommitConfiguration()

以原子方式应用自 以来 BeginConfiguration()对捕获会话所做的所有配置更改。

CommitEditing()

协调录制会话。

(继承自 NSObject)
CommitEditing(NSObject, Selector, IntPtr)

协调录制会话。

(继承自 NSObject)
ConformsToProtocol(IntPtr)

调用 以确定此对象是否实现指定的协议。

(继承自 NSObject)
Copy()

执行基础 Objective-C 对象的副本。

(继承自 NSObject)
DangerousAutorelease()

协调录制会话。

(继承自 NSObject)
DangerousRelease()

协调录制会话。

(继承自 NSObject)
DangerousRetain()

协调录制会话。

(继承自 NSObject)
DidChange(NSKeyValueChange, NSIndexSet, NSString)

指示对多关系的索引发生了更改。

(继承自 NSObject)
DidChange(NSString, NSKeyValueSetMutationKind, NSSet)

协调录制会话。

(继承自 NSObject)
DidChangeValue(String)

指示在指定的键上发生了更改。

(继承自 NSObject)
Dispose()

释放 NSObject 对象使用的资源。

(继承自 NSObject)
Dispose(Boolean)

释放 NSObject 对象使用的资源。

(继承自 NSObject)
DoesNotRecognizeSelector(Selector)

指示此对象无法识别指定的选择器。

(继承自 NSObject)
Equals(NSObject)

协调录制会话。

(继承自 NSObject)
Equals(Object)

协调录制会话。

(继承自 NSObject)
ExposedBindings()

协调录制会话。

(继承自 NSObject)
GetBindingInfo(NSString)

协调录制会话。

(继承自 NSObject)
GetBindingOptionDescriptions(NSString)

协调录制会话。

(继承自 NSObject)
GetBindingValueClass(NSString)

协调录制会话。

(继承自 NSObject)
GetDictionaryOfValuesFromKeys(NSString[])

检索指定键的值。

(继承自 NSObject)
GetHashCode()

为当前实例生成哈希代码。

(继承自 NSObject)
GetMethodForSelector(Selector)

协调录制会话。

(继承自 NSObject)
GetNativeField(String)
已过时.

协调录制会话。

(继承自 NSObject)
GetNativeHash()

协调录制会话。

(继承自 NSObject)
Init()

协调录制会话。

(继承自 NSObject)
InitializeHandle(IntPtr)

协调录制会话。

(继承自 NSObject)
InitializeHandle(IntPtr, String)

协调录制会话。

(继承自 NSObject)
Invoke(Action, Double)

协调录制会话。

(继承自 NSObject)
Invoke(Action, TimeSpan)

协调录制会话。

(继承自 NSObject)
InvokeOnMainThread(Action)

协调录制会话。

(继承自 NSObject)
InvokeOnMainThread(Selector, NSObject)

在主 UI 线程上同步调用指定的代码。

(继承自 NSObject)
IsEqual(NSObject)

协调录制会话。

(继承自 NSObject)
IsKindOfClass(Class)

协调录制会话。

(继承自 NSObject)
IsMemberOfClass(Class)

协调录制会话。

(继承自 NSObject)
MarkDirty()

将常规对等对象 (IsDirectBinding 为 true) 提升为 toggleref 对象。

(继承自 NSObject)
MutableCopy()

创建指定 NSObject 的可变副本。

(继承自 NSObject)
ObjectDidEndEditing(NSObject)

协调录制会话。

(继承自 NSObject)
ObserveValue(NSString, NSObject, NSDictionary, IntPtr)

指示指定 keyPath 相对于此对象的值已更改。

(继承自 NSObject)
PerformSelector(Selector)

协调录制会话。

(继承自 NSObject)
PerformSelector(Selector, NSObject)

协调录制会话。

(继承自 NSObject)
PerformSelector(Selector, NSObject, Double)

在当前实例上调用选择器,如果 obj 不为 null,则将其作为单个参数传递。

(继承自 NSObject)
PerformSelector(Selector, NSObject, Double, NSString[])

协调录制会话。

(继承自 NSObject)
PerformSelector(Selector, NSObject, NSObject)

协调录制会话。

(继承自 NSObject)
PerformSelector(Selector, NSThread, NSObject, Boolean)

协调录制会话。

(继承自 NSObject)
PerformSelector(Selector, NSThread, NSObject, Boolean, NSString[])

协调录制会话。

(继承自 NSObject)
PrepareForInterfaceBuilder()

协调录制会话。

(继承自 NSObject)
RemoveConnection(AVCaptureConnection)

删除指定的 connection

RemoveInput(AVCaptureInput)

删除指定的输入源。

RemoveObserver(NSObject, NSString)

阻止指定的观察程序接收指定 keyPath 的更改值的进一步通知。

(继承自 NSObject)
RemoveObserver(NSObject, NSString, IntPtr)

阻止指定的观察程序接收指定 keyPath 和上下文的更改值的进一步通知。

(继承自 NSObject)
RemoveObserver(NSObject, String)

阻止指定的观察程序接收指定 keyPath 的更改值的进一步通知。

(继承自 NSObject)
RemoveObserver(NSObject, String, IntPtr)

阻止指定的观察程序接收指定 keyPath 和上下文的更改值的进一步通知。

(继承自 NSObject)
RemoveOutput(AVCaptureOutput)

删除指定的输出。

RespondsToSelector(Selector)

此对象是否识别指定的选择器。

(继承自 NSObject)
SetNativeField(String, NSObject)
已过时.

协调录制会话。

(继承自 NSObject)
SetNilValueForKey(NSString)

将指定键的值设置为 null。

(继承自 NSObject)
SetValueForKey(NSObject, NSString)

将键指定的属性的值设置为指定值。

(继承自 NSObject)
SetValueForKeyPath(IntPtr, NSString)

创建非托管对象的托管表示形式时使用的构造函数;由运行时调用。

(继承自 NSObject)
SetValueForKeyPath(NSObject, NSString)

设置可使用键路径访问的属性的值。

(继承自 NSObject)
SetValueForUndefinedKey(NSObject, NSString)

指示尝试将值写入未定义的键。 如果未重写,则引发 NSUndefinedKeyException。

(继承自 NSObject)
SetValuesForKeysWithDictionary(NSDictionary)

将此 NSObject 的值设置为指定字典中的值。

(继承自 NSObject)
StartRunning()

启动输入和输出流。

StopRunning()

异步停止输入和输出流。

ToString()

返回当前实例值的字符串表示形式。

(继承自 NSObject)
Unbind(NSString)

协调录制会话。

(继承自 NSObject)
Unbind(String)
已过时.

协调录制会话。

(继承自 NSObject)
ValueForKey(NSString)

返回与指定键关联的属性的值。

(继承自 NSObject)
ValueForKeyPath(NSString)

返回可使用键路径访问的属性的值。

(继承自 NSObject)
ValueForUndefinedKey(NSString)

指示尝试读取未定义键的值。 如果未重写,则引发 NSUndefinedKeyException。

(继承自 NSObject)
WillChange(NSKeyValueChange, NSIndexSet, NSString)

指示指定键中指定索引的值即将更改。

(继承自 NSObject)
WillChange(NSString, NSKeyValueSetMutationKind, NSSet)

协调录制会话。

(继承自 NSObject)
WillChangeValue(String)

指示指定键的值即将更改。

(继承自 NSObject)

扩展方法

ObjectDidBeginEditing(NSObject, INSEditor)

协调录制会话。

ObjectDidEndEditing(NSObject, INSEditor)

协调录制会话。

GetValidModes(NSObject, NSFontPanel)

协调录制会话。

ValidateToolbarItem(NSObject, NSToolbarItem)

协调录制会话。

GetDebugDescription(INSObjectProtocol)

协调录制会话。

AcceptsPreviewPanelControl(NSObject, QLPreviewPanel)

协调录制会话。

BeginPreviewPanelControl(NSObject, QLPreviewPanel)

协调录制会话。

EndPreviewPanelControl(NSObject, QLPreviewPanel)

协调录制会话。

GetAccessibilityCustomRotors(NSObject)

获取适用于 this 对象的 对象的数组UIAccessibilityCustomRotor

SetAccessibilityCustomRotors(NSObject, UIAccessibilityCustomRotor[])

设置适用于 this 对象的 对象数组UIAccessibilityCustomRotor

适用于

另请参阅