天天看点

iOS音频播放的几种方式,打开后台模式的音乐播放、使用AVAudioPlayer播放音乐、播放指定的音频文件、注册音频文件

原文地址:https://www.zybuluo.com/kezhen/note/136614

一、使用AVAudioPlayer播放音乐

1. Background Modes

打开后台模式的音乐播放,或者在info.plist文件中添加

Required Background Modes

键,其值是

App plays audio or streams audio/video using AirPlay

iOS音频播放的几种方式,打开后台模式的音乐播放、使用AVAudioPlayer播放音乐、播放指定的音频文件、注册音频文件

2. 添加后台播放代码

  1. AVAudioSession *session = [AVAudioSession sharedInstance];
  2. [session setActive:YES error:nil];
  3. [session setCategory:AVAudioSessionCategoryPlayback error:nil];

3. 播放指定的音频文件

  1. // 1.获取要播放音频文件的URL
  2. NSURL *fileURL = [[NSBundle mainBundle]URLForResource:@"王力宏-流泪手心" withExtension:@".mp3"];
  3. // 2.创建 AVAudioPlayer 对象
  4. self.audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:fileURL error:nil];
  5. // 3.打印歌曲信息
  6. NSString *msg = [NSString stringWithFormat:@"音频文件声道数:%ld\n 音频文件持续时间:%g",self.audioPlayer.numberOfChannels,self.audioPlayer.duration];
  7. NSLog(@"%@",msg);
  8. // 4.设置循环播放
  9. self.audioPlayer.numberOfLoops = -1;
  10. self.audioPlayer.delegate = self;
  11. // 5.开始播放
  12. [self.audioplayer play];

二、使用System Sound Services播放音频

利用

System Sound Services

只能播放一些很小的提示或警告音频,它存在诸多限制,例如:声音长度不能超过30秒,不能控制进度,格式支持少等。

1. 注册音频文件

调用 

AudioServicesCreateSystemSoundID(CFURLRef inFileURL,SystemSoundID *outSystemSoundID)

 该函数的第一个参数代表音频文件的URL(可通过NSURL转换成CFURLRef),第二个参数代表注册音频文件的SystemSoundID。

2. 在音频播放完执行某些操作

调用

AudioServicesAddSystemSoundCompletion()

函数为制定SystemSoundID注册Callback函数。

3. 播放音频

调用

AudioServicePlaySystemSound

函数或者

AudioServicePlayAlertSound

(调用系统振动功能)。

4. 实战

  1. #import "FKViewController.h"
  2. static void completionCallback(SystemSoundID mySSID)
  3. {
  4. // Play again after sound play completion
  5. AudioServicesPlaySystemSound(mySSID);
  6. }
  7. @implementation ViewController
  8. // 音频文件的ID
  9. SystemSoundID ditaVoice;
  10. - (void)viewDidLoad
  11. {
  12. [super viewDidLoad];
  13. // 1. 定义要播放的音频文件的URL
  14. NSURL *voiceURL = [[NSBundle mainBundle]URLForResource:@"CleanDidFinish" withExtension:@"aiff"];
  15. // 2. 注册音频文件(第一个参数是音频文件的URL 第二个参数是音频文件的SystemSoundID)
  16. AudioServicesCreateSystemSoundID((__bridge CFURLRef)(voiceURL),&ditaVoice);
  17. // 3. 为crash播放完成绑定回调函数
  18. AudioServicesAddSystemSoundCompletion(ditaVoice,NULL,NULL,(void*)completionCallback,NULL);
  19. // 4. 播放 ditaVoice 注册的音频 并控制手机震动
  20. AudioServicesPlayAlertSound(ditaVoice);
  21. // AudioServicesPlaySystemSound(ditaVoice);
  22. // AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); // 控制手机振动
  23. }
使用

System Sound Services

需要

AudioToolbox

框架的支持,需要导入其主头文件:

#import<AudioToolbox/AudioToolbox.h>

三、使用

MPMusicPlayerController

控制本机音乐播放

对控制内置音乐库播放状态以及媒体信息的获取进行了封装,主要用于公司手环端蓝牙发送指令控制手机音乐播放以及在手环荧幕上显示歌曲名称。 

