Audio playback

-音頻播放

1.錄音功能實(shí)現(xiàn)

  • AVFoundation框架
    • 創(chuàng)建一個錄音對象
    • 設(shè)置保存錄音文件的位置(沙盒)
    • 準(zhǔn)備錄音
    • 開始錄音
    • 結(jié)束錄音
// 全局的錄音對象屬性
    var record: AVAudioRecorder?

    // 測試方法
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        // 開始錄音
        print("開始錄音")

        // 1. 先在沙盒里面創(chuàng)建一個文件路徑
        let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first!
        // 拼接文件的保存路徑
        let fullPath = path + "/test.caf"

        // 轉(zhuǎn)換為url
        let url = NSURL(string: fullPath)
        // 設(shè)置配置選項(xiàng)
        let configDic: [String: AnyObject] = [
            "a": ""   // 字典的配置選項(xiàng)
        ]

        // 創(chuàng)建錄音對象
        do {
            // 參數(shù)1: 錄音文件, 需要存放的路徑
            // 參數(shù)2: 錄音的配置選項(xiàng)
            record = try AVAudioRecorder(URL: url!, settings: configDic)
        }catch {
            print(error)
            return
        }

        // 準(zhǔn)備錄音(系統(tǒng)會給我們分配資源)
        record?.prepareToRecord()

        // 開始錄音
//        record?.record()

        // 從某個時間點(diǎn)開始錄音
//        record?.recordAtTime((record?.deviceCurrentTime)! + 2)

        // 從當(dāng)前時間點(diǎn), 開始錄音, 錄音多久
//        record?.recordForDuration(2)

        // 從哪個時間點(diǎn),開始錄音, 錄多久結(jié)束
        record?.recordAtTime((record?.deviceCurrentTime)! + 2, forDuration: 3)
    }

    // 觸摸結(jié)束的時候停止錄音
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

         print("結(jié)束錄音")

        // 結(jié)束錄音
//        record?.stop()

    }

2.音樂播放

  • 也是 AVFoundation框架
  • 實(shí)現(xiàn)步驟
    • 創(chuàng)建一個音頻會話(AVAudioSession)單例
    • 設(shè)置會話的類型浅浮,用于控制音頻播放的類型(后臺前臺等其他類型)--- setCategory
    • 設(shè)置好會話的類型之后,激活會話(setActive)
    • 之后是創(chuàng)建一個音頻播放器AVAudioPlayer
    • 加載音頻文件的url
    • 準(zhǔn)備播放
func  playBack() -> () {

        // 1. 獲取音頻會話(單例)
        let share = AVAudioSession.sharedInstance()

        // 2. 設(shè)置會話的類型(后臺前臺...)
        do {
            try share.setCategory(AVAudioSessionCategoryPlayback)
            // 3. 激活會話
            try share.setActive(true)
        }catch {
            print(error)
            return
        }
    }


    lazy var player: AVAudioPlayer? = {

        // 1. 創(chuàng)建一個播放器
        let player: AVAudioPlayer?

        // 得到文件路徑的url
        guard let url = NSBundle.mainBundle().URLForResource("簡單愛.mp3", withExtension: nil) else {
            return nil
        }
        do {
            // 雖然接收的參數(shù)是nsurl, 但是只能, 播放本地音樂, 遠(yuǎn)程, 不能播放
            // 如果想要播放多首音樂,必須創(chuàng)建多個播放器才可以
            player = try AVAudioPlayer(contentsOfURL: url)

        }catch {
            print(error)
            return nil
        }

        // 設(shè)置代理, 接收事件
        player?.delegate = self

        // 啟動倍速播放功能殊霞,一定要放在, 準(zhǔn)備播放之前
        player?.enableRate = true

        // 準(zhǔn)備播放
        player?.prepareToPlay()
        return player
    }()

    // 開始播放
    @IBAction func play(sender: AnyObject) {
        // 獲取音頻會話
        playBack()

        // 開始播放
        player?.play()
    }

    // 暫停
    @IBAction func pause(sender: AnyObject) {
        player?.pause()
    }

    // 停止
    @IBAction func stop(sender: AnyObject) {
        // 現(xiàn)將當(dāng)前的時間設(shè)置為0
        player?.currentTime = 0
        player?.stop()
    }

    // 快進(jìn)
    @IBAction func kuaijin(sender: AnyObject) {
        // 系統(tǒng)內(nèi)部已經(jīng)做過了容錯處理,
        // 不需要處理, 小于零, 或者大于, 音樂總時長, 這樣的問題
        player?.currentTime += 15

    }

    // 快退
    @IBAction func kuaiBack(sender: AnyObject) {
         player?.currentTime -= 15
    }

    // 倍速播放
    @IBAction func rate(sender: AnyObject) {
        player?.rate = 5.0
    }

    @IBAction func shengyin(sender: UISlider) {
        player?.volume = sender.value
    }
}

extension ViewController: AVAudioPlayerDelegate {
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
        print("播放完成")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末客情,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挺物,更是在濱河造成了極大的恐慌豪椿,老刑警劉巖别洪,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叨恨,死亡現(xiàn)場離奇詭異,居然都是意外死亡挖垛,警方通過查閱死者的電腦和手機(jī)痒钝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痢毒,“玉大人送矩,你說我怎么就攤上這事∧奶妫” “怎么了栋荸?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凭舶。 經(jīng)常有香客問我晌块,道長,這世上最難降的妖魔是什么帅霜? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任摸袁,我火速辦了婚禮,結(jié)果婚禮上义屏,老公的妹妹穿的比我還像新娘。我一直安慰自己蜂大,他們只是感情好闽铐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奶浦,像睡著了一般兄墅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澳叉,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天隙咸,我揣著相機(jī)與錄音,去河邊找鬼成洗。 笑死五督,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓶殃。 我是一名探鬼主播充包,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了基矮?” 一聲冷哼從身側(cè)響起淆储,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎家浇,沒想到半個月后本砰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钢悲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年点额,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬巫。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡咖楣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芦昔,到底是詐尸還是另有隱情诱贿,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布咕缎,位于F島的核電站珠十,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凭豪。R本人自食惡果不足惜焙蹭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫂伞。 院中可真熱鬧孔厉,春花似錦、人聲如沸帖努。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼余。三九已至污桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匙监,已是汗流浹背凡橱。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭姥,地道東北人稼钩。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像达罗,于是被迫代替她去往敵國和親变抽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容