具有 2 个以上通道的 AVAssetWriterInput
AVAssetWriterInput with more than 2 channels
有人知道如何将 AVAssetWriterInput init 与 2 个以上的通道一起使用吗?
我正在尝试初始化 audioInput,以这种方式在 AVAssetWriter 之后添加它:
let audioInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: audioOutputSettings)
assetWriter.add(audioInput)
assetWriter.startWriting()
但是当我使用 audioOutputSettings 字典初始化 audioInput 时崩溃,其中包含大于 2 的通道键数。错误是:
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.
如您在 AVAssetWriterInput
评论中所见:
If AVNumberOfChannelsKey specifies a channel count greater than 2, the dictionary must also specify a value for 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)
更改这两行:
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_2_0
AVNumberOfChannelsKey : 2,
我希望它对我的代码有帮助。
有人知道如何将 AVAssetWriterInput init 与 2 个以上的通道一起使用吗?
我正在尝试初始化 audioInput,以这种方式在 AVAssetWriter 之后添加它:
let audioInput = AVAssetWriterInput(mediaType: AVMediaTypeAudio, outputSettings: audioOutputSettings)
assetWriter.add(audioInput)
assetWriter.startWriting()
但是当我使用 audioOutputSettings 字典初始化 audioInput 时崩溃,其中包含大于 2 的通道键数。错误是:
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.
如您在 AVAssetWriterInput
评论中所见:
If AVNumberOfChannelsKey specifies a channel count greater than 2, the dictionary must also specify a value for 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)
更改这两行:
channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_2_0
AVNumberOfChannelsKey : 2,
我希望它对我的代码有帮助。