I have the following audio compression settings which fail with AVAssetWriter (mov container, HEVC codec, kAudioFormatMPEG4AAC format ID):
["AVSampleRateKey": 48000, "AVFormatIDKey": 1633772320, "AVNumberOfChannelsKey": 1, "AVEncoderBitRatePerChannelKey": 128000, "AVChannelLayoutKey": <02006500 00000000 00000000 00000000 00000000 00000000 00000000 00000000>]
Want to understand what is wrong? I can not reproduce it at my end (only reproducible on user's device with a particular microphone).
Here is the code line that fails:
if _assetWriter?.canApply(outputSettings: audioSettings!, forMediaType: AVMediaType.audio) ?? false {
} else {
/* Failure */
}
I need to know if it is mandatory to provide value for AVChannelLayoutKey in the dictionary with kAudioFormatMPEG4AAC? That could be a possible culprit.
Another set of settings that fail with lpcm codec for same hevc and mov is following:
["AVSampleRateKey": 48000, "AVChannelLayoutKey": <02006500 00000000 00000000 00000000 00000000 00000000 00000000 00000000>, "AVLinearPCMIsFloatKey": 0, "AVLinearPCMBitDepthKey": 16, "AVLinearPCMIsNonInterleaved": 0, "AVLinearPCMIsBigEndianKey": 0, "AVNumberOfChannelsKey": 0, "AVFormatIDKey": 1819304813]
EDIT: I fixed the issue by defining my own AudioChannelLayout as opposed to getting it from incoming CMSampleBuffers in the audio stream.
var channelLayout = AudioChannelLayout()
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_2_0
let numChannels = 2 //Stereo Audio
let currentChannelLayoutData = Data(bytes: &channelLayout, count: MemoryLayout.size(ofValue: channelLayout))
The code above seems to convert all kinds of audio streams to stereo. Not sure how mono to stereo (or 4 channel to stereo) works.
The
AudioChannelLayoutcontains the tagkAudioChannelLayoutTag_Stereo(0x02006500 in little endian memory order), which disagrees with theAVNumberOfChannelsKeycount of 1.Sounds like your user has a stereo microphone and you're expecting mono.
IIRC, in general, Apple audio channel conversion discards extra channels.
AVAssetWritermight add zero samples if you don't provide enough channels. Try it and let us know!