HEJ.我想在 Swift中使用新的AVAudioEngine实现一个实时音频应用程序.有人有新经验吗?实时应用程序如何工作?

我的第一个想法是将(处理后的)输入数据存储到AVAudioPCMBuffer对象中,然后让它由AVAudioPlayerNode播放,就像在我的演示类中所看到的那样:

import AVFoundation

class AudioIO {
    var audioEngine: AVAudioEngine
    var audioInputNode : AVAudioInputNode
    var audioPlayerNode: AVAudioPlayerNode
    var audiomixerNode: AVAudiomixerNode
    var audioBuffer: AVAudioPCMBuffer

    init(){
        audioEngine = AVAudioEngine()
        audioPlayerNode = AVAudioPlayerNode()
        audiomixerNode = audioEngine.mainmixerNode

        let frameLength = UInt32(256)
        audioBuffer = AVAudioPCMBuffer(PCMFormat: audioPlayerNode.outputFormatForBus(0),frameCapacity: frameLength)
        audioBuffer.frameLength = frameLength

        audioInputNode = audioEngine.inputNode

        audioInputNode.installTapOnBus(0,bufferSize:frameLength,format: audioInputNode.outputFormatForBus(0),block: {(buffer,time) in
            let channels = UnsafeArray(start: buffer.floatChannelData,length: Int(buffer.format.channelCount))
            let floats = UnsafeArray(start: channels[0],length: Int(buffer.frameLength))

            for var i = 0; i < Int(self.audioBuffer.frameLength); i+=Int(self.audiomixerNode.outputFormatForBus(0).channelCount)
            {
                // doing my real time stuff
                self.audioBuffer.floatChannelData.memory[i] = floats[i];
            }
            })

        // setup audio engine
        audioEngine.attachNode(audioPlayerNode)
        audioEngine.connect(audioPlayerNode,to: audiomixerNode,format: audioPlayerNode.outputFormatForBus(0))
        audioEngine.startAndReturnError(nil)

        // play player and buffer
        audioPlayerNode.play()
        audioPlayerNode.scheduleBuffer(audioBuffer,atTime: nil,options: .Loops,completionHandler: nil)
    }
}

但这远离实时而不是很有效率.任何想法或经验?没关系,如果你喜欢Objective-C或Swift,我很感谢所有的注释,评论,解决方案等.

我一直在Objective-C和Swift上试验AVAudioEngine.在我的引擎的Objective-C版本中,所有的音频处理都是纯粹在C(通过缓存通过AVAudioPCMBuffer可用的原始C样本指针,并且仅使用C代码对数据进行操作)完成的.表现令人印象深刻.出于好奇,我把这个引擎移植到了斯威夫特.通过线性播放音频文件或通过FM合成产生音调的任务,性能相当好,但是一旦涉及阵列(例如,使用细粒度合成,音频部分以非线性方式播放和操作) ),有一个显着的性能命中.即使采用最佳优化,cpu使用率也比Objective-C/C++版本高30-40%.我是Swift的新手,所以也许还有其他的优化我很无知,但据我所知,C/C++仍然是实时音频的最佳选择.还看看惊人的音频引擎.我正在考虑这一点,以及直接使用旧的C API.

如果您需要处理现场音频,则AVAudioEngine可能不适合您.看到我对这个问题的回答:I want to call 20 times per second the installTapOnBus:bufferSize:format:block:

