【问题标题】:AVAudioEngine Multichannel mappingAVAudioEngine 多声道映射
【发布时间】:2020-09-16 14:27:46
【问题描述】:

我已将 objc 代码转换为 swift:https://forums.developer.apple.com/thread/15416 我的音频文件将在我的 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】:

    事实证明,除了 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
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多