下面介绍一下用法: 

1. 包含我封装的头文件 

#import "BackgroundMusic.h"

2. 遵守协议:

achieveMusicInfoDelegate

3. 初始化: 
  1. @property (nonatomic,strong) BackgroundMusic *musicController;
  2. self.musicController = [[BackgroundMusic alloc]init];
  3. self.musicController.delegate = self; // 设置当前控制器为代理
4. 监听媒体曲目的改变:
  1. // 在 - (void)viewDidLoad 方法中调用以下方面
  2. [self.musicController monitorMediaItem];
  3. // 实现代理方法
  4. - (void)achieveachieveMusicInfo:(NSString *)songName andPlaybackStatus:(int)playStatus
  5. {
  6. if (1 == playStatus) {
  7. NSLog(@"正在播放音乐中...");
  8. }else if(0 == playStatus){
  9. NSLog(@"音乐暂停中...");
  10. }else{
  11. NSLog(@"播放状态未知...");
  12. }
  13. NSLog(@"歌曲信息:%@",songName);
  14. }
5. 播放控制
  1. // 控制音乐播放、暂停
  2. [self playOrPause];
  3. // 下一曲
  4. [self next];
  • 使用

    MPMusicPlayerController

    实例化对象来播放内置音乐库的媒体文件,有以下两种类方法来实例化对象:
  • MPMusicPlayerController *playController = [MPMusicPlayerController systemMusicPlayer];

    说明:播放内置媒体库项目取代用户目前播放状态(如果是用网易云音乐或QQQ音乐在播放歌曲)
  • MPMusicPlayerController *playController = [MPMusicPlayerController applicationMusicPlayer];

    说明:播放该应用内的歌曲,不影响本机自带音乐播放器的状态。

1. 判断有没有正在播放的媒体项目

  • 返回

    NSNotFound

    表示

    empty queue or an infinite playlist

  1. if ([self.playController indexOfNowPlayingItem] == NSNotFound) {
  2. return YES;
  3. }else{
  4. return NO;
  5. }

2. 创建媒体队列

  • 根据

    query

    创建媒体队列,创建成功后可以条用

    play

    来播放(默认播放第 index = 0 首曲目)
  1. /**
  2. * 设置媒体播放队列
  3. */
  4. - (void)createMediaQuery
  5. {
  6. // Creates a media query that matches music items and that groups and sorts collections by song name.
  7. self.query = [MPMediaQuery songsQuery];
  8. // Sets a music player’s playback queue based on a media query.
  9. [self.playController setQueueWithQuery:self.query];
  10. }

3. 获取正在播放的媒体曲目的信息

  • 可以由

    nowPlayingItem

    取得一系列正在播放的曲目的详细信息:
  1. @property (nonatomic, readonly) MPMediaEntityPersistentID
  2. @property (nonatomic, readonly) MPMediaType mediaType
  3. @property (nonatomic, readonly) NSString *title
  4. @property (nonatomic, readonly) NSString *albumTitle
  5. @property (nonatomic, readonly) MPMediaEntityPersistentID
  6. @property (nonatomic, readonly) NSString *artist
  7. @property (nonatomic, readonly) MPMediaEntityPersistentID
  8. @property (nonatomic, readonly) NSString *albumArtist
  9. ...
  1. /**
  2. * 获取媒体信息
  3. */
  4. - (void)obtainMusicInfo
  5. {
  6. MPMediaItem *currentItem = [self.playController nowPlayingItem];
  7. NSString *artist = [currentItem valueForProperty:MPMediaItemPropertyArtist];
  8. NSString *songName = [currentItem valueForProperty:MPMediaItemPropertyTitle];
  9. self.musicInfo = [NSString stringWithFormat:@"%@-%@",artist,songName];
  10. }

4. 监听播放媒体项目的通知

  • 监听此通知可以在播放曲目发生改变时(如:下一曲、上一曲)作出动作。
  1. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  2. [notificationCenter addObserver:self
  3. selector:@selector(updateMusicInfo)
  4. name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
  5. object:nil];
  6. [self.playController beginGeneratingPlaybackNotifications];

继续阅读