Как удалить заголовки рифа из файла wav в Swift? - PullRequest
0 голосов
/ 22 января 2020

Я хочу просто получить порцию данных файла .wav и исключить все остальные порции, например заголовки рифа.

        let voiceData = try? Data(contentsOf: soundUrl).advanced(by: 44)

Я пробовал это, но по какой-то причине еще осталось немного багажа перед фактическим звуком. Может кто-нибудь, пожалуйста, помогите мне с этим вопросом. Есть ли эффективный способ прочитать файл .wav и включить только раздел данных?

1 Ответ

0 голосов
/ 22 января 2020

Во-первых, вы уверены, что это на самом деле WAV-файл. WAV обычно имеет 44 байта заголовка. Почему вы считаете, что есть «какой-то багаж»? Как вы это определяете?

Конечно, вы можете анализировать формат RIFF напрямую. Самый простой (небрежный) подход - это сканирование вниз, пока вы не найдете байты «данных» (0x64 61 74 61). Следующие 4 байта будут иметь длину (в формате с прямым порядком байтов, которую вы можете пропустить, если вы просто собираетесь читать до конца), за которой следуют фактические данные, которые вы хотите.

Поиск data байт делается с range(of:)

let dataBytes = Data([0x64, 0x61, 0x74, 0x61])
if let dataRange = riff.range(of: dataBytes) {
    let start = dataRange.endIndex + 4  // Skip over length bytes
    let samples = riff[start...] // read the rest of the bytes
    // use samples
}
...