http://blog.youkuaiyun.com/james_1010/article/details/8556095
AVFoundation原理

AVCaptureConnection*videoConnection = nil;
for (AVCaptureConnection *connection in imageOutput_.connections)
{
for (AVCaptureInputPort *port in[connection inputPorts])
{
if ([[port mediaType] isEqual:AVMediaTypeVideo] )
{
videoConnection = connection;
break;
}
}
if (videoConnection) {break; }
}
//锁定connection后就可以获取静态图了。
[imageOutput_captureStillImageAsynchr
NSDictionary *exifAttachments =(__bridgeNSDictionary*)CMGetAttachment(imageSampleBuffer,kCGImagePropertyExifDict
}];
最后,如果想抓取视频的话,请参考苹果的文档:
Startinga Recording
You startrecording a QuickTime movie using startRecordingToOutputFi
.You need to supply a file-based URL and a delegate. The URL mustnot identify an existing file, as the movie file output does notoverwrite existing resources. You must also have permission towrite to the specified location. The delegate must conform tothe AVCaptureFileOutputRecor
captureOutput:didFinishRecordingToOutp
AVCaptureMovieFileOutput |
NSURL *fileURL = <#A file URL that identifies the output location#>; |
[aMovieFileOutput startRecordingToOutputFi |
In theimplementation of captureOutput:didFinishRecordingToOutp
,the delegate might write the resulting movie to the camera roll. Itshould also check for any errors that might have occurred.
Ensuringthe File Was Written Successfully
To determinewhether the file was saved successfully, in the implementationof captureOutput:didFinishRecordingToOutp
AVErrorRecordingSuccessf
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput |
didFinishRecordingToOutp |
fromConnections:(NSArray *)connections |
error:(NSError *)error { |
|
BOOL recordedSuccessfully = YES; |
if ([error code] != noErr) { |
// A problem occurred: Find out if the recording was successful. |
id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessf |
if (value) { |
recordedSuccessfully = [value boolValue]; |
} |
} |
// Continue as appropriate... |
You shouldcheck the value of the AVErrorRecordingSuccessf
AVErrorMaximumDurationRe
AVErrorMaximumFileSizeRe
.Other reasons the recording might stop are:
-
Thedisk is full—
AVErrorDiskFull
. -
Therecording device was disconnected (for example, the microphone wasremoved from an iPod touch)—
AVErrorDeviceWasDisconne
.cted -
Thesession was interrupted (for example, a phone call wasreceived)—
AVErrorSessionWasInterru
.pted
1. AVFoundation
Build Phases => Link Binary With Libraies => + => AVFoundation.framework => add
firstviewcontroller.h
- #import <UIKit/UIKit.h>
- #import <AVFoundation/AVFoundation.h>
- @interface FirstViewController : UIViewController
- {
- __weak IBOutlet UILabel *label;
- AVAudioPlayer *player;
- }
- - (IBAction)toplay:(id)sender;
- @end
firstviewcontroller.m
- - (IBAction)toplay:(id)sender
- {
- NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/test.mp3", [[NSBundle mainBundle] resourcePath]]];
- NSError *error;
- player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
- player.numberOfLoops = -1;
- [player play];
- [label setText:@"Play ..."];
- }
或者:
- NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"mp3"];
- NSError *error;
- player = [[AVAudioPlayer alloc]initWithContentsOfURL:[[NSURL alloc]initFileURLWithPath:path]error:&error];
- [player prepareToPlay];
- player.numberOfLoops = -1;
- [player play];
test.mp3 拖放到 Supporting Files 文件夹。
播放,暂停和停止
- [player play]; //播放
- [player pause]; //暂停
- [player stop]; //停止
更多功能:
1. 音量:
- player.volume=0.8;//0.0~1.0之间
2. 循环次数
- player.numberOfLoops = 3;//默认只播放一次 负数(-1)为无限循环
3.播放位置
- player.currentTime = 15.0;//可以指定从任意位置开始播放
3.1 显示当前时间
- NSLog(@"%f seconds played so far", player.currentTime);
4.声道数
- NSUInteger channels = player.numberOfChannels;//只读属性
5.持续时间
- NSTimeInterval duration = player.dueration;//获取采样的持续时间
6.仪表计数
- player.meteringEnabled = YES;//开启仪表计数功能
- [ player updateMeters];//更新仪表读数
- //读取每个声道的平均电平和峰值电平,代表每个声道的分贝数,范围在-100~0之间。
- for(int i = 0; i<player.numberOfChannels;i++){
- float power = [player averagePowerForChannel:i];
- float peak = [player peakPowerForChannel:i];
- }
7. 初始化播放器
- [player prepareToPlay];
8. 判断是否正在播放
- [player isPlaying]
9、代理方法
加入播放出现异常,或者被更高级别的系统任务打断,我们的程序还没来得及收场就挂了,怎么办?不急,我们可以通过几个委托方法很好地处理所有的情形。
首先给player设置委托是必须的:
- player.delegate = self;
- - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag{
- //播放结束时执行的动作
- }
- - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer*)player error:(NSError *)error{
- //解码错误执行的动作
- }
- - (void)audioPlayerBeginInteruption:(AVAudioPlayer*)player{
- //处理中断的代码
- }
- - (void)audioPlayerEndInteruption:(AVAudioPlayer*)player{
- //处理中断结束的代码
- }
参考:
http://blog.youkuaiyun.com/xys289187120/article/details/6595919
http://blog.youkuaiyun.com/iukey/article/details/7295962
视频:
http://www.youtube.com/watch?v=kCpw6iP90cY
2. AudioToolbox
Build Phases => Link Binary With Libraies => + => AudioToolbox.framework => add
firstviewcontroller.h
- #import <UIKit/UIKit.h>
- #import <AudioToolbox/AudioToolbox.h>
- @interface FirstViewController : UIViewController
- {
- }
- - (IBAction)toplay:(id)sender;
- @end
firstviewcontroller.m
- - (IBAction)toplay:(id)sender
- {
- CFBundleRef mainBundle = CFBundleGetMainBundle();
- CFURLRef soundFileURLRef;
- soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"sound1", CFSTR ("wav"), NULL);
- UInt32 soundID;
- AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
- AudioServicesPlaySystemSound(soundID);
- }