iOS: получить метаданные файла - PullRequest
5 голосов
/ 17 февраля 2012

У меня есть 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]);
    }

«Поля AllHeader»:

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";
}

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

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

Класс для просмотра AVAsset и, в частности, это подкласс для сети AVURLAsset. AVAsset имеет свойство NSArray с именем commonMetadata. Это свойство commonMetadata будет содержать экземпляры AVMetadataItem, если, конечно, ссылочный URL содержит метаданные. Обычно вы будете использовать AVMetadataItem 's 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, вы можете создать с ним AVPlayerItem и передать его AVPlayer и играть на нем или нет.

2 голосов
/ 17 февраля 2012

Да, вы точно в цель с NSURLConnection.

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

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

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

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

1 голос
/ 17 февраля 2012

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

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

...