iOS/Swift - AVFoundation(二)音頻的播放和錄制

使用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來播放,使用stoppause來停止播放。但是這兩者是有區別的。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.01.0,默認是0.0
還有一個很有趣的就是播放的速率:rate范圍是從0.52.0之間,但是你在設置rate的時候必須先調用enableRate,允許修改速率。
我們可以使用numberOfLoops來實現音頻的無縫循環。設置一個大于0n值,就會播放n次。0只播放一次,-1負數則表示無限循環播放。
之前在牛班工作的時候,我們播放很多個軌道。下面是之前的設計圖,我們現在就實現下面類似的功能。
能同時播放很多個音頻,能整體設置它們的速率和聲音大小。

唱歌錄制調音.jpg

先聲明兩個重要的屬性

// 是否在播放狀態
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的時候把palyercurrentTime設置為0.0f,播放器會回到音頻文件的原點。
這里設置他的播放聲音的大小就不寫了,很簡單的。么么噠。

使用AVAudioRecorder音頻錄制

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容