我正在尝试使用 AVAudioRecorder 从设备的麦克风(在 iOS 下)进行录音。这些例子都很简单,我也遵循同样的方法。但我在尝试录制时收到错误消息,并且生成的 M4A 文件(录制几秒钟后)只有 552 字节长,并且无法加载。这是录音机的用法:
func startRecording()
{
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 22050,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do
{
recorder = try AVAudioRecorder(url: tempFileURL(), settings: settings)
recorder?.delegate = self
recorder!.record()
recording = true
}
catch
{
recording = false
recordingFinished(success: false)
}
}
在控制台中,出现问题的直接迹象如下所示。请注意每通道 0 位和不相关的 8K 采样率:
AudioQueueObject.cpp:1580 BuildConverter: AudioConverterNew returned -50
from: 0 ch, 8000 Hz, .... (0x00000000) 0 bits/channel, 0 bytes/packet, 0 frames/packet, 0 bytes/frame
to: 1 ch, 8000 Hz, Int16
随后尝试将文件加载到 AVAudioPlayer 中会导致:
MP4_BoxParser.cpp:1089 DataSource read failed
MP4AudioFile.cpp:4365 MP4Parser_PacketProvider->GetASBD() failed
AudioFileObject.cpp:105 OpenFromDataSource failed
AudioFileObject.cpp:80 Open failed
但这并不奇怪,因为它只有 500 多个字节,而且我们遇到了之前的错误。我在网络搜索中找不到对此的解释或对该初始错误消息的引用。
我也尝试过用
构建录音机 let audioFormat = AVAudioFormat.init(standardFormatWithSampleRate: 44100, channels: 1)
if audioFormat == nil
{
print("Audio format failed.")
}
else
{
do
{
recorder = try AVAudioRecorder(url: tempFileURL(), format: audioFormat!)
...
结果基本相同。在这种情况下,实例化错误消息如下,其中至少提到了请求的采样率:
AudioQueueObject.cpp:1580 BuildConverter: AudioConverterNew returned -50 from: 0 ch, 44100 Hz, .... (0x00000000) 0 bits/channel, 0 bytes/packet, 0 frames/packet, 0 bytes/frame to: 1 ch, 44100 Hz, Int32
在启动 AVAudioRecorder 之前,首先注意文档:
要在 iOS 或 tvOS 中录制音频,请将音频会话配置为使用
或record
类别。playAndRecord
您还需要
setActive
才能开始录制并请求录制权限。有关完整的端到端示例,请参阅Hacking With Swift。