swift – AVAudioEngine实时音频的更多相关文章

  1. 播放结束后,将音量控制返回到iOS设备振铃器

    我有一个音频应用程序,它使用媒体播放音频会话类别来允许背景音频.初始化音频会话后,iOS设备上的硬件音量按钮将控制音频会话的音量.一旦音频播放停止,我想将手机振铃器的控制权返回到硬件音量按钮,但我尝试通过停用音频会话来做到这一点并不成功.以下是我初始化和激活音频会话的方法:以下是我尝试停用音频会话并将iOS设备的振铃控制权返回到硬件音量控件的方法:我知道至少有一个应用程序就是这样.有谁知道我可能做错了什么?

  2. ios – AVAssetReaderOutput copyNextSampleBuffer在设备上编码带有音频的视频时挂起

    在这个问题VideoEncodingusingAVAssetWriter–CRASHES中实现编码视频(带音频)的解决方案之后,我发现代码在iPhone模拟器中正常工作.不幸的是,某些视频在实际的iPhone5(和其他设备)上运行时无法对其音频进行编码.例如,从WWDC2011示例代码RosyWriter(https://developer.apple.com/library/IOS/sample

  3. ios – MPNowPlayingInfoCenter nowPlayingInfo通过AirPlay忽略AVPlayer音频

    我已经使用AVPlayer实现音频播放,播放远程mp3网址.我想使用MPNowPlayingInfoCenterNowPlayingInfo方法显示当前正在播放的音频的信息.当我锁定屏幕时,我会看到我设置的图像和标题,所以我知道这种方法是以某种方式注册信息,但是当我将AirPlay切换到AppleTV时,显示器看起来像通用的视频输出,进度条位于底部,但经过时间和持续时间正确显示.如果我设置相同的N

  4. swift – AVAudioEngine实时音频

    HEJ.我想在Swift中使用新的AVAudioEngine实现一个实时音频应用程序.有人有新经验吗?我的第一个想法是将输入数据存储到AVAudioPCMBuffer对象中,然后让它由AVAudioPlayerNode播放,就像在我的演示类中所看到的那样:但这远离实时而不是很有效率.任何想法或经验?

  5. swift – 将CoreMIDI输入与AVAudioUnit一起使用

    我正在寻找的是一个将MIDI输入直接传输到音频单元的工作示例,但如果您知道任何相对较新的相关资源,请分享这些链接.这些API的文档稀疏性非常令人沮丧.谢谢!在你的MIDIReadBlock循环中通过收到的数据包.根据每个数据包的MIDI状态,将相应的设备事件发送到audioUnit.例如

  6. Android媒体播放器如何在应用关闭时继续播放歌曲?

    想知道关闭应用程序后如何播放下一首歌曲,就像播放整张CD或播放列表一样……

  7. android – 如何设置MODE_WORLD_READABLE的文件权限

    我正在将音频文件下载到我的Android应用程序缓存中,然后必须使用MediaPlayer访问该缓存.该文件的创建权限为-rw——-.使用这些权限,MediaPlayer无法访问音频文件.失败在logcat中显示为:我的应用针对API级别8.如何设置下载的音频文件的权限以使其可由MediaPlayer读取?

  8. android – 使用软件合成器将MIDI文件转换为原始音频

    但最初将没有音频.(第2步)正如你所看到的,AndroidMIDI延迟的问题对我来说并不是一个问题,因为我没有创建一个实时合成器应用程序…>AndroidMIDILib>AndroidMidiDriverusingSonivoxEASLibrary我的第一次尝试是上述两个项目……将它们混合起来,以便将MIDI文件转换为原始PCM数据缓冲区…我对MIDI->PCM转换比较陌生,所以我想确保我没有完全错过任何东西.>如果没有,我应该如何将MIDI文件转换为某种音频格式,然后可以用于创建MP4?>是否有其他开源

  9. android – MediaPlayer pause()行为

    我正在使用MediaPlayer从URL流式传输音频.根据文档,调用MediaPlayer暂停后再播放将从暂停点恢复.我想知道如何使用现场音频流.当我打电话暂停是MediaPlayer创建一些所有传入数据的缓冲区,并存储它,直到我再次打电话播放?

  10. 浅谈HTML5新增和废弃的标签

    以下的 HTML 4.01 元素在HTML5中已经被删除,虽然浏览器为了兼容性考虑都还支持这些标签,但建议使用新的替代标签,下面我们就一起来了解一下是哪些标签吧

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部