Подтвердить что ты не робот

Ios - загрузить только несколько секунд из mp3 файла

Мне нужно скачать mp3 файл, но мне нужны только первые 20 секунд песни (или вся песня, если песня меньше 20 секунд).
вот как я загружаю всю песню:

    func downloadSong(audioUrl: URL) {

    let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let destinationUrl = documentsDirectoryURL.appendingPathComponent(audioUrl.lastPathComponent)

    URLSession.shared.downloadTask(with: audioUrl, completionHandler: { (location, response, error) -> Void in
        guard let location = location, error == nil else { return }
        do {

            try FileManager.default.moveItem(at: location, to: destinationUrl)
            // song available in destinationUrl

        } catch let error as NSError {

        }
    }).resume()
}

Есть ли способ остановить загрузку через 20 секунд? Я знаю, что могу загрузить всю песню, а затем разрезать ее, но я хочу быть более эффективным, особенно если песня очень длинная.

4b9b3361

Ответ 1

MP3 файл разделен на небольшие блоки-кадры. Каждый кадр имеет постоянная длина времени 0,026 сек. Но размер одного кадра (в байтах) варьируется в зависимости от битрейта. Например. для 128 Кбит/с это (обычно) 417 Байты и 192 кбит/с 626 байт. Первые 4 байта каждого кадра заголовок кадра, а остальные - аудиоданные.

Цитата из здесь.

И каждый кадр воспроизводится. Поэтому для 20 секунд данных вам потребуется примерно 770 frames(20/0.026).  Поэтому загрузите сначала кадры 770, затем отмените задачу загрузки. Затем выполните воспроизведение загруженных фреймов.

Или по размеру, загрузите сначала 313.5 KB (Расчет: (417 Bytes*770)/1024) данных для файла 128 Кбит/с. И вы получите 20 секунд данных.

Ответ 2

Вам нужно будет отрезать аудиофайл до 20 секунд, после чего вы сможете его загрузить.

Ответ 3

Я также столкнулся с такой проблемой в одном из моих приложений. После того, как я много искал, я, наконец, пришел к выводу, что это невозможно. Поскольку загрузка файла mp3 имеет свой собственный внутренний algorithm, который работает в соответствии с кадрами. Таким образом, мы не можем предсказать ничего о том, сколько секунд или минут загружено аудио.

Кроме того, вы можете ссылаться на эту ссылку.

Загрузите последние 30 секунд mp3

Ответ 4

По моему мнению, это определенно возможно только с несколькими предположениями:

  • Сервер должен поддерживать Content-Range заголовок
  • вам нужно знание (или хорошая библиотека) во внутренней структуре mp3

Идея:

Загрузите 500 kb с сервера, запросив этот счетчик в диапазоне. Затем у вас есть два варианта:

  • быстро и грязно - перекрестите пальцы и передайте эти данные прямо игроку и посмотрите, что произойдет:)
  • Предоставить полученные данные в библиотеку, поддерживающую mp3 (или вручную разобрать заголовок). Длина файла исправления внутри метаданных, а затем попытайтесь воспроизвести его на этот раз.