具有2个以上通道的AVAssetWriterInput

时间:2018-04-07 00:31:21

标签: ios swift avfoundation avassetwriter avassetexportsession

有人知道如何使用超过2个频道的AVAssetWriterInput init吗?

我尝试初始化一个audioInput,然后以这种方式在AVAssetWriter上添加它:

let audioInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: audioOutputSettings)

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.

2 个答案:

答案 0 :(得分:1)

正如您在AVAssetWriterInput评论中找到的那样:

  

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

未提及的是频道数取决于您的格式ID,因此传递AudioChannelLayout不会使AAC支持除1或2个频道以外的任何内容。

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

以下代码创建了一个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)

答案 1 :(得分:0)

更改这两行:

channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_2_0
AVNumberOfChannelsKey : 2,

希望它对我的代码有帮助。