iOS: получить метаданные файла

У меня есть mp3-файл на сервере. Я хочу получить информацию этого файла, как размер этого файла, имя исполнителя, имя альбома, когда был создан файл, когда он был изменен и т. Д. Я хочу всю эту информацию.

Можно ли получить эту информацию без фактической загрузки всего файла? Использование NSURLConnection или иначе?

РЕДАКТИРОВАТЬ:

Следующий код не дает мне необходимой информации, то есть файла, созданного именем исполнителя, и т. Д.

  NSError *rerror = nil; NSURLResponse *response = nil; NSURL *url = [NSURL URLWithString:@"http://link.to.mp3"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"HEAD"]; NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&rerror]; NSString *resultString = [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease]; NSLog(@"URL: %@", url); NSLog(@"Request: %@", request); NSLog(@"Result (NSData): %@", result); NSLog(@"Result (NSString): %@", resultString); NSLog(@"Response: %@", response); NSLog(@"Error: %@", rerror); if ([response isMemberOfClass:[NSHTTPURLResponse class]]) { NSLog(@"AllHeaderFields: %@", [((NSHTTPURLResponse *)response) allHeaderFields]); } 

«AllHeaderFields»:

 AllHeaderFields: { "Cache-Control" = "max-age=0"; Connection = "keep-alive"; "Content-Encoding" = gzip; "Content-Type" = "text/plain; charset=ascii"; Date = "Fri, 17 Feb 2012 12:44:59 GMT"; Etag = 19202n; Pragma = public; Server = dbws; "x-robots-tag" = "noindex,nofollow"; } 

Да и нет. Такие вещи, как размер файла и дата модификации, часто бывают частью ответа HEAD. Но не всегда: с большим количеством динамических URL-адресов вы не получите всю информацию.

Что касается имени исполнителя и альбома, они являются частью ID3 MP3, который содержится внутри файла, и поэтому вы не сможете получить их с запросом HEAD. Поскольку тег ID3 обычно находится в начале файла, вы можете попытаться захватить только эту часть, а затем прочитать тег ID3. Но вы не сможете это сделать с помощью NSURLConnection поскольку он не поддерживает только выборку части файла, поэтому вам нужно будет найти более низкоуровневый способ получения данных по HTTP.

Вполне возможно получить информацию ID3, встроенную в файл MP3 (имя исполнителя, название трека), без загрузки всего файла или использования низкоуровневых API. Функциональность является частью структуры AVFoundation .

Класс для просмотра – AVAsset и, в частности, это сетевой подкласс AVURLAsset . AVAsset имеет свойство commonMetadata именем commonMetadata . Это свойство commonMetadata будет содержать экземпляры AVMetadataItem , предполагая, конечно, что ссылочный URL-адрес содержит метаданные. Обычно вы используете AVMetadataItem commonKey для ссылки на элемент. Я нахожу этот метод итерации через массив, проверяющий commonKeys раздражающий, поэтому я создаю NSDictionary используя свойство commonKey как key и свойство value как object . Вот так:

 -(NSDictionary *)dictionaryOfMetadataFromAsset:(AVAsset *)asset{ NSMutableDictionary *metaData = [[NSMutableDictionary alloc] init]; for (AVMetadataItem *item in asset.commonMetadata) { if (item.value && item.commonKey){ [metaData setObject:item.value forKey:item.commonKey]; } } return [metaData copy]; } 

С помощью этого простого метода метаданные AVAsset становятся довольно простыми в использовании. Вот пример получения метаданных MP3 через URL-адрес:

 NSURL *mp3URL = [NSURL URLWithString:@"http://'AddressOfMP3File'"]; AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:mp3URL options:nil]; NSDictionary *metaDict = [self dictionaryOfMetadataFromAsset:asset]; NSLog(@"Available Metadata :%@",metaDict.allKeys); NSLog(@"title:%@",[metaDict objectForKey:@"title"]); 

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

Как только у вас есть AVAsset вы можете создать с ним AVPlayer и AVAsset его AVPlayer и воспроизвести или нет.

Да, вы попали прямо в цель с NSURLConnection.

Я думаю, что вы хотите отправить запрос HEAD для ресурса, который хотите получить информацию, а затем проверить информацию, которую вы получаете в connection:didReceiveResponse: и connection:didReceiveData:

редактировать

По общему признанию, я не полностью изучил ваш вопрос. Невозможно получить информацию ID3, но вы сможете получить размер файла и, возможно, дату создания и т. Д.

Этот ответ дает некоторую хорошую информацию о том, как получить информацию ID3. Вам нужно будет настроить страницу php, чтобы изучить mp3-файл на стороне сервера и вернуть именно эту информацию, которая вам нужна, а не весь mp3.

  • Когда вызывать выпуск делегата NSURLConnection?
  • iOS: Как я могу получить HTTP 401 вместо -1012 NSURLErrorUserCancelledAuthentication
  • Как получить resumeData в UIApplicationWillTerminateNotification в NSURLSessionDownloadTask
  • Swift - возврат данных из NSURLSession при отправке запроса POST
  • Использует ли NSURLConnection TLSv1.2 по умолчанию?
  • NSURLRequest с кешированием не работает
  • Правильно отменить NSURLConnection?
  • Максимальный размер загружаемого файла на iOS / NSURLRequest / NSURLConnection
  • NSURLRequest производит разные результаты, чем HTTP-прокси-клиент
  • didReceiveData не получает все данные
  • Как указать IP-адрес сервера для HTTP-запроса вместо DNS
  • Interesting Posts

    Неавторизованный доступ не поддерживается для этого пула идентификаторов при использовании DynamoDB

    Создание Jpeg из NSData

    Перенос основных данных: отображение значения атрибута

    Интерактивная анимация между контроллерами контейнеров Swift 3

    Завершение приложения с libc ++ abi.dylib: завершение с неперехваченным исключением типа NSException в Xcode 8

    Sprite-Kit colorizeWithColor не смешивает спрайт с правильным цветом

    Яркая миграция основных данных: не удается найти или автоматически вывести модель сопоставления для миграции

    Сделать UIView полупрозрачным для отображения индикатора пользовательской активности

    uitableview: вложенные заголовки разделов

    Добавление навигационной панели программно iOS

    UIView bringSubviewToFront: делает * не * обеспечивает просмотр спереди

    iOS 9 Как обнаружить бесшумный режим?

    Есть ли способ передавать видео из Chrome или Safari на iOS в тег html5?

    Уведомления с MKStoreKit

    iOS Swift Firebase InstanceID Token возвращает Nil в первый раз

    Давайте будем гением компьютера.