Мое приложение является зрителем для пользовательского формата, zip-файла с четко определенным XML-манифестом и ресурсами, такими как изображения и фильмы. Я использую zlib, чтобы открыть zip-файл в памяти, а затем перейти к отображению указанных ресурсов.Обнаружение типа mime-in-памяти с помощью Cocoa (OS X)?
Одна проблема, с которой я столкнулся, заключается в том, что я не могу правильно отображать видео, по-видимому, потому что QTMovie не может определить тип mime. Фильм, загруженный из файла ([QTMovie movieWithFile]) работает отлично. Загруженный из памяти ([QTMovie movieWithData]) отказывается работать.
Это имеет смысл, поскольку отсутствует расширение файла, QTMovie не может определить информацию типа mime. После недолгого поиска, я прибегал к использованию QTDataReference в следующем mannner:
NSData *movieData = ...read from memory...;
QTDataReference *movieDataReference = [[QTDataReference alloc] initWithReferenceToData:movieData name:fileName MIMEType:@"video/x-m4v"];
QTMovie *mov = [QTMovie movieWithDataReference:movieDataReference error:&err];
Это прекрасно работает, однако жестко прописывать MIMETYPE далеко от идеала. У меня есть доступ к имени файла и расширению, поэтому я попытался найти мим-тип с помощью ИМПА (благодаря хорошим людям на #macdev):
- (NSString*)mimeTypeForExtension:(NSString*)ext {
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,(CFStringRef)ext,NULL);
return NSMakeCollectable(UTTypeCopyPreferredTagWithClass((CFStringRef)UTI,kUTTagClassMIMEType));
}
Это, однако, не работает. Очевидно, что есть внутренняя база данных OS X расширений и соответствующих mime-типов. В противном случае фильмы с диска не будут работать. Как мне получить доступ к нему?
Спасибо!
Только в случае, если кто-то борется с этим в будущем (как я) и хочет более гибкое решение: Я разработал [ `MagicKit.framework`] (https://github.com/ aidansteele/MagicKit) как (очень тонкая) обертка вокруг `libmagic`. Это устраняет необходимость обращения ко всем крайним случаям явно. – 2010-12-12 01:52:36