亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

實例解析iOS app開發中音頻文件播放工具類的封裝

2020-07-26 03:28:41
字體:
來源:轉載
供稿:網友

一、簡單說明

1.關于音樂播放的簡單說明

(1)音樂播放用到一個叫做AVAudioPlayer的類

(2)AVAudioPlayer常用方法

  加載音樂文件

復制代碼 代碼如下:

- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;

- (id)initWithData:(NSData *)data error:(NSError **)outError;


  準備播放(緩沖,提高播放的流暢性) - (BOOL)prepareToPlay;

  播放(異步播放)- (BOOL)play;

暫停 - (void)pause;

停止- (void)stop;

是否正在播放

復制代碼 代碼如下:
  @property(readonly, getter=isPlaying) BOOL playing;

時長    

復制代碼 代碼如下:
  @property(readonly) NSTimeInterval duration;

當前的播放位

復制代碼 代碼如下:
  @property NSTimeInterval currentTime;

播放次數(-1代表無限循環播放,其他代表播放numberOfLoops+1次 @property NSInteger numberOfLoops;

音量   

復制代碼 代碼如下:
   @property float volume;

是否允許更改速率

復制代碼 代碼如下:
@property BOOL enableRate;

播放速率(1是正常速率,0.5是一般速率,2是雙倍速率)

復制代碼 代碼如下:
  @property float rate;

有多少個聲道

復制代碼 代碼如下:
 @property(readonly) NSUInteger numberOfChannels;

 

2.播放多個音樂文件

說明:如果要播放多個音樂文件,那么最傻瓜的做法是,創建多個全局的播放器去播放對應的音樂文件,但是這種方法無法適用于需要播放的文件數量巨大的情況。

  另外一種做法是:自己封裝一個播放音樂文件的工具類。
 
封裝工具類的實現步驟:
  新建一個類,繼承自NSObject類。提供三個對外的接口:

201613194220271.png (515×119)

分別是:
播放音樂(參數:文件名,返回值:BOOL)
暫停音樂(參數:文件名)
停止音樂(參數:文件名)
該工具類中的代碼設計如下:
YYAudioTool.h文件

復制代碼 代碼如下:

//
//  YYAudioTool.h
//  17-多個音樂文件的播放
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface YYAudioTool : NSObject
/**
 *播放音樂文件
 */
+(BOOL)playMusic:(NSString *)filename;
/**
 *暫停播放
 */
+(void)pauseMusic:(NSString *)filename;
/**
 *播放音樂文件
 */
+(void)stopMusic:(NSString *)filename;
@end


YYAudioTool.m文件
復制代碼 代碼如下:

//
//  YYAudioTool.m
//  17-多個音樂文件的播放
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYAudioTool.h"

@implementation YYAudioTool
/**
 *存放所有的音樂播放器
 */
static NSMutableDictionary *_musices;
+(NSMutableDictionary *)musices
{
    if (_musices==nil) {
        _musices=[NSMutableDictionary dictionary];
    }
    return _musices;
}

/**
 *播放音樂
 */
+(BOOL)playMusic:(NSString *)filename
{
    if (!filename) return NO;//如果沒有傳入文件名,那么直接返回
    //1.取出對應的播放器
    AVAudioPlayer *player=[self musices][filename];
   
    //2.如果播放器沒有創建,那么就進行初始化
    if (!player) {
        //2.1音頻文件的URL
        NSURL *url=[[NSBundle mainBundle]URLForResource:filename withExtension:nil];
        if (!url) return NO;//如果url為空,那么直接返回
       
        //2.2創建播放器
        player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
       
        //2.3緩沖
        if (![player prepareToPlay]) return NO;//如果緩沖失敗,那么就直接返回
       
        //2.4存入字典
        [self musices][filename]=player;
    }
   
    //3.播放
    if (![player isPlaying]) {
        //如果當前沒處于播放狀態,那么就播放
        return [player play];
    }

    return YES;//正在播放,那么就返回YES
}

+(void)pauseMusic:(NSString *)filename
{
    if (!filename) return;//如果沒有傳入文件名,那么就直接返回
   
    //1.取出對應的播放器
    AVAudioPlayer *player=[self musices][filename];
   
    //2.暫停
    [player pause];//如果palyer為空,那相當于[nil pause],因此這里可以不用做處理

}

+(void)stopMusic:(NSString *)filename
{
    if (!filename) return;//如果沒有傳入文件名,那么就直接返回
   
    //1.取出對應的播放器
    AVAudioPlayer *player=[self musices][filename];
   
    //2.停止
    [player stop];
   
    //3.將播放器從字典中移除
    [[self musices] removeObjectForKey:filename];
}
@end


測試程序:

在storyboard中拖拽控件,并進行連線,以做控制。

201613194244919.png (317×476)

導入可供播放的音樂素材。

測試程序的代碼設計如下:

復制代碼 代碼如下:

//
//  YYViewController.m
//  17-多個音樂文件的播放
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYViewController.h"
#import "YYAudioTool.h"

@interface YYViewController ()
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
- (IBAction)next;

//用一個數組來保存所有的音樂文件
@property(nonatomic,strong)NSArray *songs;
//用一個int型的屬性來記錄當前的索引
@property(nonatomic,assign)int currentIndex;
@end


復制代碼 代碼如下:

@implementation YYViewController
#pragma mark-懶加載
-(NSArray *)songs
{
    if (_songs==nil) {
        self.songs=@[@"235319.mp3",@"309769.mp3",@"120125029.mp3"];
    }
    return _songs;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (IBAction)play {
    //開始播放/繼續播放
    [YYAudioTool playMusic:self.songs[self.currentIndex]];
}

- (IBAction)pause {
    //暫停播放
    [YYAudioTool pauseMusic:self.songs[self.currentIndex]];
}

- (IBAction)stop {
    //停止播放
    [YYAudioTool stopMusic:self.songs[self.currentIndex]];
}

//播放下一首
- (IBAction)next {
    //1.先停止當前播放
    [self stop];
   
    //2.設置當前索引+1
    self.currentIndex++;
    if (self.currentIndex>=self.songs.count) {
        self.currentIndex=0;
    }
   
    //3.播放音樂
    [self play];
}
@end


二、對工具類進行改造,讓其兼能播放音效文件

說明:

  音效只有創建、播放和銷毀(停止)三個操作,因為音效一般都很短,因此沒有暫停的方法。

201613194305835.png (734×72)

把對音效文件的播放加入到工具類中,實現的代碼如下:

YYAudioTool.h文件

復制代碼 代碼如下:

//
//  YYAudioTool.h
//  17-多個音樂文件的播放
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
@interface YYAudioTool : NSObject
/**
 *播放音樂文件
 */
+(BOOL)playMusic:(NSString *)filename;
/**
 *暫停播放
 */
+(void)pauseMusic:(NSString *)filename;
/**
 *播放音樂文件
 */
+(void)stopMusic:(NSString *)filename;

/**
 *播放音效文件
 */
+(void)playSound:(NSString *)filename;
/**
 *銷毀音效
 */
+(void)disposeSound:(NSString *)filename;
@end

YYAudioTool.m文件

//
//  YYAudioTool.m
//  17-多個音樂文件的播放
//
//  Created by apple on 14-8-9.
//  Copyright (c) 2014年 yangyong. All rights reserved.
//

#import "YYAudioTool.h"

@implementation YYAudioTool
/**
 *存放所有的音樂播放器
 */
static NSMutableDictionary *_musicPlayers;
+(NSMutableDictionary *)musicPlayers
{
    if (_musicPlayers==nil) {
        _musicPlayers=[NSMutableDictionary dictionary];
    }
    return _musicPlayers;
}

/**
 *存放所有的音效ID
 */
static NSMutableDictionary *_soundIDs;
+(NSMutableDictionary *)soundIDs
{
    if (_soundIDs==nil) {
        _soundIDs=[NSMutableDictionary dictionary];
    }
    return _soundIDs;
}


/**
 *播放音樂
 */
+(BOOL)playMusic:(NSString *)filename
{
    if (!filename) return NO;//如果沒有傳入文件名,那么直接返回
    //1.取出對應的播放器
    AVAudioPlayer *player=[self musicPlayers][filename];
   
    //2.如果播放器沒有創建,那么就進行初始化
    if (!player) {
        //2.1音頻文件的URL
        NSURL *url=[[NSBundle mainBundle]URLForResource:filename withExtension:nil];
        if (!url) return NO;//如果url為空,那么直接返回
       
        //2.2創建播放器
        player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
       
        //2.3緩沖
        if (![player prepareToPlay]) return NO;//如果緩沖失敗,那么就直接返回
       
        //2.4存入字典
        [self musicPlayers][filename]=player;
    }
   
    //3.播放
    if (![player isPlaying]) {
        //如果當前沒處于播放狀態,那么就播放
        return [player play];
    }

    return YES;//正在播放,那么就返回YES
}

+(void)pauseMusic:(NSString *)filename
{
    if (!filename) return;//如果沒有傳入文件名,那么就直接返回
   
    //1.取出對應的播放器
    AVAudioPlayer *player=[self musicPlayers][filename];
   
    //2.暫停
    [player pause];//如果palyer為空,那相當于[nil pause],因此這里可以不用做處理

}

+(void)stopMusic:(NSString *)filename
{
    if (!filename) return;//如果沒有傳入文件名,那么就直接返回
   
    //1.取出對應的播放器
    AVAudioPlayer *player=[self musicPlayers][filename];
   
    //2.停止
    [player stop];
   
    //3.將播放器從字典中移除
    [[self musicPlayers] removeObjectForKey:filename];
}

//播放音效
+(void)playSound:(NSString *)filename
{
    if (!filename) return;
    //1.取出對應的音效
    SystemSoundID soundID=[[self soundIDs][filename] unsignedIntegerValue];
   
    //2.播放音效
    //2.1如果音效ID不存在,那么就創建
    if (!soundID) {
       
        //音效文件的URL
        NSURL *url=[[NSBundle mainBundle]URLForResource:filename withExtension:nil];
        if (!url) return;//如果URL不存在,那么就直接返回
       
        OSStatus status = AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
        NSLog(@"%ld",status);
        //存入到字典中
        [self soundIDs][filename]=@(soundID);
    }
   
    //2.2有音效ID后,播放音效
    AudioServicesPlaySystemSound(soundID);
}

//銷毀音效
+(void)disposeSound:(NSString *)filename
{
    //如果傳入的文件名為空,那么就直接返回
    if (!filename) return;
   
    //1.取出對應的音效
    SystemSoundID soundID=[[self soundIDs][filename] unsignedIntegerValue];
   
    //2.銷毀
    if (soundID) {
        AudioServicesDisposeSystemSoundID(soundID);
       
        //2.1銷毀后,從字典中移除
        [[self soundIDs]removeObjectForKey:filename];
    }
}
@end


代碼測試:

201613194330371.png (476×110)

代碼說明:

201613194347340.png (686×61)

打印的值為0,播放成功(因為函數是C++中的)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
69av成年福利视频| 欧美壮男野外gaytube| 日本一区二区在线免费播放| 亚洲视频一区二区三区| 国产亚洲精品久久久久动| 国产精品黄页免费高清在线观看| 中文字幕亚洲自拍| 久久九九精品99国产精品| 成人久久久久久久| 精品激情国产视频| 国产三级精品网站| 亚洲第一福利在线观看| 国产精品视频区| 97久久伊人激情网| 久久精品中文字幕免费mv| 日本亚洲欧美成人| 日韩www在线| 久久久精品亚洲| 成人性生交大片免费看视频直播| 最近2019中文免费高清视频观看www99| 色狠狠久久aa北条麻妃| 亚洲女人天堂网| 久久久女女女女999久久| 亚洲精品电影网| 亚洲精品成a人在线观看| 亚洲欧洲成视频免费观看| 亚洲天堂2020| 国产精品毛片a∨一区二区三区|国| 51精品国产黑色丝袜高跟鞋| 97在线视频免费看| 欧美黄色www| 欧美激情亚洲一区| 亚洲欧美日韩中文在线| 国内精品久久久久影院 日本资源| 国产精品美女在线观看| 亚洲综合第一页| 7m精品福利视频导航| 精品偷拍各种wc美女嘘嘘| 久久五月情影视| 亚洲乱码一区二区| 午夜精品久久久久久久男人的天堂| 亚洲欧美日韩天堂一区二区| 中文日韩在线视频| 国产精品视频一区二区三区四| 亚洲欧美www| 欧美片一区二区三区| 亚洲欧洲高清在线| 久久久久久久91| 综合久久五月天| 亚洲国产精品人久久电影| 欧美午夜视频在线观看| 欧洲亚洲免费在线| 欧美最猛性xxxxx亚洲精品| 午夜欧美大片免费观看| 欧美一区亚洲一区| 亚洲人午夜色婷婷| xxx成人少妇69| 久久精品在线视频| 91中文在线观看| 国产精品永久在线| 欧美日韩亚洲国产一区| 亚洲三级 欧美三级| 亚洲在线视频福利| 91国内免费在线视频| 亚洲欧美精品一区二区| 亚洲精品国产福利| 国产精品久久999| 亚洲第一精品久久忘忧草社区| 久久精品国产2020观看福利| 亚洲精品福利视频| 精品久久久国产精品999| 精品无人国产偷自产在线| 欧美一级大片在线免费观看| 久久久久一本一区二区青青蜜月| 亚洲欧美一区二区三区情侣bbw| 精品国产一区二区三区久久久| 在线日韩欧美视频| 中文字幕在线看视频国产欧美在线看完整| 国产精品啪视频| 色综合久久天天综线观看| 亚洲成av人影院在线观看| 精品美女久久久久久免费| 午夜精品一区二区三区在线播放| 欧美黑人狂野猛交老妇| 久久大大胆人体| 国产一区二区黑人欧美xxxx| 欧美夜福利tv在线| 91精品国产九九九久久久亚洲| 2025国产精品视频| 亚洲男人的天堂网站| 久久久久日韩精品久久久男男| 成人久久一区二区三区| 亚洲免费一在线| 欧美日本高清一区| 日韩免费黄色av| 91精品视频专区| 欧美视频免费在线观看| 亚洲女人天堂网| 亚洲一区二区三区在线免费观看| 国产精品久久久久久久天堂| 97在线视频免费播放| 欧美激情第1页| 亚洲综合自拍一区| 国产精品久久久久久久午夜| 国产高清视频一区三区| 精品露脸国产偷人在视频| 亚洲有声小说3d| 97久久久久久| 国产精品一区二区电影| 91综合免费在线| 亚洲免费视频网站| 国语自产精品视频在免费| 日韩精品在线观看一区| 亚洲欧美日韩综合| 韩国日本不卡在线| xvideos亚洲人网站| 日韩av大片在线| 国产精品自产拍在线观看中文| 川上优av一区二区线观看| 亚洲天堂2020| 亚洲高清色综合| 91久久嫩草影院一区二区| 欧美成人亚洲成人日韩成人| 亚洲精品一区二三区不卡| 欧美色播在线播放| 亚洲永久免费观看| 国产精品久在线观看| 国外视频精品毛片| 国产一区二中文字幕在线看| 性欧美激情精品| 欧美美最猛性xxxxxx| 亚洲福利视频网站| 尤物精品国产第一福利三区| 亚洲午夜精品视频| 国产一区二中文字幕在线看| 精品视频在线观看日韩| 国产精品18久久久久久首页狼| 91av在线精品| 人人做人人澡人人爽欧美| 欧美精品久久久久| 亚洲女在线观看| 欧美成人午夜免费视在线看片| 欧美老女人性视频| 亚洲自拍中文字幕| 色综合视频一区中文字幕| 精品亚洲一区二区| 欧美午夜激情在线| 国产日韩欧美91| 精品一区二区三区三区| 538国产精品一区二区在线| 91欧美激情另类亚洲| 黄色成人在线播放| 久久久精品欧美| 在线播放日韩欧美| 成人黄色影片在线| 美女黄色丝袜一区| 精品自拍视频在线观看| 国产人妖伪娘一区91| 亚洲精品电影在线观看| 深夜福利国产精品| 91午夜在线播放| 久久久999国产精品| 欧美黑人xxxx| www.久久久久久.com|