AVAudioEngine多通道映射

问题描述 投票:0回答:1

我已经把objc代码转换成了swift。https:/forums.developer.apple.comthread15416我的音频文件将在我的iPhone上播放,但当我插入音频接口时,我只是得到沉默。我的音频接口有4个输出,并将在其他应用程序中播放音频.以下是转换后的代码。

let audioSession = AVAudioSession.sharedInstance()

 // set the session category
 do
 {
     try audioSession.setCategory(.multiRoute, options: .mixWithOthers)
 }
 catch
 {
     print("unable to set category", error)
     return
 }

 // activate the audio session
 do
 {
     try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
 }
 catch
 {
     print("unable to set active", error)
     return
 }

 engine = AVAudioEngine()
 output = engine.outputNode
 mixer = engine.mainMixerNode

 player = AVAudioPlayerNode()

 engine.attach(player)

 guard let filePath: String = Bundle.main.path(forResource: "audio", ofType: "m4a") else { return }
 let fileURL: URL = URL(fileURLWithPath: filePath)
 let file = try! AVAudioFile(forReading: fileURL)

 let numberOfSourceChannels = file.processingFormat.channelCount
 print("numberOfSourceChannels: ", numberOfSourceChannels)

 let outputNumChannels = output.outputFormat(forBus: 0).channelCount
 print("outputNumChannels:" , outputNumChannels)
 var outputChannelMap = [
     0,
     1,
     -1,
     -1
 ]

 if let au = output.audioUnit
 {
     let propSize = UInt32(MemoryLayout.size(ofValue: outputChannelMap))
     print("propSize:", propSize)
     AudioUnitSetProperty(au, kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Global, 0, &outputChannelMap, propSize)
 }

 let channelLayout = AVAudioChannelLayout(layoutTag: kAudioChannelLayoutTag_DiscreteInOrder | UInt32(numberOfSourceChannels))

 let format = AVAudioFormat(streamDescription: file.processingFormat.streamDescription, channelLayout: channelLayout)


 engine.connect(player, to: mixer, format:format)
 engine.connect(mixer, to: output, format:format)

 player.scheduleFile(file, at: nil, completionHandler: nil)

 do
 {
    try engine.start()
 }
 catch
 {
     print("can't start", error)
     return
 }

 player.play()

这是运行它的输出。

/private/var/containers/Bundle/Application/FF7AA751-35A3-4B70-92C3-2D8356DE835A/AVAudioEngineTest.app/audio.m4a
numberOfSourceChannels:  2
outputNumChannels: 4
propSize: 8

我的最终目标是能够选择一个节点将在哪个输出上播放.我做错了什么?先谢谢你了。

ios swift avaudioengine
1个回答
0
投票

事实证明,除了outputChannelMap,其他代码都很好。我很困惑,它应该如何工作。下面是几个例子,它应该如何工作。

//normal output
var outputChannelMap = [
    0,
    1
]

// left audio to left output only
outputChannelMap = [
    0,
    -1
]

// both audio channels to left output
outputChannelMap = [
    0,
    0
]

// both audio channels to right output
outputChannelMap = [
    1,
    1
]

//left audio channel to right output only
outputChannelMap = [
    1,
    -1
]

// left out right, right our left
outputChannelMap = [
    1,
    0
]

// right audio to left output only
outputChannelMap = [
    -1,
    0
]

// right audio  to right output only
outputChannelMap = [
    -1,
    1
]
© www.soinside.com 2019 - 2024. All rights reserved.