получить теги ID3, не загружая весь файл в приложении iphone?

Можно ли получить теги ID3 (особенно длительность) без загрузки файла дыры?

Мне нужно получить продолжительность файлов mp3 из URL-адресов http.

Я пытался это сделать:

AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil]; NSString *duration = [NSString stringWithFormat:@"%.2f",CMTimeGetSeconds(asset.duration)];

но это требует времени, особенно если это большой файл. Есть идеи, пожалуйста?


person Harrath hichem    schedule 11.04.2013    source источник


Ответы (1)


короткий ответ: да, если это теги ID3v2

какую версию тега ID3 вы пытаетесь прочитать?

Теги ID3v1 находятся в конце файла в последних 128 байтах. С Net :: HTTP, похоже, невозможно перейти к концу файла и прочитать только последние N байтов. Если вы попробуете это, используя headers = {"Range" => "bytes = 128-"}, всегда будет казаться, что загружается полный файл. resp.body.size => размер файла. Но это не большая потеря, потому что версия 1 ID3 на данный момент в значительной степени устарела из-за своих ограничений, таких как формат фиксированной длины, только текст ASCII, ...). iTunes использует ID3 версии 2.2.0.

Теги ID3v2 находятся в начале файла - для поддержки потоковой передачи - вы можете загрузить начальную часть файла MP3, содержащую заголовок ID3v2, по протоколу HTTP> = 1.1.

Раньше я отвечал примерно на тот же вопрос, который касался реализации Ruby.

Проверьте этот вопрос: Читать теги ID3 удаленного MP3-файла в Ruby / Rails?


Продолжение ... Код Ruby в другом вопросе, который я упомянул, является полностью работающим примером.

Вы можете установить заранее определенный размер байтов, которые вы хотите получить, который должен быть достаточно большим, чтобы вы предполагали, что он содержит полный ID3-тег, например 1000 байт

Затем вы открываете HTTP-соединение, используя вашу любимую HTTP-библиотеку для любого языка, который вы используете, но убедитесь, что версия HTTP-протокола> = 1.1, и вы читаете первые 1000 байт, используя параметр HTTP «Диапазон», который только загружает заданный диапазон байтов из файла, к которому вы пытаетесь получить доступ через HTTP.

Конкретная реализация на iOS зависит от того, какие библиотеки вы используете.

Вот пример запроса GET в Objective-C: Простая цель -c GET запрос

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

См. API: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableURLRequest_Class/Reference/Reference.html

Также проверьте пример того, как нужно форматировать поле заголовка Range:

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

например это синтаксис заголовка Range:

 Range: bytes=0-1000

Вам нужно будет установить этот заголовок с помощью метода экземпляра addValue: forHTTPHeaderField.

person Tilo    schedule 11.04.2013
comment
Спасибо, но проблема в том, как скачать начальную часть и получить? - person Harrath hichem; 11.04.2013
comment
Я добавил к своему ответу - пожалуйста, проверьте документы библиотеки разработчика Mac на особенности вызовов методов. developer.apple.com / library / mac / # documentation / Cocoa / Reference / - person Tilo; 12.04.2013