- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 iOS 的初学者,我正在尝试使用 Swift 设计一个架子鼓应用。我设计了一个只有一个按钮的 View 并写了下面的代码,但是它有一些问题:
AVAudioPlayer
不是低延迟音频的最佳选择,但作为初学者,没有代码很难学习OpenAL
,AudioUnit
Swift
中的示例或教程。问题类似于:Which framework should I use to play an audio file (WAV, MP3, AIFF) in iOS with low latency? .代码:
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 Class Reference):
Getting the Shared Audio Session
Declaration SWIFT
class func sharedInstance() -> AVAudioSession
然后,尝试将首选 IO 缓冲持续时间设置为非常合适的值 使用此实例方法的短(例如 .002):
Sets the preferred audio I/O buffer duration, in seconds.
Declaration SWIFT
func setPreferredIOBufferDuration(_ duration: NSTimeInterval) throws
Parameters
duration
The audio I/O buffer duration, in seconds, that you want to use.
outError
On input, a pointer to an error object. If an error occurs, the pointer is set to an NSError object that describes the error. If you do not want error information, pass in nil. Return Value true if a request was successfully made, or false otherwise.Discussion
This method requests a change to the I/O buffer duration. To determine whether the change takes effect, use the IOBufferDuration property. For details see Configuring the Audio Session.
请记住上面的注释 - IOBufferDuration
属性是否实际上设置为传递给 func setPrefferedIOBufferDuration(_ duration: NSTimeInterval) throws 的值
方法,取决于函数不返回错误,和 其他我不完全清楚的因素。另外——在我的测试中——我发现如果你将这个值设置为一个极低的值,这个值(或接近它的值)确实会被设置,但是当播放一个文件(例如使用 AVAudioPlayerNode)时,声音不会被播放。没有错误,只是没有声音。这显然是个问题。而且我还没有发现如何测试这个问题,除了在实际设备上测试时注意到没有声音进入我的耳朵。我会调查一下。但就目前而言,我建议将首选持续时间设置为不少于 .002 或 .0015。 .0015 的值似乎适用于我正在测试的 iPad Air(型号 A1474)。虽然低至 .0012 似乎在我的 iPhone 6S 上运行良好。
从 CPU 开销的角度来看,另一件需要考虑的事情是音频文件的格式。播放未压缩格式时,CPU 开销非常低。 Apple 建议您应使用 CAF 文件以获得最高质量和最低开销。对于压缩文件和最低开销,您应该使用 IMA4 压缩:
(来自 iOS Multimedia Programming Guide):
Preferred Audio Formats in iOS For uncompressed (highest quality) audio, use 16-bit, little endian, linear PCM audio data packaged in a CAF file. You can convert an audio file to this format in Mac OS X using the afconvert command-line tool, as shown here:
/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}
For less memory usage when you need to play multiple sounds simultaneously, use IMA4 (IMA/ADPCM) compression. This reduces file size but entails minimal CPU impact during decompression. As with linear PCM data, package IMA4 data in a CAF file.
您也可以使用 afconvert 转换为 IMA4:
/usr/bin/afconvert -f AIFC -d ima4 [文件]
关于ios - iOS Swift 中简单的低延迟音频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34680007/
我一直在为实时流和静态文件(HTTP 上的 MP3)构建网络广播播放器。我选了Howler.js作为规范化 quirks 的后端的 HTML5 Audio (思考:自动播放、淡入/淡出、进度事件)。
vue移动端input上传视频、音频,供大家参考,具体内容如下 html部分 ?
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我想在我的程序中访问音频和视频。 MAC里面可以吗? 我们的程序在 Windows 上运行,我使用 directshow 进行音频/视频编程。但我想在 MAC 中开发相同的东西。 有没有像direct
我的应用程序(使用 Flutter 制作,但这应该无关紧要)具有类似于计时器的功能,可以定期(10 秒到 3 分钟)发出滴答声。我在我的 Info.plist 中激活了背景模式 Audio、AirPl
我是 ionic 2 的初学者 我使用了音频文件。 import { Component } from '@angular/core'; import {NavController, Alert
我有一个包含ListView和图片的数据库,我想在每个语音数据中包含它们。我已经尝试过,但是有很多错误。以下是我的java和xml。 数据库.java package com.example.data
我在zend framework 2上建立了一个音乐社交网络。您可以想象它与SoundCloud相同,用户上传歌曲,其他用户播放它们,这些是网站上的基本操作。 我知道将要托管该页面的服务器将需要大量带
我正在尝试在android应用中播放音频,但是在代码中AssetFileDescriptor asset1及其下一行存在错误。这是代码: MediaPlayer mp; @Override prote
我对 WordPress Audio Shortcode有问题。我这样使用它: 但是在前面,在HTML代码中我得到了: document.createElement('audio');
我正在做一项关于降低噪音的滤波技术的实验。我在数据集中的样本是音频文件(.wav),因此,我有:原始录制的音频文件,我将它们与噪声混合,因此变得混合(噪声信号),我将这些噪声信号通过滤波算法传递,输出
一个人会使用哪种类型的神经网络架构将声音映射到其他声音?神经网络擅长学习从序列到其他序列,因此声音增强/生成似乎是它们的一种非常流行的应用(但不幸的是,事实并非如此-我只能找到一个(相当古老的)洋红色
这个让我抓狂: 在专用于此声音播放/录制应用程序的 Vista+ 计算机上,我需要我的应用程序确保(默认)麦克风电平被推到最大。我该怎么做? 我找到了 Core Audio lib ,找到了如何将 I
{ "manifest_version": 2, "name": "Kitten Radio Extension", "description": "Listen while browsi
class Main { WaveFileReader reader; short[] sample; Complex[] tmpComplexArray; publi
我正在使用电话录音软件(android),该软件可以记录2个人在电话中的通话。每个电话的输出是一个音频文件,其中包含来自 call 者和被 call 者的声音。 但是,大多数情况下,运行此软件的电话发
我正在构建一个需要语音激活命令的Web应用程序。我正在使用getUserMedia作为音频输入。 对于语音激活命令,该过程是用户将需要通过记录其语音来“校准”命令。例如,对于“停止”命令,用户将说出“
我正在开发一个Cordova应用程序,并将PouchDB用作数据库,当连接可用时,它将所有信息复制到CouchDB。 我成功存储了简单的文本和图像。 我一直在尝试存储视频和音频,但是没有运气。 我存储
我正在开发web application,我必须在其中使用.MP3的地方使用播放声音,但是会发生问题。 声音为play good in chrome, Firefox,但为safari its not
如何减少音频文件的位深?是否忽略了MSB或LSB?两者混合吗? (旁问:这叫什么?) 最佳答案 TL / DR:将音频曲线高度变量右移至较低位深度 可以将音频视为幅度(Y轴)随时间(X轴)的模拟曲线。
我是一名优秀的程序员,十分优秀!