超过 2 个通道的 AVAssetWriterInput

Ann*_*tas 4 avfoundation ios avassetwriter avassetexportsession swift

有人知道如何使用具有 2 个以上通道的 AVAssetWriterInput init 吗?

我正在尝试初始化一个音频输入,以这种方式在 AVAssetWriter 之后添加它:

let audioInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: audioOutputSettings)
Run Code Online (Sandbox Code Playgroud)

assetWriter.add(audioInput)

assetWriter.startWriting()

但是当我使用包含大于 2 的通道键数的 audioOutputSettings 字典初始化 audioInput 时它会崩溃。错误是:

Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ’*** -[AVAssetWriterInput initWithMediaType:outputSettings:sourceFormatHint:] 6 is not a valid channel count for Format ID ‘aac ’. Use kAudioFormatProperty_AvailableEncodeNumberChannels (<AudioToolbox/AudioFormat.h>) to enumerate available channel counts for a given format.

Rhy*_*man 5

正如您在AVAssetWriterInput评论中发现的那样:

如果 AVNumberOfChannelsKey 指定的通道数大于 2,则字典还必须为 AVChannelLayoutKey 指定一个值。

它没有提到的是频道数取决于您的格式 ID,因此传递 aAudioChannelLayout不会使 AAC 支持 1 或 2 个频道以外的任何内容。

支持 6 声道的格式包括 LPCM kAudioFormatLinearPCM,可能更有趣的kAudioFormatMPEG4AAC_HE是支持 2、4、6 和 8 声道音频的高效 AAC ( )。

以下代码创建了一个AVAssetWriterInput准备用于 6 通道 AAC HE 样本缓冲区的文件:

var channelLayout = AudioChannelLayout()
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_5_1_D

let audioOutputSettings: [String : Any] = [
    AVNumberOfChannelsKey: 6,

    AVFormatIDKey: kAudioFormatMPEG4AAC_HE,
    AVSampleRateKey: 44100,
    AVChannelLayoutKey: NSData(bytes: &channelLayout, length: MemoryLayout.size(ofValue: channelLayout)),
]
let audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: audioOutputSettings)
Run Code Online (Sandbox Code Playgroud)