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


    一、简单介绍

    简单来说,音频可以分为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

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

  • 相关阅读:
    (4.38)sql server中的事务控制及try cache错误处理
    (4.37)sql server中的系统函数
    【3.5】mysql常用开发规则30条
    Linux学习笔记(17)Linux防火墙配置详解
    (5.16)mysql高可用系列——keepalived+mysql双主ha
    mysql online DDL
    (5.3.8)sql server升级打补丁
    python request
    python 模块被引用多次但是里面的全局表达式总共只会执行一次
    Protocol Buffer Basics: Python
  • 原文地址:https://www.cnblogs.com/zengshuilin/p/5768231.html
Copyright © 2020-2023  润新知