AVAudioRecorder 从不录音
Posted
技术标签:
【中文标题】AVAudioRecorder 从不录音【英文标题】:AVAudioRecorder never records 【发布时间】:2017-06-03 01:51:26 【问题描述】:我正在使用AVAudioRecorder
来录制人声。我的代码如下:
// Property of Class
var recorder:AVAudioRecorder?
func recordButtonTapped()
let audiosession = AVAudioSession.sharedInstance()
do
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setActive(true)
if audioSession.recordPermission() != .granted
audioSession.requestRecordPermission( (success) in
self.startRecording()
)
else
self.startRecording()
catch
print("Unable To Set Category")
func startRecording()
// libraryPathWith(media) just gets the path to the documents directory
// Like so: Documents/MediaLibrary/Audio/<mediaID>.<mediaExtension>
if let path = MMFileManager.libraryPathWith(media: self.media)
isRecording = true
do
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
recorder = try AVAudioRecorder(url: path, settings: settings)
recorder?.delegate = self
if recorder!.prepareToRecord()
recorder?.record()
catch
isRecording = false
func stopRecording()
self.recordingLabel.text = "Recording Complete"
self.recordingLabel.textColor = UIColor.white
if let rec = recorder
rec.stop()
recorder = nil
isRecording = false
AVAudioRecorderDelegate
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool)
print("RECORDED AUDIO SUCCESSFULLY \(flag)")
func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?)
print("AUDIO RECORDER ERROR \(error?.localizedDescription)")
在我对 AVAudioRecorder 调用 stop 之后,audioRecorderEncodeErrorDidOccur
函数永远不会被调用,但 audioRecorderDidFinishRecording
函数会调用,但 flag
始终是 false
。它打印出"RECORDED AUDIO SUCCESSFULLY false"
问题
当我使用上面的代码录制时,我确实将文件保存到我的文档目录中指定的位置。但是这个文件不是我可以播放的。它写入的是文本文件,而不是音频文件,因为我将扩展名指定为 .aac
。
为什么AVAudioRecorder
不录制音频?我如何让它这样做?
【问题讨论】:
【参考方案1】:我是这样做的,先导入
AV基金会
并将 AVAudioRecorderDelegate 添加到您的 ViewController:
class RecordViewController: UIViewController, AVAudioRecorderDelegate
然后创建 AVAudioRecorder 的全局实例:
var audioRecorder : AVAudioRecorder!
然后我创建了一个开始录制的录制按钮:
@IBAction func playButton(_ sender: Any)
let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let recordingName = "voiceRecording.wav"
let pathArray = [dirPath, recordingName]
let filePath = URL(string: pathArray.joined(separator: "/"))
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
try! audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
audioRecorder.record()
dirPath 查找将存储图像的目录。
recordingName将设置实际录制文件的名称
文件路径结合了最终位置的目录和recordingName
其余的几乎是不言自明的。
然后创建一个更简单的暂停按钮:
@IBAction func pauseButton(_ sender: Any)
audioRecorder.stop()
let audioSession = AVAudioSession.sharedInstance()
try! audioSession.setActive(false)
这应该可以解决您录制音频的方式。
【讨论】:
【参考方案2】:如果您已验证您的网址具有“aac”扩展名,那么我怀疑您只是忘记在录音机上调用 stop()。这会导致一个未最终确定的文件。
同时在 catch 块中打印您的错误。
do
try throwingFunc()
catch
print(error)
【讨论】:
【参考方案3】:问题在于stopRecording()
函数中的行。在对记录器stop()
的调用下方,我立即将AVAudioRecorder
实例分配给nil
。这会在完成创建真实.aac
文件的后处理之前解除分配并结束AVAudioRecorder
。
【讨论】:
以上是关于AVAudioRecorder 从不录音的主要内容,如果未能解决你的问题,请参考以下文章