前言
NS_CLASS_AVAILABLE(10_7, 2_2) @interface AVAudioPlayer : NSObject
@available(iOS 2.2, *) public class AVAudioPlayer : NSObject
- 本地音乐播放:
- 添加库文件:AVFoundation.framework
- 包含头文件:#import <AVFoundation/AVFoundation.h>
1、本地音乐播放
-
Objective-C
// 添加库文件:AVFoundation.framework
// 包含头文件:#import <AVFoundation/AVFoundation.h>
// 声明音乐播放控件,必须声明为全局属性变量,否则可能不会播放,AVAudioPlayer 只能播放本地音乐
@property(nonatomic, retain)AVAudioPlayer *musicPlayer;
// 获取音乐文件路径
NSURL *musicUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"蓝莲花" ofType:@"mp3"]];
// 实例化音乐播放控件
musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicUrl error:nil];
// 准备(缓冲)播放
[musicPlayer prepareToPlay];
// 开始播放音乐
[musicPlayer play];
-
Swift
// 添加库文件:AVFoundation.framework
// 包含头文件:import AVFoundation
// 声明音乐播放控件,必须声明为全局属性变量,否则可能不会播放,AVAudioPlayer 只能播放本地音乐
var musicPlayer:AVAudioPlayer!
// 获取音乐文件路径
let musicUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("蓝莲花", ofType: "mp3")!)
// 实例化音乐播放控件
musicPlayer = try? AVAudioPlayer(contentsOfURL: musicUrl)
// 准备(缓冲)播放
musicPlayer.prepareToPlay()
// 开始播放音乐
musicPlayer.play()
2、本地音乐播放设置
-
Objective-C
// 设置代理,需遵守 <AVAudioPlayerDelegate> 协议
musicPlayer.delegate = self;
// 判断播放状态
BOOL isPlaying = musicPlayer.isPlaying;
// 获取音乐通道数
NSUInteger numberOfChannels = musicPlayer.numberOfChannels;
// 获取音乐时长
/*
获取音乐的长度,单位秒
*/
NSTimeInterval duration = musicPlayer.duration;
// 获取与输出设备相关联的当前播放进度
NSTimeInterval deviceCurrentTime = musicPlayer.deviceCurrentTime;
// 获取当前音乐文件的路径
/*
音乐文件播放控件由 url 创建,returns nil if object was not created with a URL
*/
NSURL *currentMusicUrl = musicPlayer.url;
// 获取当前音乐文件的数据
/*
音乐文件播放控件由 data 创建,returns nil if object was not created with a data object
*/
NSData *currentMusicData = musicPlayer.data;
// 设置声道
/*
-1.0:左声道, 0.0:左右声道(默认), 1.0:右声道
*/
musicPlayer.pan = 1.0;
// 设置音量
/*
音量范围是 0.0 ~ 1.0,默认为 1.0
*/
musicPlayer.volume = 0;
// 设置是否允许控制播发速度
/*
设置播放速度时必须设置此项为 YES,必须在 [musicPlayer prepareToPlay] 之前设置,默认为 NO
*/
musicPlayer.enableRate = YES;
// 设置播放速度
/*
enableRate 必须设置为 YES,1.0 is normal, 0.5 is half speed, 2.0 is double speed
*/
musicPlayer.rate = 1;
// 设置当前播放位置
/*
设置音乐从指定的时间处开始播放
*/
musicPlayer.currentTime = 30;
// 设置循环播放次数
/*
= 0:只播放一次(默认),> 0:播放设置的次数,< 0:循环播放
*/
musicPlayer.numberOfLoops = 1;
// 缓冲音乐
[musicPlayer prepareToPlay];
// 开始播放
[musicPlayer play];
// 定时播放
/*
在指定的时间播放音乐
*/
[musicPlayer playAtTime:[[NSDate dateWithTimeIntervalSinceNow:10] timeIntervalSince1970]];
// 暂停播放
[musicPlayer pause];
// 停止播放
[musicPlayer stop];
-
Swift
// 设置代理
/*
需遵守 AVAudioPlayerDelegate 协议
*/
musicPlayer.delegate = self
// 判断播放状态
let isPlaying:Bool = musicPlayer.playing
// 获取音乐通道数
let numberOfChannels:Int = musicPlayer.numberOfChannels
// 获取音乐时长
/*
获取音乐的长度,单位秒
*/
let duration:NSTimeInterval = musicPlayer.duration
// 获取与输出设备相关联的当前播放进度
let deviceCurrentTime:NSTimeInterval = musicPlayer.deviceCurrentTime
// 获取当前音乐文件的路径
/*
音乐文件播放控件由 url 创建,returns nil if object was not created with a URL
*/
let currentMusicUrl:NSURL = musicPlayer.url!
// 获取当前音乐文件的数据
/*
音乐文件播放控件由 data 创建,returns nil if object was not created with a data object
*/
let currentMusicData = musicPlayer.data
// 设置声道
/*
-1.0:左声道, 0.0:左右声道(默认), 1.0:右声道
*/
musicPlayer.pan = 1.0
// 设置音量
/*
音量范围是 0.0 ~ 1.0,默认为 1.0
*/
musicPlayer.volume = 0
// 设置是否允许控制播发速度
/*
设置播放速度是必须设置此项为 YES,必须在 [musicPlayer prepareToPlay] 之前设置,默认为 NO
*/
musicPlayer.enableRate = true
// 设置播放速度
/*
enableRate 必须设置为 YES,1.0 is normal, 0.5 is half speed, 2.0 is double speed
*/
musicPlayer.rate = 1
// 设置当前播放位置
/*
设置音乐从指定的时间处开始播放
*/
musicPlayer.currentTime = 30
// 设置循环播放次数
/*
= 0:只播放一次(默认),> 0:播放设置的次数,< 0:循环播放
*/
musicPlayer.numberOfLoops = 1
// 缓冲音乐
musicPlayer.prepareToPlay()
// 开始播放
musicPlayer.play()
// 定时播放
/*
在指定的时间播放音乐
*/
musicPlayer.playAtTime(NSDate(timeIntervalSinceNow: 10).timeIntervalSince1970)
// 暂停播放
musicPlayer.pause()
// 停止播放
musicPlayer.stop()
3、本地音乐文件解析
-
Objective-C
/*
注意观察 commonKey 和 value:
commonKey = title 歌曲名称
commonKey = artist 歌手名称
commonKey = albumName 专辑名称
commonKey = artwork 专辑图片
*/
NSString *titleString = nil;
NSString *artistString = nil;
NSString *albumNameString = nil;
UIImage *artworkImage = nil;
// 获取音乐文件路径
NSURL *musicUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"蓝莲花" ofType:@"mp3"]];
// 加载音乐文件
AVURLAsset *URLAsset = [AVURLAsset URLAssetWithURL:musicUrl options:nil];
// 解析音乐文件
/*
获取音乐文件中的信息,固定格式 org.id3
*/
NSArray *musicInfoArray = [URLAsset metadataForFormat:@"org.id3"];
for (AVMetadataItem *item in musicInfoArray) {
// 解析歌曲名称
if ([item.commonKey isEqualToString:@"title"]) {
titleString = (NSString *)item.value;
}
// 解析歌手名称
if ([item.commonKey isEqualToString:@"artist"]) {
artistString = (NSString *)item.value;
}
// 解析专辑名称
if ([item.commonKey isEqualToString:@"albumName"]) {
albumNameString = (NSString *)item.value;
}
// 解析专辑图片
if ([item.commonKey isEqualToString:@"artwork"]) {
// value 值为 NSData 时,直接取值
NSData *data = (NSData *)item.value;
artworkImage = [UIImage imageWithData:data];
}
}
// 显示解析值
musicInfoLabel.text = [NSString stringWithFormat:@"歌曲名称: %@\n歌手名称: %@\n专辑名称: %@",
titleString, artistString, albumNameString];
musicInfoImageView.image = artworkImage;
-
Swift
/*
注意观察 commonKey 和 value:
commonKey = title 歌曲名称
commonKey = artist 歌手名称
commonKey = albumName 专辑名称
commonKey = artwork 专辑图片
*/
var titleString:String!
var artistString:String!
var albumNameString:String!
var artworkImage:UIImage!
// 获取音乐文件路径
let musicUrl:NSURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("蓝莲花", ofType: "mp3")!)
// 加载音乐文件
let URLAsset = AVURLAsset(URL: musicUrl, options: nil)
// 解析音乐文件
/*
获取音乐文件中的信息,固定格式 org.id3
*/
let musicInfoArray = URLAsset.metadataForFormat("org.id3")
for item in musicInfoArray {
let itemCommonKey:String? = (item as! AVMutableMetadataItem).commonKey
// 解析歌曲名称
if itemCommonKey == "title" {
titleString = (item as! AVMutableMetadataItem).value as! String
}
// 解析歌手名称
if itemCommonKey == "artist" {
artistString = (item as! AVMutableMetadataItem).value as! String
}
// 解析专辑名称
if itemCommonKey == "albumName" {
albumNameString = (item as! AVMutableMetadataItem).value as! String
}
// 解析专辑图片
if itemCommonKey == "artwork" {
// value 值为 NSData 时,直接取值
let data = (item as! AVMutableMetadataItem).value as! NSData
artworkImage = UIImage(data: data)
}
}
// 显示解析值
musicInfoLabel.text = "歌曲名称: \(titleString)\n歌手名称: \(artistString)\n专辑名称: \(albumNameString)"
musicInfoImageView.image = artworkImage
4、AVAudioPlayerDelegate 协议方法
-
Objective-C
// 播放完成
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
}
// 播放失败
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
}
-
Swift
// 播放完成
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
}
// 播放失败
func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer, error: NSError?) {
}