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) |
建立 Unmanaged 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
AVCaptureSession(NSObjectFlag) |
在衍生類別上呼叫的建構函式,以略過初始化,並只配置 物件。 |
屬性
AutomaticallyConfiguresApplicationAudioSession |
是否 AVCaptureSession 使用應用程式的共用音訊會話。 |
AutomaticallyConfiguresCaptureDeviceForWideColor |
取得或設定 Boolean 值,控制會話是否應該在可用時自動使用寬色彩。 |
Class |
協調錄製會話。 (繼承來源 NSObject) |
ClassHandle |
這個類別的控制碼。 |
DebugDescription |
此物件的開發人員有意義描述。 (繼承來源 NSObject) |
Description |
物件的描述,ToString 的 Objective-C 版本。 (繼承來源 NSObject) |
DidStartRunningNotification |
DidStartRunning 的通知常數 |
DidStopRunningNotification |
DidStopRunning 的通知常數 |
ErrorKey |
表示與常數 AVCaptureSessionErrorKey 相關聯的值 |
Handle |
處理 unmanaged 物件標記法) (指標。 (繼承來源 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) |