我目前使用 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 值。有些崩溃,有些会写入文件但无法打开。
kAudioFileCAFType
不是 M4A
文件,请使用 kAudioFileM4AType
创建它。确保也调用 AudioFileClose()
,因为这应该写出标题。