iOS - AVAudioPlayer 音頻播放


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM