Как создать аудиофайл с форматом обработки in16 на Swift?

Вопрос или проблема

Как создать аудиофайл с форматом обработки in16 на Swift?

Это мой код, processingFormat всегда <AVAudioFormat 0x3016b46e0: 1 ch, 16000 Hz, Float32>, как сделать так, чтобы это было Int16?

   `let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

    let audioURL = documentDirectory.appendingPathComponent("recording_\(UUID().uuidString).wav")
    let int16Format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 16000, channels: 1, interleaved: true)!

    do {
        audioFile = try AVAudioFile(forWriting: audioURL, settings: int16Format.settings)
        if let processingFormat = audioFile?.processingFormat {
            print("Обрабатываемый формат: \(processingFormat)")
        }
    } catch {
        print("Ошибка при создании аудиофайла: \(error.localizedDescription)")
    }

Ответ или решение

Для создания аудиофайла с форматом обработки Int16 в Swift, необходимо убедиться, что вы правильно настраиваете аудиоформат. Ваш текущий код почти правильный, но вы можете столкнуться с проблемой, если не учитываете спецификации для AVAudioFile. Вот полный пример кода, который создаст аудиофайл с форматом Int16.

import AVFoundation

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

let audioURL = documentDirectory.appendingPathComponent("recording_\(UUID().uuidString).wav")
let int16Format = AVAudioFormat(commonFormat: .pcmFormatInt16, sampleRate: 16000, channels: 1, interleaved: true)!

do {
    let audioFile = try AVAudioFile(forWriting: audioURL, settings: int16Format.settings)
    if let processingFormat = audioFile.processingFormat {
        print("Формат обработки: \(processingFormat)")
    }

    // Пример записи данных в аудиофайл
    let buffer = AVAudioPCMBuffer(pcmFormat: int16Format, frameCapacity: 1024)!
    // Заполнение буфера вашими данными
    buffer.frameLength = buffer.frameCapacity

    // Пример: заполняем буфер случайными данными
    let channelData = buffer.int16ChannelData![0]
    for frame in 0..<Int(buffer.frameLength) {
        channelData[frame] = Int16.random(in: Int16.min...Int16.max) // Генерация случайных данных
    }

    try audioFile.write(from: buffer)
    print("Аудиофайл успешно создан по адресу: \(audioURL)")

} catch {
    print("Ошибка при создании аудиофайла: \(error.localizedDescription)")
}

Объяснение кода:

  1. Создание URL: Мы создаем URL для нашего аудиофайла в директории документов.
  2. Создание AVAudioFormat: Мы создаем AVAudioFormat с использованием формата pcmFormatInt16, частоты дискретизации 16000 Гц и 1 канала.
  3. Создание AVAudioFile: Используем AVAudioFile(forWriting:settings:) для записи, причем настройки берутся из созданного формата.
  4. Создание буфера: Мы создаем PCM-буфер с тем же форматом, чтобы записывать в него данные звука.
  5. Заполнение буфера: В данном примере буфер заполняется случайными значениями Int16. В реальном приложении вы должны будете заменить эту логику на ваши данные.
  6. Запись в файл: Используем метод write(from:) для записи буфера в аудиофайл.

Обратите внимание, что необходимо также обрабатывать возможные ошибки, как это показано в блоке catch. Этот код можно запускать в рамках вашего проекта на Swift, и он должен привести к созданию аудиофайла с правильным форматом обработки Int16.

Оцените материал
Добавить комментарий

Капча загружается...