使用AVAudioPlayer播放音頻
在AVFoundation
中使用AVAudioPlayer
來實現音頻的播放是非常的簡單的。
AVAudioPlayer
體統了從本地或內存中播放的方法,AVAudioPlayer
只要你不是需要很低的延遲和從網絡播放音頻,它都能勝任。
AVAudioPlayer
的創建必須包含內存的NSData或者本地文件的NSURL。在iOS中URL必須是程序沙盒之內的或者URL是在iPod庫中的。
下面是一則實例:
// 聲明一個AVAudioPlayer實例
var audioPlayer:AVAudioPlayer?
let fileUrl = Bundle.main.url(forResource: "HeiMaoYuNiu",
withExtension: "mp3",
subdirectory: nil,
localization: nil)
self.audioPlayer = try! AVAudioPlayer.init(contentsOf: fileUrl!)
if (self.audioPlayer != nil)
{
//注 一、準備播放
self.audioPlayer?.prepareToPlay()
}
注一、這里的prepareToPlay
,是取得音頻硬件并且加載到AudioQueue
的緩沖區中。
這個方法是可選的,在我們調用play
的時候也會隱性的激活,在創建時使用是為了在play
的時候降低聽到的聲音輸出之間的延時。
我們使用play
來播放,使用stop
和pause
來停止播放。但是這兩者是有區別的。stop
會使prepareToPlay時的設置撤銷掉,pause
是不會的。
我們點進去AVAudioPlayer
中看看他的其他的屬性和方法
修改播放器的音量使用open var volume: Float /* The volume for the sound. The nominal range is from 0.0 to 1.0. */
修改pan
值:如果允許使用立體聲播放聲音,那么我們是可以修改的,他的值實在-1.0
到1.0
,默認是0.0
。
還有一個很有趣的就是播放的速率:rate
范圍是從0.5
到2.0
之間,但是你在設置rate
的時候必須先調用enableRate
,允許修改速率。
我們可以使用numberOfLoops
來實現音頻的無縫循環。設置一個大于0
的n
值,就會播放n
次。0
只播放一次,-1
負數則表示無限循環播放。
之前在牛班工作的時候,我們播放很多個軌道。下面是之前的設計圖,我們現在就實現下面類似的功能。
能同時播放很多個音頻,能整體設置它們的速率和聲音大小。
先聲明兩個重要的屬性
// 是否在播放狀態
var playing:Bool = false
// 裝在很多的AVAudioPlayer
var players:[AVAudioPlayer] = []
// 創建播放器(這里只是簡單的Bundle文件,我也沒有當時的文件了。。。)
self.creatPalyer(fileUrls: [self.urlForFile(resourceName: "HeiMaoYuNiu", resourceExtension: "mp3"),
self.urlForFile(resourceName: "YueGuang", resourceExtension: "mp3"),
self.urlForFile(resourceName: "YanYuan", resourceExtension: "mp3")])
// 獲取文件地址
func urlForFile(resourceName:String,resourceExtension:String) -> URL
{
return Bundle.main.url(forResource: resourceName,
withExtension: resourceExtension,
subdirectory: nil,
localization: nil)!
}
// 創建播放器
func creatPalyer(fileUrls:[URL])
{
for fileUrl:URL in fileUrls
{
let player:AVAudioPlayer = try! AVAudioPlayer.init(contentsOf: fileUrl)
player.enableRate = true
player.prepareToPlay()
self.players.append(player)
}
}
上面就創建播放器完成了接下來是play
的方法
// 播放器播放
func playerPlay()
{
if self.playing == false
{
// 注二、減小延遲
let delayTime = self.players[0].deviceCurrentTime + 0.01
for player:AVAudioPlayer in self.players
{
player.play(atTime: delayTime)
}
self.playing = true
}
}
注二、我們使用的是AVAudioPlayer
,我們對很多的音頻進行播放,就需要進行適當的小延遲,這樣就會是播放器有一個參考的時間,通過playAtTime
的方法傳遞延時參考時間,便利進行播放,使得播放很緊密的同步。
在停止播放使用stop
的時候把palyer
的currentTime
設置為0.0f
,播放器會回到音頻文件的原點。
這里設置他的播放聲音的大小就不寫了,很簡單的。么么噠。