前言
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?) { }