AVCaptureSession 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
协调录制会话。
[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 对象协调视频或音频输入的录制,并将录制的信息传递给一个或多个输出对象。 随着 iOS 系列的进步,不同的设备获得了多个捕获设备, (特别是获得了多个相机) 。 应用程序开发人员可以使用 DefaultDeviceWithMediaType(String) 或 DevicesWithMediaType(String),传入 中 AVMediaType定义的常量。
配置捕获包括设置 Inputs 的 AVCaptureSession和 Outputs 属性。 请注意,可以有多个 AVCaptureInput和 AVCaptureOutput。 例如,若要捕获音频和视频,需要使用两个捕获输入:
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) |