录音机:默认情况下播放扬声器

时间:2018-08-13 00:36:19

标签: xcode playback voice-recording speaker swift4.2

我创建了一个可以通过听筒播放的录音机;但是,我想按扬声器播放。我添加了以下内容(Swift 4):

let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
    } catch let error as NSError {
        print("Audio Session error: \(error.localizedDescription)")
    }

初始化应用程序时,我可以通过扬声器播放以前的录音;但是,一旦我录制了新的语音备忘录,播放就会回到听筒。我已经查看了解决方案,但它们都引用了setCategory,它在Swift 4中引发了错误。

有人知道如何将录制的回放默认设置为扬声器吗?

这是我的全部视图控制器:

import UIKit
import AVFoundation

class ViewController2: UIViewController, AVAudioRecorderDelegate, UITableViewDelegate, UITableViewDataSource {


// Setting up Table View
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return numberOfRecords
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = String(indexPath.row + 1)
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let path = getDirectory().appendingPathComponent("\(indexPath.row + 1).m4a")

    do {
        audioPlayer = try AVAudioPlayer(contentsOf: path)
        audioPlayer.play()
    }

    catch {

    }
}


var audioPlayer : AVAudioPlayer!
var recordingSession : AVAudioSession!
var audioRecorder : AVAudioRecorder!

var numberOfRecords : Int = 0

@IBOutlet weak var buttonLabel: UIButton!
@IBOutlet weak var myTableView: UITableView!

@IBAction func record(_ sender: Any) {
    // Check if we have an active recorder
    if audioRecorder == nil {
        numberOfRecords += 1
        let filename = getDirectory().appendingPathComponent("\(numberOfRecords).m4a")

        let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                        AVSampleRateKey: 12000,
                        AVNumberOfChannelsKey: 1,
                        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue]

        // Start audio recording
        do {
            audioRecorder = try AVAudioRecorder(url: filename, settings: settings)
            audioRecorder.delegate = self
            audioRecorder.record()

            //buttonLabel.setTitle("Stop", for: .normal)
        }

        catch {
            displayAlert(title: "Oops!", message: "Recording failed")
        }
    }
    else {
        // Stop audio recording
        audioRecorder.stop()
        audioRecorder = nil

        UserDefaults.standard.set(numberOfRecords, forKey: "myNumber")
        myTableView.reloadData()

        //buttonLabel.setTitle("Start", for: .normal)
    }

}

override func viewDidLoad() {
    super.viewDidLoad()

    // Setting up Recording session
    recordingSession = AVAudioSession.sharedInstance()

    if let number : Int = UserDefaults.standard.object(forKey: "myNumber") as? Int {
        numberOfRecords = number
    }

    AVAudioSession.sharedInstance().requestRecordPermission { (hasPermission) in
        if hasPermission {
            print ("Accepted")
        }
    }

    // Play speaker instead of earpiece
    let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)

    } catch let error as NSError {
        print("Audio Session error: \(error.localizedDescription)")
    }


    // Gesture recognizers

    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeAction(swipe:)))
    leftSwipe.direction = UISwipeGestureRecognizer.Direction.left
    self.view.addGestureRecognizer(leftSwipe)

    let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeAction(swipe:)))
    rightSwipe.direction = UISwipeGestureRecognizer.Direction.right
    self.view.addGestureRecognizer(rightSwipe)

    let upSwipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeAction(swipe:)))
    upSwipe.direction = UISwipeGestureRecognizer.Direction.up
    self.view.addGestureRecognizer(upSwipe)

}

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


// Function that gets path to directory
func getDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = paths[0]
    return documentDirectory
}

// Function that displays an alert
func displayAlert(title: String, message: String) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "dismiss", style: .default, handler: nil))
    present(alert, animated: true, completion: nil)
}

1 个答案:

答案 0 :(得分:0)

do catch语句必须位于if和else中,并且不在viewDidLoad()部分中。

var a = document.getElementsByTagName("input");
for(var i = 0; i < a.length; i++) {
    if(inputs[i].type == "checkbox") {
        if (inputs[i].checked) {
            bool=true;
        }
    }  
}