1, Using Assets [自己理解為:數據的來源]
這個資源可以來自自己的ipod媒體庫或圖片也可以時文件
creating an Asset Object
NSRUL *url = 后跟一個網址 如電影文件等資源
AVURLAsset *ansset = [[AVURLSset alloc] initwithURL:url options:nil];
2.獲得一個視頻的圖像
使用AVASsetImageGenerator類來實現
用來生成圖像序列
3.Playback
我們在播放視頻時可以使用AVPlayer和AVQueuePlayer播放AVPlayer是AVQueuePlayer的父類
a先創建一個路徑
b可以使用AVPlayerItem加載路徑
c使用AVPlayer播放文件
當然我們還可以控制它的播放速度
使用rate屬性它是一個介於0.0--1.0之間的數
我們也可以播放多個項目
NSArray *items = // 設置一個播放的組合
AVQueuePlayer *queueplayer = [[AVQueuePlayer alloc]initwithItems:items];
然后使用AVPlayerItem
AVPlayerItem *anItem = // get a player item
使用canInsertItem:afterItem 測試
4.Media capture
我們可以配置預設圖片的質量和分辨率
Symbol Resolution Comments
AVCaptureSessionPresetHigh High Highest recording quality. This varies per device.
AVCaptureSessionPresetMedium Medium Suitable for WiFi sharing. The actual values may change.
AVCaptureSessionPresetLow Low Suitable for 3g sharing. The actual values may change.
AVCaptureSessionPreset640x480 640x480 VGA
AVCaptureSessionPreset1280x720 1280x720 720p HD
AVCaptureSessionPresetPhoto Photo Full photo resolution. This is not supported for video output
判斷一個設備是否適用
AVCaptreSessuion *session = [[AVCaptureSession alloc]init];
if([session canSetSessionPreset:AVCaptureSessionPrese 1280x720]){
session.sessionPreset = AVCaptureSessionPreset 1280x720;
}else{
// Handle the failure.
}
當然在
[session beginConfigration],
[session commitconfiguration]之間配置重新添加你想要適用的設備以及刪除以前的設備等操作
5.當我們不知道設備的一些特性時我們可以使用以下代碼查找相應的設備
NSArray *devices = [AVCaptureDevice devices];
fo(AVCaptureDevice *device in device){
NSLogO("Device name %@",[devic localizedName]);
當然還可以判斷設備的位置
if([device hasMediaType:AVMediaTypeVideo]){
if([device postion] == AVCaptureDevicePostionBack){
nslog(@"Device postion :back");
}else{
NSLog(@"Device postion :front");
}
}
}
下面的demo說明如何找到視頻輸入設備
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
NsMutableArray *torchDevices = [[NSMutableArray alloc]init];
for(AVCaptureDevice *device in devices){
if([device hasTorch]&&[device supportsAVCaptureSessionPreset:AVCaptureSessionPreset 640x480]){
[torchDevices addObject:device];
}
}
6設備間切換
AVCaptureSession *session = //一個設備session
[session beginConfiguration];
[session removeInput:frontFacingCameraDeviceInput];
[session AddInput:backFacikngCameraDeviceInput];
[session commitConfiguration];
7 配置AVCaptureDeviceInput
AVCaptureSession *captureSession = <#Get a capture session#>;
AVCaptureDeviceInput *captureDeviceInput = <#Get a capture device input#>;
// 檢查是否適用
if ([captureSession canAddInput:captureDeviceInput]) {
// 適用則添加
[captureSession addInput:captureDeviceInput];
} else {
// Handle the failure.
}
8 配置AVCaptureOutput
輸出的類型:
a.AVCaptureMovieFileOutput 輸出一個電影文件
b.AVCaptureVideoDataOutput 輸出處理視頻幀被捕獲
c.AVCaptureAudioDataOutput 輸出音頻數據被捕獲
d.AVCaptureStillImageOutput 捕獲元數據
AVCaptureSession *captureSession = <#Get a capture session#>;
AVCaptureMovieFileOutput *movieInput = <#Create and configure a movie output#>;
if ([captureSession canAddOutput:movieInput]) {
[captureSession addOutput:movieInput];
} else {
// Handle the failure.
}
9 保存到一個電影文件
AVCaptureMovieFileOutput *aMovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
CMTime maxDuration = <#Create a CMTime to represent the maximum duration#>; aMovieFileOutput.maxRecordedDuration = maxDuration;
aMovieFileOutput.minFreeDiskSpaceLimit = <#An appropriate minimum given the quality of the movie format and the duration#>;
10 錄音設備
The delegate must conform to the
AVCaptureFileOutputRecordingDelegate
protocol,
and must implement the
captureOutput:didFinishRecordingToOutputFileAtURL:fromConnections:error: method.
11 像素和編碼格式
iphone 3G iphone 3GS iphone 4
yuvs,2vuy,BGRA,jpeg 420f,420v,BGRA,jpeg 420f, 420v, BGRA, jpeg
12 靜態圖像捕捉
AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey, nil]; [stillImageOutput setOutputSettings:outputSettings];
13 重力模式
The preview layer supports three gravity modes that you set using videoGravity:
● AVLayerVideoGravityResizeAspect: This preserves the aspect ratio, leaving black bars where the
video does not fill the available screen area.
● AVLayerVideoGravityResizeAspectFill: This preserves the aspect ratio, but fills the available screen area, cropping the video when necessary.
● AVLayerVideoGravityResize: This simply stretches the video to fill the available screen area, even if doing so distorts the image.
設備之間切換
- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position
{
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for ( AVCaptureDevice *device in devices )
if ( device.position == position )
return device;
return nil;
}
- (void)swapFrontAndBackCameras {
// Assume the session is already running
NSArray *inputs = self.session.inputs;
for ( AVCaptureDeviceInput *input in inputs ) {
AVCaptureDevice *device = input.device;
if ( [device hasMediaType:AVMediaTypeVideo] ) {
AVCaptureDevicePosition position = device.position;
AVCaptureDevice *newCamera = nil;
AVCaptureDeviceInput *newInput = nil;
if (position == AVCaptureDevicePositionFront)
newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];
else
newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];
newInput = [AVCaptureDeviceInput deviceInputWithDevice:newCamera error:nil];
// beginConfiguration ensures that pending changes are not applied immediately
[self.session beginConfiguration];
[self.session removeInput:input];
[self.session addInput:newInput];
// Changes take effect once the outermost commitConfiguration is invoked.
[self.session commitConfiguration];
break;
}
}
}
