iOS_33_音效

音效、音乐

导入框架:

AVFoundation.framework

AudioToolbox.framework

硬件解码更加高效,推荐使用CAF格式的音效

NSURL 转成CFURLRef
需要桥接

核心代码:

音效工具类,提供快速播放和清除销毁音效功能

//
//  AudioEffectTool.h
//  33_音效
//
//  Created by beyond on 14-9-10.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  音效工具类,提供快速播放和清除销毁音效功能

#import <Foundation/Foundation.h>

@interface AudioEffectTool : NSObject

// 播放音效,参数:音效文件名  如:@"go.wav"
+ (void)playSound:(NSString *)filename;
// 清除销毁音效,参数:音效文件名  如:@"go.wav"
+ (void)disposeSound:(NSString *)filename;
// 清除销毁所有音效
+ (void)disposeAllSound;

@end
//
//  AudioEffectTool.m
//  33_音效
//
//  Created by beyond on 14-9-10.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  音效工具类,提供快速播放和清除音效功能

#import "AudioEffectTool.h"

// 音效播放,必须导入
#import <AVFoundation/AVFoundation.h>

@implementation AudioEffectTool

// 字典: filename作为key, soundID作为value
// 存放所有的生成的  音效ID
static NSMutableDictionary *_soundIDDict;

#pragma mark - 生命周期
// 初始化
+ (void)initialize
{
    // 初始化,可变字典,用于存放所有的 生成的 音频ID
    _soundIDDict = [NSMutableDictionary dictionary];
}

#pragma mark - 公开方法
// 播放音效,参数:音效文件名  如:@"go.wav"
+ (void)playSound:(NSString *)filename
{
    // 0.robust判断
    if (!filename) return;

    // 1.先从字典中取出soundID,将取出的对象转成unsigned_long
    SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue];
    // 2.如果是第一次播放,才创建
    if (!soundID) {
        // 2.1 得到文件的url
        NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
        // 2.2 如果音效文件并不存在,直接返回
        if (!url) return;

        // 2.3 加载音效文件,并且创建音效ID,存入传进来的地址中,
        // NSURL 转成CFURLRef 需要桥接
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);

        // 2.4 最后将该文件名,对应的音效ID,包装成对象,放入字典
        _soundIDDict[filename] = @(soundID);
    }

    // 3.最后,开始播放 音效ID
    AudioServicesPlaySystemSound(soundID);

}
// 清除销毁音效,参数:音效文件名  如:@"go.wav"
+ (void)disposeSound:(NSString *)filename
{
    // 0.robust判断
    if (!filename) return;
    // 1.先从字典中取出soundID,将取出的对象转成unsigned_long
    SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue];
    // 2.如果soundID存在,才清除销毁掉,释放出内存,并记得从字典中移除
    if (soundID) {
        // 销毁音效ID
        AudioServicesDisposeSystemSoundID(soundID);
        // 从字典中移除
        [_soundIDDict removeObjectForKey:filename];
    }

}

// 清除销毁所有音效
+ (void)disposeAllSound
{
    // 遍历,并执行清除
    for (id obj in [_soundIDDict allValues]) {
        SystemSoundID soundID = [obj unsignedLongValue];
        // 2.如果soundID存在,才清除销毁掉,释放出内存,并记得从字典中移除
        if (soundID) {
            // 销毁音效ID
            AudioServicesDisposeSystemSoundID(soundID);
        }
    }
    // 最后清空字典
    [_soundIDDict removeAllObjects];
}

@end

控制器

//
//  BeyondViewController.m
//  33_音效
//
//  Created by beyond on 14-9-10.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//  音效播放demo,触摸随机播放音效

#import "BeyondViewController.h"
// 导入音效工具类,负责播放和清除音效
#import "AudioEffectTool.h"

@interface BeyondViewController ()

@end

@implementation BeyondViewController

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

    [AudioEffectTool disposeAllSound];
}

#pragma mark - touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSString *filename = [NSString stringWithFormat:@"m_%02d.wav", arc4random_uniform(14) + 3];

    [AudioEffectTool playSound:filename];
}

@end
时间: 2024-10-06 00:07:15

iOS_33_音效的相关文章

(九十五)音效播放方法和工具类的制作

