iOS开发拓展篇—音效的播放

懵懂的女人 提交于 2020-03-29 12:17:47

一、简单介绍

简单来说,音频可以分为2种

(1)音效

  又称“短音频”,通常在程序中的播放时长为1~2秒

  在应用程序中起到点缀效果,提升整体用户体验

(2)音乐

  比如游戏中的“背景音乐”,一般播放时间较长

框架:播放音频需要用到AVFoundation.framework框架

 

二、音效的播放

1.获得音效文件的路径

  NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];

2.加载音效文件,得到对应的音效ID

  SystemSoundID soundID = 0;

  AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);

3.播放音效

  AudioServicesPlaySystemSound(soundID);

 注意:音效文件只需要加载1次

 

4.音效播放常见函数总结

加载音效文件

  AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)

释放音效资源

  AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)

播放音效

  AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)

播放音效带点震动

  AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)

 

三、程序示例

先导入需要依赖的框架

说明:AVFoundation.framework框架中的东西转换为CF需要使用桥接。

导入需要播放的音效文件素材

  

 

代码示例:

ViewController.m

 1 //
 2 //  ViewController.m
 3 //  01-音效播放
 4 //
 5 //  Created by apple on 14/11/7.
 6 //  Copyright (c) 2014年 github. All rights reserved.
 7 //
 8 
 9 #import "ViewController.h"
10 #import <AVFoundation/AVFoundation.h>
11 #import "HMAudioTool.h"
12 
13 @interface ViewController ()
14 @property (nonatomic, assign) SystemSoundID soundID;
15 
16 
17 @end
18 
19 @implementation ViewController
20 
21 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
22 {
23     NSLog(@"%s", __func__);
24     
25     /*
26     // -1.创建URL
27     NSURL *url = [[NSBundle mainBundle] URLForResource:@"buyao.wav" withExtension:nil];
28     
29     // 0.创建音效ID
30     SystemSoundID soundID;
31     AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
32     
33     // 1.播放音效(本地音效)
34 #warning ios8的模拟器不支持播放音效(真机可以)
35     AudioServicesPlaySystemSound(soundID);
36      */
37     
38     // 1.播放音效(本地音效)
39 //    AudioServicesPlaySystemSound(self.soundID);
40     
41     // 利用工具类播放音效
42 //    [HMAudioTool playAudioWithFilename:@"buyao.wav"];
43     
44     
45     // 随机播放
46 //    NSString *filename = [NSString stringWithFormat:@"m_%02d.wav", arc4random_uniform(14) + 3];
47 //    [HMAudioTool playAudioWithFilename:filename];
48     
49     // 同一时刻播放多个音效
50 //    [HMAudioTool playAudioWithFilename:@"m_17.wav"];
51 //    [HMAudioTool playAudioWithFilename:@"buyao.wav"];
52     
53     // 利用AudioServicesPlaySystemSound播放音乐, 但是注意: 真实开发中不建议使用该函数播放音乐
54     [HMAudioTool playAudioWithFilename:@"normal.aac"];
55 
56 }
57 
58 // 接收到内存警告
59 - (void)didReceiveMemoryWarning
60 {
61     [HMAudioTool disposeAudioWithFilename:@"buyao.wav"];
62 }
63 
64 /*
65 - (SystemSoundID)soundID
66 {
67     if (!_soundID) {
68         // -1.创建URL
69         NSURL *url = [[NSBundle mainBundle] URLForResource:@"buyao.wav" withExtension:nil];
70         
71         // 0.创建音效ID
72         AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &_soundID);
73     }
74     return _soundID;
75 }
76  */
77 @end

自定义音频工具类

 

HMAudioTool.h

 1 //
 2 //  HMAudioTool.h
 3 //  01-音效播放
 4 //
 5 //  Created by apple on 14/11/7.
 6 //  Copyright (c) 2014年 github. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 @interface HMAudioTool : NSObject
12 // 播放音效
13 // 传入需要 播放的音效文件名称
14 + (void)playAudioWithFilename:(NSString  *)filename;
15 
16 // 销毁音效
17 + (void)disposeAudioWithFilename:(NSString  *)filename;
18 @end

HMAudioTool.m

 1 //
 2 //  HMAudioTool.m
 3 //  01-音效播放
 4 //
 5 //  Created by apple on 14/11/7.
 6 //  Copyright (c) 2014年 github. All rights reserved.
 7 //
 8 
 9 #import "HMAudioTool.h"
10 #import <AVFoundation/AVFoundation.h>
11 
12 @implementation HMAudioTool
13 
14 static NSMutableDictionary *_soundIDs;
15 /*
16 + (void)initialize
17 {
18     _soundIDs = [NSMutableDictionary dictionary];
19 }
20  */
21 
22 + (NSMutableDictionary *)soundIDs
23 {
24     if (!_soundIDs) {
25         _soundIDs = [NSMutableDictionary dictionary];
26     }
27     return _soundIDs;
28 }
29 
30 + (void)playAudioWithFilename:(NSString *)filename
31 {
32     /*
33     // -1.创建URL
34     NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
35     
36     // 0.创建音效ID
37     SystemSoundID soundID;
38     AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
39     
40     // 1.播放音效(本地音效)
41 #warning ios8的模拟器不支持播放音效(真机可以)
42     AudioServicesPlaySystemSound(soundID);
43      */
44     // 0.判断文件名是否为nil
45     if (filename == nil) {
46         return;
47     }
48     
49     // 1.从字典中取出音效ID
50     SystemSoundID soundID = [[self soundIDs][filename] unsignedIntValue];
51     
52     // 判断音效ID是否为nil
53     if (!soundID) {
54         NSLog(@"创建新的soundID");
55         
56         // 音效ID为nil
57         // 根据文件名称加载音效URL
58         NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
59         
60         // 判断url是否为nil
61         if (!url) {
62             return;
63         }
64         
65         // 创建音效ID
66         AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
67         
68         // 将音效ID添加到字典中
69         [self soundIDs][filename] = @(soundID);
70     }
71     // 播放音效
72     AudioServicesPlaySystemSound(soundID);
73 }
74 
75 + (void)disposeAudioWithFilename:(NSString *)filename
76 {
77     // 0.判断文件名是否为nil
78     if (filename == nil) {
79         return;
80     }
81     
82     // 1.从字典中取出音效ID
83     SystemSoundID soundID = [[self soundIDs][filename] unsignedIntValue];
84     
85     if (soundID) {
86         // 2.销毁音效ID
87         AudioServicesDisposeSystemSoundID(soundID);
88         
89         // 3.从字典中移除已经销毁的音效ID
90         [[self soundIDs] removeObjectForKey:filename];
91     }
92   
93 }
94 @end

说明:点击屏幕可以播放音效文件。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!