无法将音频队列写入文件到m4a

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

我目前使用 AVAudioRecorder 在应用程序中录制音频。如果应用程序崩溃或录制时发生某些情况,正在录制的文件就会丢失,因此作为替代方案,我尝试使用音频队列服务来录制并写入文件。

我使用 LinearPCM 可以完美地工作,但无法使其与 m4a 编码一起工作。我正在尝试复制 AVRecorder 使用的文件格式。文件已写入但无法打开。我认为这与我的设置有关,但我不能确定。

我在 AVAudioRecorder 中使用的设置是;

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

这就是音频队列服务的作用;

        var recordingFormat = AudioStreamBasicDescription()
        memset(&recordingFormat, 0, MemoryLayout<AudioStreamBasicDescription>.size)
    
        recordingFormat.mFormatID = kAudioFormatLinearPCM
        recordingFormat.mChannelsPerFrame = 1
        recordingFormat.mSampleRate = 16000
        recordingFormat.mBitsPerChannel = 16
        recordingFormat.mBytesPerFrame = UInt32(1*MemoryLayout<Int16>.stride)
        recordingFormat.mFramesPerPacket = 1
        recordingFormat.mBytesPerPacket = UInt32(1*MemoryLayout<Int16>.stride)
        recordingFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked
        var propSize = UInt32(MemoryLayout<AudioStreamBasicDescription>.size)

然后使用;

写入文件
CheckError(AudioFileCreateWithURL(audioOutputFileName as CFURL,
                                          kAudioFileCAFType,
                                              &recordingFormat,
                                              AudioFileFlags.eraseFile,
                                              &self.outFile), "Write to file failed")

对于M4A,我尝试了很多组合,但文件再次被写出但无法打开

这是一个我认为可行但行不通的例子

        recordingFormat.mFormatID = kAudioFormatMPEG4AAC
        recordingFormat.mSampleRate = 44100
        recordingFormat.mChannelsPerFrame = 1
        recordingFormat.mBitsPerChannel = 0
        recordingFormat.mBytesPerFrame = 0
        recordingFormat.mBytesPerPacket = 0
        recordingFormat.mFramesPerPacket = 1024

并写出文件;

        CheckError(AudioFileCreateWithURL(audioOutputFileName as CFURL,
                                          kAudioFormatMPEG4AAC,
                                              &recordingFormat,
                                              AudioFileFlags.eraseFile,
                                              &self.outFile), "Write to file failed")

这些设置实际上会使应用程序崩溃。我尝试过使用各种 AudioFileTypeID 值。有些崩溃,有些会写入文件但无法打开。

swift avfoundation audiotoolbox
1个回答
0
投票

kAudioFileCAFType
不是
M4A
文件,请使用
kAudioFileM4AType
创建它。确保也调用
AudioFileClose()
,因为这应该写出标题。

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