音效通过AVFoundation框架实现,是通过函数而不是方法,因此需要进行桥接等操作,具体步骤如下. 进行音效播放,首先要得到音效的URL(只能是本地音频),然后转换为音效ID(唯一),通过ID播放音效. [音效播放方法] ①导入框架主头文件 #import <AVFoundation/AVFoundation.h> ②通过Bundle拿到本地音效,然后调用AudioServicesCreateSystemSoundID函数得到音效ID,ID为0代表无效,以此为依据可进行懒加载 @inter

Android 学习笔记之三—— 音效的使用

在开发手电筒应用的处理音效的过程中,看网上使用的是MediaPlayer,因为音效一般都比较短,所以这里使用的是SoundPool,如下: SoundPool soundPool=new SoundPool(2,AudioManager.STREAM_MUSIC,0); //第一个参数,2为可以同时播放两个音效,第二是使用什么音频流,第三个暂未使用,传0. AssetManager assetMgr=getAssets();  AssetFileDescriptor assetfileDescr

iOS_33_音乐后台播放

音乐后台播放:三个步骤 在appDelegate中的didEnterBackground方法中实现: app的beginBackgroundTaskWithExpirationHandler方法 开启后台任务,让程序在后台运行 - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, inv

Cocos2d-x实例:设置背景音乐与音效-设置场景实现

设置场景(Setting),Setting.h文件代码如下: [html] view plaincopy #ifndef __Setting_SCENE_H__ #define __Setting_SCENE_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" class Setting : public cocos2d::Layer { bool isEffect;                    

IOS开发之音效/音频播放

音频播放: 1.音效播放 2.音乐播放 (1)音频播放 : <1>系统声音 短小的声音 使用的框架 AudioToolBox <2>1.AudioServicesPlaySystemSound 播放系统声音 2.AudioServicesPlayAlertSound播放系统声音有震动 <3>使用: 1.声明声音的ID  通过声音的id来区分是哪一个音效  无符号整形 2.创建声音的服务 (告诉系统有一个可以使用的soundID) 需要声音文件路径和声音的ID 3.播放声

ios 短音效的使用

1.通用短音效ID的获取 #import <Foundation/Foundation.h> @interface MJAudioTool : NSObject /** * 播放音效 * * @param filename 音效文件名 */ + (void)playSound:(NSString *)filename; /** * 销毁音效 * * @param filename 音效文件名 */ + (void)disposeSound:(NSString *)filename; @end

游戏中的音效

1. 游戏中的即时音效: 在游戏中,根据情况播放的即时音效较为短暂.可以重复.也可以同时播放.由于Android中提供的MediaPlayer会占用大量的系统资源,而且播放时还会进行缓冲,有较大的延时,因此使用MediaPlayer无法实现即时音效的播放.而在Android中专门提供的SoundPool类主要用于管理和播放应用程序中的声音资源,使用该类时首先需要通过该类将声音资源加载到内存中,然后在需要的即时音效的地方播放即可,几乎没有延时现象.[由于SoundPool设计的初衷是用于无延时地播

Unity3D音乐音效研究-MIDI与波表

其实音乐音效这个命题本身没什么好研究的. Unity3D提供了丰富的结构和使用方式,足够使用了. 但是我有一些小小的想法和需求,一般的Unity资料并没有给我答案. 一个是容量要小.MP3.OGG的高音质压缩一分钟一M多,多放几首背景音乐就顶不住了. 一个是资源和主程序分离,方便更新,别和我提AssetBundle,这东西的平台不兼容性,完全是在增加麻烦. 还有就是想要一个示波器 像这样的就行了. 问题1.最小不过MIDI,MIDI是乐曲的原始信息,本地合成,1M多MP3不过一分钟,MIDI录一

Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现

为了进一步了解背景音乐和音效播放的,我们通过一个实例给大家介绍一下.如下图所示有两个场景:HelloWorld和Setting.在HelloWorld场景点击"游戏设置"菜单可以切换到Setting场景,在Setting场景中可以设置是否播放背景音乐和音效,设置完成后点击"OK"菜单可以返回到HelloWorld场景. 我们需要在AppDelegate中实现背景音乐播放暂停与继续函数,AppDelegate.h文件代码如下: #ifndef _APP_DELEGAT