为什么 AVAudioRecorder 会创建损坏的文件?

问题描述 投票:0回答:1

我正在尝试使用 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

ios swift audio avfoundation avaudiorecorder
1个回答
0
投票

在启动 AVAudioRecorder 之前,首先注意文档

要在 iOS 或 tvOS 中录制音频,请将音频会话配置为使用

record
playAndRecord
类别。

您还需要

setActive
才能开始录制并请求录制权限。有关完整的端到端示例,请参阅Hacking With Swift

© www.soinside.com 2019 - 2024. All rights reserved.