Изменить предпочтительный объем AVAsset - PullRequest
0 голосов
/ 03 июля 2018

Можно ли увеличить / уменьшить громкость дорожки AVAsset или AVMutableComposition аудиофайла? У меня есть два аудиофайла (фоновая инструментальная и записанная песня), я хочу уменьшить громкость одного файла и объединить его с другим.

1 Ответ

0 голосов
/ 06 июля 2018

1. Изменить громкость трека

Чтобы сделать это с физическим файлом, вам нужно загрузить необработанные данные PCM в Swift. Ниже приведен пример получения данных с плавающей запятой благодаря этой публикации SO:

import AVFoundation
// ...

let url = NSBundle.mainBundle().URLForResource("your audio file", withExtension: "wav")
let file = try! AVAudioFile(forReading: url!)
let format = AVAudioFormat(commonFormat: .PCMFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: 1, interleaved: false)

let buf = AVAudioPCMBuffer(PCMFormat: format, frameCapacity: 1024)
try! file.readIntoBuffer(buf)

// this makes a copy, you might not want that
let floatArray = Array(UnsafeBufferPointer(start: buf.floatChannelData[0], count:Int(buf.frameLength)))

print("floatArray \(floatArray)\n")

Если у вас есть данные в вашем floatArray, просто умножьте каждое значение в массиве на число от 0 до 1, чтобы отрегулировать усиление. Если вы более знакомы с децибелами, поместите свое значение в децибелах в следующую строку и умножьте каждое значение массива на linGain:

var linGain = pow(10.0f, decibelGain/20.0f).

Тогда нужно снова записать аудиофайл перед его загрузкой ( credit ):

let SAMPLE_RATE =  Float64(16000.0)

let outputFormatSettings = [
    AVFormatIDKey:kAudioFormatLinearPCM,
    AVLinearPCMBitDepthKey:32,
    AVLinearPCMIsFloatKey: true,
    //  AVLinearPCMIsBigEndianKey: false,
    AVSampleRateKey: SAMPLE_RATE,
    AVNumberOfChannelsKey: 1
    ] as [String : Any]

let audioFile = try? AVAudioFile(forWriting: url, settings: outputFormatSettings, commonFormat: AVAudioCommonFormat.pcmFormatFloat32, interleaved: true)

let bufferFormat = AVAudioFormat(settings: outputFormatSettings)

let outputBuffer = AVAudioPCMBuffer(pcmFormat: bufferFormat, frameCapacity: AVAudioFrameCount(buff.count))

// i had my samples in doubles, so convert then write

for i in 0..<buff.count {
    outputBuffer.floatChannelData!.pointee[i] = Float( buff[i] )
}
outputBuffer.frameLength = AVAudioFrameCount( buff.count )

do{
    try audioFile?.write(from: outputBuffer)

} catch let error as NSError {
    print("error:", error.localizedDescription)
}

2. Смешайте треки вместе

Когда у вас есть новые .wav-файлы вашего аудио, вы можете загрузить оба в свои AVAssets, как и раньше, но на этот раз с желаемым усилением, которое вы применяли ранее.

Тогда, похоже, вы захотите использовать AVAssetReaderAudioMixOutput , который имеет метод, специально предназначенный для микширования двух звуковых дорожек.

AVAssetReaderAudioMixOutput.init(audioTracks: [AVAssetTrack], audioSettings: [String : Any]?)

Примечание: Я не буду постоянно использовать шаги 1 и 2, например, если вы хотите смешать песню с помощью ползунка и услышать результат, я бы порекомендовал использовать AVPlayer и отрегулировать их громкость и затем, когда пользователь будет готов, вызовите этот файл IO и микширование.

...