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 секунд?
Я знаю, что могу загрузить всю песню, а затем разрезать ее, но я хочу быть более эффективным, особенно если песня очень длинная.
Ответы
Ответ 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 (или вручную разобрать заголовок). Длина файла исправления внутри метаданных, а затем попытайтесь воспроизвести его на этот раз.