【iOS开发-118】AVFoundation框架:AudioServices...音效,AVAudioPlayer音乐,AVAudioRecord录音

(1)音效播放,核心代码,主要是创建一个播放器,然后播放。

#import "WPSound.h"
#import <AVFoundation/AVFoundation.h>

@implementation WPSound
static NSMutableDictionary *_soundIDDict;
+(void)initialize{
    _soundIDDict=[NSMutableDictionary dictionary];
}
//不能用懒加载,因为给用户使用的时类方法,所以需要在上面的类初始化中设置
//-(NSMutableDictionary *)soundIDDict{
//    if (_soundIDDict==nil) {
//        _soundIDDict=[NSMutableDictionary dictionary];
//    }
//    return _soundIDDict;
//}

+(void)soundPlay:(NSString *)fileName{
    if (!fileName) return;
    //取出soundID
    SystemSoundID soundID=[_soundIDDict[fileName] unsignedIntValue];
    if (!soundID) {
        NSURL *url=[[NSBundle mainBundle]URLForResource:fileName withExtension:nil];
        if (!url) return;
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);
        //放入字典
        _soundIDDict[fileName][email protected](soundID);
    }
    AudioServicesPlaySystemSound(soundID);
}

+(void)soundDispose:(NSString *)fileName{
    if (fileName) return;
    SystemSoundID soundID=[_soundIDDict[fileName] unsignedIntValue];
    if (!soundID) return;
    AudioServicesDisposeSystemSoundID(soundID);
    //从字典中移除
    [_soundIDDict removeObjectForKey:fileName];
}
@end

(2)音乐播放,核心代码。需要注意的是创建的播放器需要是全局变量。

#import "MusicTool.h"

@implementation MusicTool
static NSMutableDictionary *_audioPlayerDict;
static AVAudioPlayer *_audioPlayer;

+(void)initialize{
    _audioPlayerDict=[NSMutableDictionary dictionary];
    //设置会话类型
    AVAudioSession *session=[AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategorySoloAmbient error:nil];
    [session setActive:YES error:nil];
}

+(AVAudioPlayer *)musicPlay:(NSString *)fileName{
    if (!fileName) return nil;
    //取出播放器
    AVAudioPlayer *audioPlayer=_audioPlayerDict[fileName];
    if (!audioPlayer) {
        NSURL *url=[[NSBundle mainBundle]URLForResource:fileName withExtension:nil];
        if (!url) return nil;
        //创建audioPlayer
        AVAudioPlayer *audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:NULL];
        _audioPlayer=audioPlayer;
        [_audioPlayer prepareToPlay];
        _audioPlayer.enableRate=YES;
        //以下设置播放速度,可以测试用
//        _audioPlayer.rate=10;
//        _audioPlayerDict[fileName]=audioPlayer;
    }
    if (!_audioPlayer.isPlaying) {
        [_audioPlayer play];
    }
    return _audioPlayer;
}

+(void)musicPause:(NSString *)fileName{
    if (!fileName) return;
    AVAudioPlayer *audioPlayer=_audioPlayerDict[fileName];
    if (audioPlayer.isPlaying) {
        [audioPlayer pause];
    }
}

+(void)musicStop:(NSString *)fileName{
    if (!fileName) return;
    AVAudioPlayer *audioPlayer=_audioPlayerDict[fileName];
    if (audioPlayer.isPlaying) {
        [audioPlayer stop];
        [_audioPlayerDict removeObjectForKey:fileName];
    }
}

+(AVAudioPlayer *)currentPlayingAudioPlayer{
    for (NSString *fileName in _audioPlayerDict) {
        AVAudioPlayer *audioPlayer=_audioPlayerDict[fileName];
        if (audioPlayer.isPlaying) {
            return audioPlayer;
        }
    }
    return nil;
}
@end

(3)录音,核心代码。

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()
@property(nonatomic,strong) AVAudioRecorder *recorder;
@property(nonatomic,strong) CADisplayLink *link;
@property(nonatomic,assign) float silentDuration;
- (IBAction)recordStart:(id)sender;
- (IBAction)recordStop:(id)sender;
@end

@implementation ViewController

