2017-05-27 92 views
1

我使用了許多用於錄製聲音的代碼,但其中大部分代碼都不在swift3中,而且它們不適用於我的應用程序。錄製和播放獨立課堂中的聲音(Swift3)

This代碼的作品,但我想創建一個單獨的類從視頻控制器錄製播放的聲音。另外提到的Github代碼是複雜的,我正在尋找一個簡化的代碼。

更新:

記錄後,當我檢查記錄文件是否存在,該文件不存在,它的appDelegate引發EXC_BAD_ACCESS錯誤。

怎麼了?

任何建議,將不勝感激。

回答

2

試圖記錄由wirting線

let isRec = AudioManager.shared.record(fileName: "rec") 

音頻如果ISREC返回true,則錄製正在發生別的不行。 要完成錄製使用:let recordedURL = AudioManager.shared.finishRecording()

播放錄製的文件發送上述網址可setupUpPlayer()功能管理器類

不要忘了使用擴展的代碼片段給下面的代碼片段這是AVAudioRecorderAVAudioPlayer

委託功能
import Foundation 

import AVFoundation 

class AudioManager: NSObject { 

static let shared = AudioManager() 

var recordingSession: AVAudioSession? 
var recorder: AVAudioRecorder? 
var meterTimer: Timer? 
var recorderApc0: Float = 0 
var recorderPeak0: Float = 0 
//PLayer 
var player: AVAudioPlayer? 
var savedFileURL: URL? 

func setup() { 
    recordingSession = AVAudioSession.sharedInstance() 
    do { 
     try recordingSession?.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker) 
     try recordingSession?.setActive(true) 
     recordingSession?.requestRecordPermission({ (allowed) in 
      if allowed { 
       print("Mic Authorised") 
      } else { 
       print("Mic not Authorised") 
      } 
     }) 
    } catch { 
     print("Failed to set Category", error.localizedDescription) 
    } 
} 

func record(fileName: String) -> Bool { 
    setup() 
    let url = getUserPath().appendingPathComponent(fileName + ".m4a") 
    let audioURL = URL.init(fileURLWithPath: url.path) 
    let recordSettings: [String: Any] = [AVFormatIDKey: kAudioFormatMPEG4AAC, 
             AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue, 
             AVNumberOfChannelsKey: 2, 
             AVSampleRateKey: 44100.0] 
    do { 
     recorder = try AVAudioRecorder.init(url: audioURL, settings: recordSettings) 
     recorder?.delegate = self 
     recorder?.isMeteringEnabled = true 
     recorder?.prepareToRecord() 
     recorder?.record() 
     self.meterTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { (timer: Timer) in 
      //Update Recording Meter Values so we can track voice loudness 
      if let recorder = self.recorder { 
       recorder.updateMeters() 
       self.recorderApc0 = recorder.averagePower(forChannel: 0) 
       self.recorderPeak0 = recorder.peakPower(forChannel: 0) 
      } 
     }) 
     savedFileURL = url 
     print("Recording") 
     return true 
    } catch { 
     print("Error Handling", error.localizedDescription) 
     return false 
    } 
} 

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

func finishRecording() -> String { 
    recorder?.stop() 
    self.meterTimer?.invalidate() 
    var fileURL: String? 
    if let url: URL = recorder?.url { 
     fileURL = String(describing: url) 
    } 
    return /fileURL 
} 
//Player 
func setupPlayer(_ url: URL) { 
    do { 
     try player = AVAudioPlayer.init(contentsOf: url) 
    } catch { 
     print("Error1", error.localizedDescription) 
    } 
    player?.prepareToPlay() 
    player?.play() 
    player?.volume = 1.0 
    player?.delegate = self 
} 
} 

//MARK:- Audio Recorder Delegate 

    extension AudioManager: AVAudioRecorderDelegate { 

    func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) { 

     print("AudioManager Finish Recording") 

    } 
    func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) { 
     print("Encoding Error", /error?.localizedDescription) 
    } 

} 

//MARK:- Audio Player Delegates 

    extension AudioManager: AVAudioPlayerDelegate { 

     func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, 
    successfully flag: Bool) { 

      player.stop() 

      print("Finish Playing") 

     } 

     func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, 
    error: Error?) { 

      print(/error?.localizedDescription) 

     } 

    } 
+0

謝謝答案真的幫了我很多 –