【问题标题】:increase volume of audio file recorded with swift增加使用 swift 录制的音频文件的音量
【发布时间】:2017-01-18 22:26:04
【问题描述】:

我正在用 swift 开发一个应用程序。我希望能够增加录制文件的音量。有没有办法直接在应用程序内部进行? 我找到了 Audiokit Here 和这个 question 但它对我没有多大帮助。

谢谢!

【问题讨论】:

  • 这里有更新吗?
  • 我对 iOS (Swift) 解决方案感兴趣。上面的链接适用于 Android。最好避免使用 AudioKit :)

标签: swift file audio


【解决方案1】:

使用 AudioKit

选项 A: 你只是想导入一个文件,然后播放它比你导入它的声音大吗?您可以为此使用AKBooster

import AudioKit

do {
    let file = try AKAudioFile(readFileName: "yourfile.wav")
    let player = try AKAudioPlayer(file: file)
    // Define your gain below. >1 means amplifying it to be louder
    let booster = AKBooster(player, gain: 1.3)
    AudioKit.output = booster
    try AudioKit.start()
    // And then to play your file:
    player.play()
} catch {
    // Log your error
}

只需将gain 的值设置为booster 以使其更响亮。


选项 B:您也可以尝试 normalizing 音频文件,它实质上在整个录音中应用了一个倍数常数(相对于录音中的最高信号电平),因此它达到了一个新的您定义的目标最大值。在这里,我将其设置为 -4dB。

let url = Bundle.main.url(forResource: "sound", withExtension: "wav")
if let file = try? AKAudioFile(forReading: url) {
    // Set the new max level (in dB) for the gain here.
    if let normalizedFile = try? file.normalized(newMaxLevel: -4) {
        print(normalizedFile.maxLevel)
        // Play your normalizedFile...
    }
}

此方法将所有内容的幅度增加到 dB 级别 - 因此它不会影响文件的动态 (SNR),它只会增加达到新最大值所需的量(所以你可以安全地将其应用于您的所有文件以使它们统一)。


使用 AVAudioPlayer

选项 A:如果您想调节/控制音量,AVAudioPlayer 有一个 volume 成员,但文档说:

音频播放器的播放音量,线性范围为 0.0 到 1.0。

其中1.0 是原始文件的音量,是默认值。所以你只能让它更安静。这是它的代码,如果你有兴趣的话:

let soundFileURL = Bundle.main.url(forResource: "sound", withExtension: "mp3")!
let audioPlayer = try? AVAudioPlayer(contentsOf: soundFileURL, fileTypeHint: AVFileType.mp3.rawValue)
audioPlayer?.play()
// Only play once
audioPlayer?.numberOfLoops = 0
// Set the volume of playback here.
audioPlayer?.volume = 1.0

选项 B:如果您的声音文件太安静,它可能会从手机的接收器中发出。在这种情况下,您可以尝试覆盖输出端口以使用扬声器:

do {
    try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
} catch let error {
    print("Override failed: \(error)")
}

您也可以使用此代码永久设置(但我不能保证您的应用会进入 AppStore):

try? audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.defaultToSpeaker)

选项 C: 如果选项 B 不适合您,那么您可能在“如何让 AVAudioPlayer 播放得更响亮”方面不走运。您最好自己使用一些外部软件编辑源文件 - 我可以推荐 Audacity 作为一个不错的选择。


选项 D:我只听说过的最后一个选项。您还可以查看MPVolumeView,它具有用于控制系统输出和音量的 UI。不过我对它不太熟悉——此时可能正在接近遗产。

【讨论】:

  • 有没有办法避免AudioKit?
  • 添加了许多选项供您查看。让我知道这是否有帮助。
  • Module AudioKit 没有名为“AKBooster”的成员。我已经使用 Swift 包管理器导入了 AudioKit,并且可以访问类似 AudioKit.Settings.defaultToSpeaker 但找不到 AKBooster。
  • 如果其他人在将 AudioKit 导入他们的项目后也找不到 AKBooster。似乎在第 5 版中情况发生了变化。这是一个迁移指南:github.com/AudioKit/AudioKit/blob/v5-main/docs/…
【解决方案2】:

有几个标准的 AudioKit DSP 组件可以增加音量。

例如,您可以使用 AKBooster 之类的简单方法:http://audiokit.io/docs/Classes/AKBooster.html

使用下面的代码,

AKSettings.defaultToSpeaker = true

在这篇文章中查看更多详细信息: https://github.com/audiokit/AudioKit/issues/599 https://github.com/AudioKit/AudioKit/issues/586

【讨论】:

    【解决方案3】:

    我想在这里提一些事情,因为我正在研究类似的问题。

    与 Apple Docs 上 AVAudioPlayer.volume 属性 (https://developer.apple.com/documentation/avfoundation/avaudioplayer/1389330-volume) 上所写的相反,音量可能会高于 1.0...实际上这是可行的。我在我的应用程序中将音量提高到 100.0,录制的音频更响亮,更容易听到。

    对我有帮助的另一件事是像这样设置 AVAudioSession 的模式:

    do { 
       let session = AVAudioSession.sharedInstance()
       try session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooh])
       try session.setMode(.videoRecording)
       try session.setActive(true)
    } catch {
       debugPrint("Problem with AVAudioSession")
    }
    

    session.setMode(.videoRecording) 是这里的关键线。这有助于您通过手机的较大扬声器发送音频,而不仅仅是前面面部摄像头旁边的电话扬声器。我遇到了这个问题,并在这里发布了一个对我有帮助的问题:

    AVAudioPlayer NOT playing through speaker after recording with AVAudioRecorder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2011-08-04
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多