-(CADisplayLink *)link{
    if (_link==nil) {
        _link=[CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
    }
    return _link;
}

-(void)update{
    //更新录音器的测量值
    [self.recorder updateMeters];
    //获得平均分贝
    float power=[self.recorder averagePowerForChannel:0];

    if (power<-30) {
        self.silentDuration+=self.link.duration;
        if (self.silentDuration>=2) {
            [self.recorder stop];
            [self.link invalidate];
            self.link=nil;
        }
    }else{
        self.silentDuration=0;
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)recordStart:(id)sender {
    NSString *path=[[NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"test.caf"];
    NSURL *url=[NSURL fileURLWithPath:path];
    NSMutableDictionary *setting=[NSMutableDictionary dictionary];
    //音频格式
    setting[AVFormatIDKey][email protected](kAudioFormatAppleIMA4);
    //音频采样率
    setting[AVSampleRateKey][email protected](8000.0);
    //音频通道数
    setting[AVNumberOfChannelsKey][email protected](1);
    //线性音频位深度
    setting[AVLinearPCMBitDepthKey][email protected](8);

    AVAudioRecorder *recorder=[[AVAudioRecorder alloc]initWithURL:url settings:setting error:nil];

    //允许测量分贝
    recorder.meteringEnabled=YES;

    //缓冲
    [recorder prepareToRecord];
    //录音
    [recorder record];

    self.recorder=recorder;

    //开启定时器
    self.silentDuration=0;
    [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}

- (IBAction)recordStop:(id)sender {
    [self.link invalidate];
    self.link=nil;
    [self.recorder stop];
}
@end

(3)后台播放音乐,设置3处地方。

——在AppDelegate.m中设置

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [application beginBackgroundTaskWithExpirationHandler:nil];
}

——在info.plist中设置

——还有一个在程序中设置音频会话类型(可省略)

+(void)initialize{
    _audioPlayerDict=[NSMutableDictionary dictionary];
    //设置会话类型
    AVAudioSession *session=[AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategorySoloAmbient error:nil];
    [session setActive:YES error:nil];
}
时间: 2024-10-10 07:46:54

【iOS开发-118】AVFoundation框架:AudioServices...音效,AVAudioPlayer音乐,AVAudioRecord录音的相关文章

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

这里接着前文<iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)>,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 三. 常用方法的封装 虽然 PhotoKit 的功能强大很多,但基于兼容 iOS 8.0 以下版本的考虑,暂时可能仍无法抛弃 ALAssetLibrary,这时候一个比较好的方案是基于 ALAssetLibrary 和 PhotoKit 封装出一系列模拟系统 Asset 类的自定义类,然后在其中封装好兼容 A

iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 这里引用一下前文中对 PhotoKit 基本构成的介绍: PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源 PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值 PHAssetCo

[转] iOS --- ReactiveCocoa - iOS开发的新框架

转载唐巧的博客:ReactiveCocoa - iOS开发的新框架

IOS开发中AVFoundation中AVAudioPlayer的使用

IOS开发中如何调用音频播放组件 1.与音频相关的头文件等都在AVFoundation.h中,所以第一步是添加音频库文件: #import <AVFoundation/AVFoundation.h> 2.先找一段要播放的音频文件,我这里找到是一个mp3文件,然后添加到项目中: 3.使用NSBundle获取这个文件并转化成NSData类型: NSString *filepath = [[NSBundle mainBundle]pathForResource:@"bbb" of

ReactiveCocoa - iOS开发的新框架

本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC)是由Github 开源的一个应用于iOS和OS X开发的新框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive Extensions的设计和实现.本文将详细介绍该框架试图解决什么问题,以及其用法与特点. ReactiveCocoa试图解决什么问题 经过一段时间的研

iOS 开发之照片框架详解

一. 概要 在 iOS 设备中,照片和视频是相当重要的一部分.最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法.在 iOS 8 出现之前,开发者只能使用 AssetsLibrary 框架来访问设备的照片库,这是一个有点跟不上 iOS 应用发展步伐以及代码设计原则但确实强大的框架,考虑到 iOS7 仍占有不少的渗透率,因此 AssetsLibrary 也是本文重点介绍的部分.而在 iOS8 出现之后,苹果提供了一个名为 PhotoKit 的框架,一个可以

IOS开发之自动布局框架设计(二)

[上集剧情概要:上集我们主要剖析了原生的NSLayoutConstraint实现自动布局的方式,我们知道是通过constraintWithItem这个初始化的方法来配备所需要的7个参数,然后通过addConstraint方法将布局添加进去,并且定义了 NSLayoutAttribute,NSLayoutRelation这些枚举] 如果我们自己设计一款布局框架可以怎么设计呢? 1.封装原有的NSLayoutConstraint类,可以将代码的实现更加简洁化.例如:Masonry,SDAutoLay

iOS开发常用第三方框架

1.网络通信 1.ASIHTTPRequest 这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动).在不同iOS版本上略微有一些小问题(提醒显示上的),所以用的时候还是稍微修改一下比较好. 下载地址:https://github.com/pokeb/asi-http-request 2.AFNetworking 轻量级的通讯类库,使用非常简单. 下载地址:https://github.com/AFNetworking/AF

iOS开发之缓存框架、内存缓存、磁盘缓存、NSCache、TMMemoryCache、PINMemoryCache、YYMemoryCache、TMDiskCache、PINDiskCache

1.在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力. 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化.常见的内存缓存有NSCache.TMMemoryCache.PINMemoryCache.YYMemoryCache.常见的磁盘缓存有TMDiskCache.PINDiskCache.YYCache. 1.本文章着重讲下YYCache. 这是为什么呢,因为他比其他的缓存框架更加高效,使用方便. YYCache: 去掉