当前位置: 首页 > 面试题库 >

在iOS Swift中进行简单的低延迟音频播放

漆雕原
2023-03-14
问题内容

我是iOS的初学者,正在尝试使用Swift设计鼓组应用。我设计了一个带有单个按钮的视图,并在下面编写了代码,但是它存在一些问题:

  1. 当我像鼓声一样快速触摸按钮时,会丢失一些声音。
  2. 仍然在“鼓声滚动”中,每次触摸该按钮都会中断声音,而不是让样本播放到结束为止。例如,c滚动太糟糕了。即使我再次触摸该按钮,我也希望听到所有采样的声音。
  3. 触摸和声音之间存在延迟。我知道这AVAudioPlayer是不是低延迟音频的最佳选择,但作为一个初学者,它很难学OpenALAudioUnit没有代码示例或教程Swift。\

代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Enable multiple touch for the button
    for v in view.subviews {
        if v.isKindOfClass(UIButton) {
            v.multipleTouchEnabled = true
        }
    }

    // Init audio
    audioURL = NSBundle.mainBundle().URLForResource("snareDrum", withExtension: "wav")!
    do {
        player = try AVAudioPlayer(contentsOfURL: audioURL)
        player?.prepareToPlay()
    } catch {
        print("AVAudioPlayer Error")
    }
}

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)

    player?.stop()
    player = nil
}

@IBAction func playSound(sender: UIButton) {
    player?.currentTime = 0
    player?.play()
}

问题答案:

如果您需要极低的延迟,我在AVAudioSession单例中发现了一个非常简单的解决方案(当应用启动时会自动实例化):

首先,使用此类方法获取对应用程序的AVAudioSession单例的引用:

(来自AVAudioSession类参考):

获取共享的音频会话

声明SWIFT

class func sharedInstance() -> AVAudioSession

然后,尝试使用此实例方法将首选IO缓冲区持续时间设置为非常短的时间(例如.002):

设置首选的音频I / O缓冲区持续时间(以秒为单位)。

声明SWIFT

func setPreferredIOBufferDuration(_ duration: NSTimeInterval) throws

参量

duration 您要使用的音频I / O缓冲区持续时间(以秒为单位)。

outError
输入时,指向错误对象的指针。如果发生错误,则将指针设置为描述该错误的NSError对象。如果您不想要错误信息,请输入nil。返回值如果成功发出请求,则为true,否则为false。

讨论区

此方法请求更改I /
O缓冲区持续时间。要确定更改是否生效,请使用IOBufferDuration属性。有关详细信息,请参阅配置音频会话。

请紧记上面的注释- IOBufferDuration属性是否 实际上 设置为传递给funcsetPrefferedIOBufferDuration(_ duration: NSTimeInterval) throws方法的值,取决于函数是否不返回错误, 并且 我还不太清楚的其他因素。另外-在我的测试中-
我发现,如果将此值设置为极低的值,则确实会设置该值(或接近它的值),但是在播放文件(例如使用AVAudioPlayerNode)时,声音不会被演奏。没有错误,只有声音。这显然是一个问题。而且,除了注意到在实际设备上进行测试时听不到声音的声音之外,我还没有发现如何测试此问题的方法。我会调查一下。但就目前而言,我建议将首选时长设置为不小于.002或.0015。.0015的值似乎适用于我正在测试的iPad
Air(型号A1474)。低至.0012似乎可以在我的iPhone 6S上正常工作。

从CPU开销角度考虑的另一件事是音频文件的格式。播放时,未压缩的格式将具有非常低的CPU开销。苹果公司建议您为获得最高质量和最低开销而使用CAF文件。对于压缩文件和最低开销,您应该使用IMA4压缩:

(来自iOS多媒体编程指南):

iOS中的首选音频格式对于未压缩(最高质量)的音频,请使用打包在CAF文件中的16位,小字节序,线性PCM音频数据。您可以使用afconvert命令行工具在Mac
OS X中将音频文件转换为这种格式,如下所示:

/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}

当需要同时播放多个声音时,为了减少内存使用量,请使用IMA4(IMA /
ADPCM)压缩。这样可以减小文件大小,但在解压缩期间对CPU的影响最小。与线性PCM数据一样,将IMA4数据打包在CAF文件中。

您也可以使用afconvert转换为IMA4:

/usr/bin/afconvert -f AIFC -d ima4 [file]



 类似资料:
  • 在网上研究了几天后,我来这里寻求帮助。我目前正在为朋友们开发一个简短的2D游戏(实际上只是为了好玩),几天前我了解了剪辑。在这个游戏中,玩家可以收集物体(几乎就像马里奥中的硬币一样)。我的问题是,我在收集硬币时会发出非常短的声音(50kB约1秒),如果玩家在1秒钟内收集3个硬币,那么剪辑会使游戏延迟。如果先例剪辑已经结束,那么就没有延迟。但是如果先例剪辑没有结束,那么尝试再次播放剪辑会使游戏延迟(

  • 我正在寻找一些关于如何使用标记以相对低的延迟(~2s)流直播视频流的建议。我也看到过一些其他类似的问题,比如这个和这个,但都没有真正充分地回答我的问题。第一种是在内容消费者不在现场的假设下工作的。第二个似乎也做出了这样的假设。 我正在寻找技术,库或任何建议真正实现这一点。我已经尝试使用nginx-RTMP从视频设备接收流,然后使用HLS将其发送到浏览器。然而,我所能达到的最低延迟是4s。我还没来得

  • 本文向大家介绍iOS开发中音频视频播放的简单实现方法,包括了iOS开发中音频视频播放的简单实现方法的使用技巧和注意事项,需要的朋友参考一下 前言 我们在平时的iOS开发中,音视频的播放有很多种,目前系统的自带的都属于 AVFoundation 框架,更加接近于底层,所以灵活性很强,更加方便自定义 还有就是第三方音视频视频播放,特点是功能强大,实现简单,支持流媒体,下面来逐一介绍,给大家参考学习,下

  • 我正在尝试用Java做一些事情,我需要在while循环中等待/延迟几秒钟。 我想构建一个step sequencer,我是Java新手。有什么建议吗?

  • 问题内容: 我正在Linux上的串行端口上实现协议。该协议基于请求应答方案,因此吞吐量受将数据包发送到设备并获得应答所花费的时间限制。这些设备主要基于Arm,并且运行Linux> = 3.0。我无法将往返时间缩短到10ms以下(115200波特,8个数据位,无奇偶校验,每条消息7个字节)。 哪些IO接口将为我带来最低的延迟:选择,轮询,epoll或使用ioctl手动轮询?阻塞或非阻塞IO是否会影响

  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。