在 Swift 中对声音进行延迟排序

Posted

技术标签:

【中文标题】在 Swift 中对声音进行延迟排序【英文标题】:Sequencing sounds with a delay in Swift 【发布时间】:2015-10-23 22:49:02 【问题描述】:

抱歉,如果之前已发布过此内容,但我在此主题上搜索时运气不佳。我正在尝试使用 Swift 构建一个莫尔斯电码转换器。作为其中的一部分,我制作了一个函数,它接受一串点和破折号,并希望播放相应的音频。我已经成功地为短哔声和长哔声加载了 2 个音频播放器。

我首先循环遍历字符串并为每个字符播放相应的声音。但是,这只是并行播放所有声音。现在我正在尝试使用 dispatch_after,但仍然遇到同样的问题。我的代码如下。

func audioMorseMessage(message: String) 
    var time = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC))
    for character in message.characters 
        if String(character) == "-" 
            dispatch_after(time,dispatch_get_main_queue())
                self.longBeep.play()
            
        
        if String(character) == "." 
            dispatch_after(time,dispatch_get_main_queue())
                self.shortBeep.play()
            
        
    

这是处理这个问题的正确方法吗?是否有另一种方法可以在循环期间连接音频文件(在哔声之间放置小间隙),然后在循环完成后播放整个文件?感谢您提前提供任何帮助。

【问题讨论】:

【参考方案1】:

这似乎是使用 NSOperation 和 NSOperationQueue 的绝佳机会。我建议创建一个串行队列,然后按顺序加载您的各个声音操作。以下代码未完全形成,但非常接近。希望您的点和破折号声音文件已经包含每个音调后的点长空格。如果他们不这样做,那么您将不得不自己插入额外的空格(暂停)。

class LongBeep: NSOperation 
  override func main() 
    if self.cancelled  return 
    print("L", terminator: "")  // play long sound
  


class ShortBeep: NSOperation 
  override func main() 
    if self.cancelled  return 
    print("S", terminator: "")  // play short sound
  


class Pause: NSOperation 
  override func main() 
    if self.cancelled  return 
    print(" pause ", terminator: "")  // play empty sound or use actual delay
  


func audioMorseMessage(message: String) 
  let queue = NSOperationQueue()
  queue.name = "morse-player"
  queue.maxConcurrentOperationCount = 1

  message.characters.mapcode in
    switch code 
    case "-": queue.addOperation(LongBeep())
    case ".": queue.addOperation(ShortBeep())
    case " ": queue.addOperation(Pause())
    default:  break
    
  

【讨论】:

编辑 - 抱歉,我似乎无法弄清楚如何将代码 sn-ps 放在这里

以上是关于在 Swift 中对声音进行延迟排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Playground 中的 swift 3 中添加延迟似乎不准确

AVAudioPlayer 在 Swift 4.2 中产生延迟

使用 AVAudioEngine 为低延迟节拍器安排声音

Adobe AIR 动态声音和录制延迟问题

Linux如何在RAM缓冲区中录制声音并以自定义延迟播放音频

添加到声音的延迟