仅当AVAudioPlayer具有来自AVAudioRecorder的值时播放录制的音频

时间:2018-04-29 23:42:57

标签: ios swift audio avaudioplayer

如果没有录制音频,我想尝试确保按钮被禁用,以便应用程序不会因AVAudioPlayer为零而崩溃。

var soundPlayer1 = AVAudioPlayer()

这是我声明和初始化音频播放器的方式。

在viewDidLoad()函数下,我想要一个条件,当我将内容记录到AVAudioRecorder并将其设置为AVAudioPlayer时,我的条件将能够检查并启用播放按钮(如果没有记录,则播放按钮将被禁用)。

我已经尝试了多个与AVAudioPlayer和AVAudioRecorder相关联的内置函数,以查看录制前后哪些值保持不变但它们对我没有帮助(通过在录制前后不更改)或生成线程1:大概是EXC_BAD_ACCESS因为AVAudioPlayer尚未初始化为任何音频。

非常感谢任何帮助。谢谢!

编辑1

抱歉,忘了密码!

import UIKit
import AVFoundation

var url : NSURL!
var screenCounter = 0

var soundPlayer1 = AVAudioPlayer()

class Screen1: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {


@IBOutlet weak var recordBtn: UIButton!
@IBOutlet weak var playBtn: UIButton!
var soundRecorder : AVAudioRecorder!
var fileName = "audioFile0.aac"

override open func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


override open func viewDidLoad() {
    super.viewDidLoad()
    if (screenCounter == 0){
        setupRecorder()
        playBtn.isEnabled = false
    }
    screenCounter += 1
}



func setupRecorder(){
    let recordSettings = [ AVFormatIDKey : kAudioFormatMPEG4AAC
        , AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue, AVEncoderBitRateKey : 320000, AVNumberOfChannelsKey : 2, AVSampleRateKey : 44100.0 ] as [String : Any]
    let _ : NSError?
    let audioSession = AVAudioSession.sharedInstance()
    do{
        try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    }catch{
        print(error)
    }
    let url1 = getFileURL()
    do{
        soundRecorder = try AVAudioRecorder(url: url1 as URL, settings : recordSettings)
    }catch{
        print("Something went wrong")
    }
    soundRecorder.delegate = self
    soundRecorder.prepareToRecord()
}

func getCacheDirectory() -> URL{
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
     return paths[0]
}

func getFileURL() -> NSURL{
    let pathURL = getCacheDirectory().appendingPathComponent(fileName)
    let pathString = pathURL.path
    let filePath = NSURL(fileURLWithPath : pathString)
    return filePath
}


@IBAction func record(_ sender: UIButton) {
    if sender.titleLabel?.text == "Record"{
        setupRecorder()
        soundRecorder.deleteRecording()
        soundRecorder.record()
        sender.setTitle("Stop", for : .normal)
        playBtn.isEnabled = false
    }else{
        soundRecorder.stop()
        sender.setTitle("Record", for : .normal)
        playBtn.isEnabled = false
    }
}
@IBAction func playSound(_ sender: UIButton) {
    if sender.titleLabel?.text == "Play"{
            recordBtn.isEnabled = false
            sender.setTitle("Stop", for : .normal)
            preparePlayer()
            soundPlayer1.play()
    }else{
        soundPlayer1.stop()
        sender.setTitle("Play", for : .normal)
    }
}

func preparePlayer(){
    let _ : NSError?
    let url = getFileURL()
    do{
        soundPlayer1 = try AVAudioPlayer(contentsOf : url as URL)
    }catch{
        print(error)
    }
    soundPlayer1.delegate = self
    soundPlayer1.prepareToPlay()
    soundPlayer1.volume = 1.0 //Adjust volume here
}


open func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    playBtn.isEnabled = true
}
open func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    recordBtn.isEnabled = true
    playBtn.setTitle("Play", for : .normal)
}

}

0 个答案:

没有答案