Вопрос или проблема
Как создать аудиофайл с форматом обработки 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)")
}
Объяснение кода:
- Создание URL: Мы создаем URL для нашего аудиофайла в директории документов.
- Создание AVAudioFormat: Мы создаем
AVAudioFormat
с использованием форматаpcmFormatInt16
, частоты дискретизации 16000 Гц и 1 канала. - Создание AVAudioFile: Используем
AVAudioFile(forWriting:settings:)
для записи, причем настройки берутся из созданного формата. - Создание буфера: Мы создаем PCM-буфер с тем же форматом, чтобы записывать в него данные звука.
- Заполнение буфера: В данном примере буфер заполняется случайными значениями
Int16
. В реальном приложении вы должны будете заменить эту логику на ваши данные. - Запись в файл: Используем метод
write(from:)
для записи буфера в аудиофайл.
Обратите внимание, что необходимо также обрабатывать возможные ошибки, как это показано в блоке catch
. Этот код можно запускать в рамках вашего проекта на Swift, и он должен привести к созданию аудиофайла с правильным форматом обработки Int16
.