AVFoundation 命名空間
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
AVFoundation 命名空間提供音訊錄製和播放的高階類別。
類別
結構
AVAudio3DAngularOrientation |
在 3D 空間中保存接聽程式的角度。 |
AVAudio3DVectorOrientation |
將接聽程式在 3D 空間中的位置定義為正交 'Up' 和 'Forward' 向量。 |
AVAudioConverterPrimeInfo |
音訊轉換預備資訊。 |
AVBeatRange |
定義特定 AVMusicTrack 中的範圍。 |
AVCaptureWhiteBalanceChromaticityValues |
保留 CIE 1931 xy chromaticity 值的結構。 |
AVCaptureWhiteBalanceGains |
包含白平衡的 RGB 取得值。 |
AVCaptureWhiteBalanceTemperatureAndTintValues |
用於白平衡的值;包括相互關聯的溫度和調色。 |
AVEdgeWidths |
類別,封裝 所使用的 AVVideoCompositionRenderContext 邊緣寬度。 |
AVPixelAspectRatio |
封裝圖元的外觀比例。 與 PixelAspectRatio 搭配使用。 |
AVSampleCursorChunkInfo |
包含媒體範例區塊中繼資料。 |
AVSampleCursorDependencyInfo |
包含序列中範例和其他樣本的媒體範例相依性資料。 |
AVSampleCursorStorageRange |
包含媒體範例或區塊的位置和大小。 |
AVSampleCursorSyncInfo |
包含媒體範例同步處理屬性。 |
介面
列舉
委派
AVAssetImageGeneratorCompletionHandler |
委派,定義 的 GenerateCGImagesAsynchronously(NSValue[], AVAssetImageGeneratorCompletionHandler) 處理常式。 |
AVAudioConverterInputHandler |
AVFoundation 命名空間提供音訊錄製和播放的高階類別。 |
AVAudioEngineManualRenderingBlock |
AVFoundation 命名空間提供音訊錄製和播放的高階類別。 |
AVAudioIONodeInputBlock |
AVFoundation 命名空間提供音訊錄製和播放的高階類別。 |
AVAudioNodeTapBlock |
接收 輸出複本的委派 AVAudioNode |
AVAudioUnitComponentFilter |
AVFoundation 命名空間提供音訊錄製和播放的高階類別。 |
AVCaptureCompletionHandler |
完成處理常式的 CaptureStillImageAsynchronously(AVCaptureConnection, AVCaptureCompletionHandler) 委派。 |
AVCompletion |
委派,定義 和 中 AVPlayer 各種方法的完成處理常式 AVPlayerItem |
AVPermissionGranted | |
AVRequestAccessStatus |
備註
此命名空間包含音訊和視訊的高階錄製和播放功能。
此程式庫位於 CoreMedia、CoreAudio 和 CoreVideo 之上,但不會為 UIKit 提供任何使用者介面元素。 這是用來錄製和播放音訊和視訊的工具組。
AV Foundation 會廣泛使用背景處理。 應用程式開發人員在更新其使用者介面時,應小心確保執行緒安全性和使用 InvokeOnMainThread 或其他技術。
某些常見工作不需要 AVFoundation:
Task | 技巧 |
---|---|
顯示視訊 | 使用媒體播放機的 MPMoviePlayerController 或 MPMoviePlayerViewController 。 |
擷取相片或視訊 | 使用 UIKit 的 UIImagePickerController |
播放音訊檔案 | 使用 AV Foundation 的 AVAudioPlayer 。 |
擷取音訊檔案 | 使用 AV Foundation 的 AVAudioRecorder ,如下所述「擷取音訊檔案」。 |
複雜的視訊顯示或音訊播放 | 使用 AV Foundation,如下所述「自訂播放」。 |
自訂媒體擷取 | 使用 AV Foundation,如下所述「自訂媒體擷取」。 |
媒體檔案寫入、讀取和轉碼 | 使用 AV Foundation,如下所述「媒體檔案寫入、讀取和轉碼」。 |
媒體編輯 | 使用 T:UIKit.UIVideoKitController或 AV Foundation 建置組塊。 |
條碼辨識和臉部偵測 | 使用 AV Foundation,如下所述「即時辨識」。 |
語音合成 | 使用 AV Foundation,如下所述「語音合成」。 |
AVAsset表示一或多個媒體資產。 這些會保留在其 Tracks 屬性中。 此外, AVAsset 還包含有關媒體的中繼資料、追蹤群組和喜好設定。
因為電影之類的媒體資產很大,所以具現化 AVAsset 不會自動載入檔案。 當屬性經過查詢或透過對 或 LoadValuesAsynchronously 的明確呼叫 LoadValuesTaskAsync 時,就會載入這些屬性。
擷取音訊檔案
應用程式開發人員必須先與靜態單一音訊會話物件互動,以協調應用程式與作業系統之間的音效。 和 AVAudioSession 都 AudioSession 參考這個相同的基礎單一。 中的 AudioSession 大部分屬性在 iOS 7 和更新版本中已被取代,而應用程式開發人員應該偏好 中的 AVAudioSession 屬性。
Task | 使用 AVAudioSession | 使用 AudioSession |
---|---|---|
初始化 | SharedInstance (不需要明確初始化) | |
設定類別 | M:AVFoundation.AVAudioSession.SetCategory (string, out NSError) | Category |
設定使用中 |
下列程式碼顯示準備音訊錄製的必要步驟。
var session = AVAudioSession.SharedInstance();
NSError error = null;
session.SetCategory(AVAudioSession.CategoryRecord, out error);
if(error != null){
Console.WriteLine(error);
return;
}
session.SetActive(true, out error);
if(error != null){
Console.WriteLine(error);
return;
}
//Declare string for application temp path and tack on the file extension
string fileName = string.Format("Myfile{0}.aac", DateTime.Now.ToString("yyyyMMddHHmmss"));
string tempRecording = NSBundle.MainBundle.BundlePath + "/../tmp/" + fileName;
Console.WriteLine(tempRecording);
this.audioFilePath = NSUrl.FromFilename(tempRecording);
var audioSettings = new AudioSettings() {
SampleRate = 44100.0f,
Format = MonoTouch.AudioToolbox.AudioFormatType.MPEG4AAC,
NumberChannels = 1,
AudioQuality = AVAudioQuality.High
};
//Set recorder parameters
NSError error;
recorder = AVAudioRecorder.Create(this.audioFilePath, audioSettings, out error);
if((recorder == null) || (error != null))
{
Console.WriteLine(error);
return false;
}
//Set Recorder to Prepare To Record
if(!recorder.PrepareToRecord())
{
recorder.Dispose();
recorder = null;
return false;
}
recorder.FinishedRecording += delegate (object sender, AVStatusEventArgs e) {
recorder.Dispose();
recorder = null;
Console.WriteLine("Done Recording (status: {0})", e.Status);
};
recorder.Record();
自訂播放
物件會使用 AVPlayerItem 物件來播放媒體。 AVPlayerItem封裝 的 AVAsset 表示狀態。
自訂媒體擷取
許多擷取案例都可以滿意容易使用的 UIImagePickerController 和 AVAudioRecorder 類別。 更複雜的案例可以使用 AV Foundation AVCaptureSession 和相關類別。
AVCaptureSession通常會有一或多個 AVCaptureInput 和一或多個 AVCaptureOutput 。 每個 AVCaptureInput 都會 AVCaptureDevice 有 特定媒體類型的 , (音訊或視訊) 。 每個 T:AVFoundation.AVCaptureOuput都會有一個「緩衝區委派」,其會重複呼叫內送資料,其可轉譯、寫入檔案、分析等。
下圖和原始程式碼顯示 的初始化順序
session = new AVCaptureSession () {
SessionPreset = AVCaptureSession.PresetMedium
};
// create a device input and attach it to the session
var captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
if (captureDevice == null){
Console.WriteLine ("No captureDevice - this won't work on the simulator, try a physical device");
return false;
}
// If you want to cap the frame rate at a given speed, in this sample: 15 frames per second
NSError error = null;
captureDevice.LockForConfiguration(out error);
if(error != null){
Console.WriteLine(error);
captureDevice.UnlockForConfiguration();
return false;
}
captureDevice.ActiveVideoMinFrameDuration = new CMTime(1, 15);
captureDevice.UnlockForConfiguration();
var input = AVCaptureDeviceInput.FromDevice (captureDevice);
if (input == null){
Console.WriteLine ("No input - this won't work on the simulator, try a physical device");
return false;
}
session.AddInput (input);
// create a VideoDataOutput and add it to the sesion
var output = new AVCaptureVideoDataOutput () {
VideoSettings = new AVVideoSettings (CVPixelFormatType.CV32BGRA),
};
// configure the output
queue = new MonoTouch.CoreFoundation.DispatchQueue ("myQueue");
outputRecorder = new OutputRecorder ();
output.SetSampleBufferDelegate (outputRecorder, queue);
session.AddOutput (output);
session.StartRunning ();
請注意, outputRecorder
是 的 AVCaptureVideoDataOutputSampleBufferDelegate 自訂子類別。 在此情況下,傳入的資料會轉換成 CIImage , CIColorInvert 在傳送至顯示器之前套用篩選。
public class OutputRecorder : AVCaptureVideoDataOutputSampleBufferDelegate {
readonly CIColorInvert filter;
public OutputRecorder()
{
filter = new CIColorInvert();
}
public override void DidOutputSampleBuffer (AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection)
{
try {
var image = ImageFromSampleBuffer (sampleBuffer);
filter.Image = image;
// Do something with the image, we just stuff it in our main view.
AppDelegate.ImageView.BeginInvokeOnMainThread (delegate {
AppDelegate.ImageView.Image = UIImage.FromImage(filter.OutputImage);
});
//
// 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);
}
}
CIImage 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 cgImage;
}
}
}
}
視訊可以直接擷取至檔案, AVCaptureMovieFileOutput 不過,這個類別沒有可顯示的資料,無法與 AVCaptureVideoDataOutput 同時使用。 相反地,應用程式開發人員可以搭配 AVCaptureVideoPreviewLayer 使用,如下列範例所示:
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");
}
if(session.CanAddInput(camera)){
session.AddInput(camera);
}
if(session.CanAddInput(mic)){
session.AddInput(mic);
}
var layer = new AVCaptureVideoPreviewLayer(session);
layer.LayerVideoGravity = AVLayerVideoGravity.ResizeAspectFill;
layer.VideoGravity = AVCaptureVideoPreviewLayer.GravityResizeAspectFill;
var cameraView = new UIView();
cameraView.Layer.AddSublayer(layer);
var filePath = System.IO.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);
應用程式開發人員應該注意, T:AVFoundation.AVCaptureMovieFileOutput.StopRecording 是非同步;開發人員應該等到 FinishedRecording 委派方法,再操作檔案 (,然後再將它儲存到具有 SaveToPhotosAlbum 或 WriteVideoToSavedPhotosAlbumAsync) 的相片簿。
媒體檔案寫入、讀取和轉碼
以下是 iOS 7 支援音訊格式的官方清單:
- AAC
- Apple Lossless (ALAC)
- A-law
- IMA/ADPCM (IMA4)
- 線性 PCM
- μ法
- DVI/Intel IMA ADPCM
- Microsoft GSM 6.10
- AES3-2003
以及下列視訊格式:
- H.264 視訊,最多 1.5 Mbps、640 x 480 圖元、每秒 30 個畫面格、Low-Complexity 版本的 H.264 基準設定檔,最多 160 Kbps、48 kHz、.m4v 中的身歷聲音訊、.mp4 和 .mov 檔案格式
- H.264 視訊、最多 768 Kbps、320 x 240 圖元、每秒 30 個畫面格、基準設定檔最高層級 1.3,具有最高 160 Kbps 的 AAC-LC 音訊、48 kHz、.m4v、.mp4 和 .mov 檔案格式的身歷聲音訊
- MPEG-4 視訊,最多 2.5 Mbps、640 x 480 圖元、每秒 30 個畫面格、具有 AAC-LC 音訊的簡單設定檔,最多 160 Kbps、48 kHz、.m4v、.mp4 和 .mov 檔案格式的身歷聲音訊
此清單不完整:例如,iPhone 5S 原生擷取 1280 x 720。
讀取媒體檔案會使用 AVAssetReader 來完成。 如同許多 AV Foundation 類別,這會以非同步方式提供資料。 屬性 Outputs 包含 AVAssetReaderOutput 物件。 CopyNextSampleBuffer這些物件上的 方法會定期呼叫, AVAssetReader 因為會處理基礎 Asset 。
您可以使用 來撰寫 AVAssetWriter 媒體檔案,但在媒體擷取會話中,通常會使用 AVAudioRecorderUIImagePickerController 、、 AVCaptureMovieFileOutput 或使用 來完成。 的優點 AVAssetWriter 是使用硬體編碼。
即時辨識
iOS 可以辨識從視訊裝置擷取的條碼和臉部。
下列範例示範如何辨識 QR 和 EAN13 條碼。 已設定 , AVCaptureSession 並將 T:AFoundation.AVCaptureMetadataOutput新增至其中。 MyMetadataOutputDelegate
的子類別 AVCaptureMetadataOutputObjectsDelegate 會指派給其 P:AVFoundation.AVCaptureMetadataObject.Delegate屬性。
將 MetadataObjectTypes 新增至之後 AVCaptureMetadataOutput ,必須設定陣列。
這個範例示範 的簡單子類別 AVCaptureMetadataOutputObjectsDelegate ,會在辨識條碼時引發事件。
session = new AVCaptureSession();
var camera = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
var input = AVCaptureDeviceInput.FromDevice(camera);
session.AddInput(input);
//Add the metadata output channel
metadataOutput = new AVCaptureMetadataOutput();
var metadataDelegate = new MyMetadataOutputDelegate();
metadataOutput.SetDelegate(metadataDelegate, DispatchQueue.MainQueue);
session.AddOutput(metadataOutput);
//Confusing! *After* adding to session, tell output what to recognize...
metadataOutput.MetadataObjectTypes = new NSString[] {
AVMetadataObject.TypeQRCode,
AVMetadataObject.TypeEAN13Code
};
//...etc...
public class MyMetadataOutputDelegate : AVCaptureMetadataOutputObjectsDelegate
{
public override void DidOutputMetadataObjects(AVCaptureMetadataOutput captureOutput, AVMetadataObject[] metadataObjects, AVCaptureConnection connection)
{
foreach(var m in metadataObjects)
{
if(m is AVMetadataMachineReadableCodeObject)
{
MetadataFound(this, m as AVMetadataMachineReadableCodeObject);
}
}
}
public event EventHandler<AVMetadataMachineReadableCodeObject> MetadataFound = delegate {};
}
語音合成
在 iOS 7 和更新版本中,AV Foundation 支援使用針對語言和地區設定當地語系化的語音合成。
以最簡單的形式,只要使用兩個類別即可完成文字轉換語音:
var ss = new AVSpeechSynthesizer();
var su = new AVSpeechUtterance("Microphone check. One, two, one two.") {
Rate = 0.25f
};
ss.SpeakUtterance(su);
會 AVSpeechSynthesizer 維護 的內部佇列 AVSpeechUtterance 。 應用程式開發人員無法存取佇列,但合成器可以使用 和 StopSpeaking 來暫停或停止 PauseSpeaking 。 例如 或 WillSpeakRangeOfSpeechString 之類的 DidStartSpeechUtterance 事件,可讓應用程式開發人員修改先前排入佇列的序列。