في ذاكرة التمثيل الصامت من نوع الكشف مع الكاكاو (OS X)؟

StackOverflow https://stackoverflow.com/questions/300618

سؤال

وطلبي هو عارض لتنسيق مخصص، وهو ملف مضغوط مع XML واضحة المعالم واضح والموارد، مثل الصور والأفلام. يمكنني استخدام ZLIB لفتح ملف مضغوط في الذاكرة ومن ثم المضي قدما لعرض الموارد المذكورة.

ومشكلة واحدة لقد واجهت هي أنني غير قادر على عرض بشكل صحيح الفيديو، على ما يبدو بسبب QTMovie لا يمكن تحديد التمثيل الصامت نوع. فيلم تحميل من ملف ([QTMovie movieWithFile]) يعمل تماما. تحميل من الذاكرة ([QTMovie movieWithData]) يرفض العمل.

وهذا أمر منطقي، لأن تفتقر إلى ملحق الملف، QTMovie لا يمكن تحديد المعلومات التمثيل الصامت نوع. بعد قليل من البحث، لقد لجأت إلى استخدام 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];

وهذا يعمل بشكل جيد، ولكن hardcoding MIMETYPE أبعد ما يكون عن المثالية. أنا من الحصول على اسم الملف والتمديد، حتى لقد حاولت العثور على التمثيل الصامت من نوع باستخدام UTI (بفضل الناس لطيفة على #macdev):

- (NSString*)mimeTypeForExtension:(NSString*)ext {

    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,(CFStringRef)ext,NULL);
    return NSMakeCollectable(UTTypeCopyPreferredTagWithClass((CFStringRef)UTI,kUTTagClassMIMEType));
}

ولكن هذا لا يعمل. ومن الواضح أن هناك لOS X قاعدة البيانات الداخلية للملحقات والتمثيل الصامت-أنواع المقابلة، في مكان ما. إلا أن الأفلام من القرص لا يعمل. كيف يمكنني الحصول على ذلك؟

وشكرا!

هل كانت مفيدة؟

المحلول

والمشكلة وجود الخاص بك هو أن M4V وM4P لا تملك أنواع التمثيل الصامت مسجل مع خدمات التشغيل (ربما لأن نوع التمثيل الصامت لM4V وM4P غير القياسية). وعلى أية حال، ما ربما يجب عليك القيام به هو التعامل مع الحالات حافة مثل هذا ثم التحقق من وجود شيء عندما ترجع الدالة (في حالة كل من لم يسجل التمديد وعدم التعامل معها من قبلك).

والشيء الآخر هو أن كنت تسرب الذاكرة مع استخدام الحالي. أفترض أنك تستخدم جمع القمامة، ولكن المكالمة الأولى يخلق CFString التي يتم تحريرها أبدا. هنا هو تطبيق اقترح طريقة بك:

-(NSString*)mimeTypeForExtension:(NSString*)ext
{
    NSAssert( ext, @"Extension cannot be nil" );
    NSString* mimeType = nil;

    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
        (CFStringRef)ext, NULL);
    if( !UTI ) return nil;

    CFStringRef registeredType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
    if( !registeredType ) // check for edge case
    {
        if( [ext isEqualToString:@"m4v"] )
            mimeType = @"video/x-m4v";
        else if( [ext isEqualToString:@"m4p"] )
            mimeType = @"audio/x-m4p";
        // handle anything else here that you know is not registered
    } else {
        mimeType = NSMakeCollectable(registeredType);
    }

    CFRelease(UTI);
    return mimeType;
}

نصائح أخرى

ويمكنك استخدام NSWorkspace أن يكون النظام تخمين UTI من ملف.

-(NSString *)mimeTypeForFileAtPath:(NSString *)path error:(NSError **)err {
  NSString *uti, *mimeType = nil;

  if (!(uti = [[NSWorkspace sharedWorkspace] typeOfFile:path error:err]))
    return nil;
  if (err)
    *err = nil;

  if ((mimeType = (NSString *)UTTypeCopyPreferredTagWithClass((CFStringRef)uti, kUTTagClassMIMEType)))
    mimeType = NSMakeCollectable(mimeType);

  return mimeType;
}

وتشير إلى أن تغير الناس العودة إلى [MIMETYPE autorelease]. - البعض منا الاستمرار في استخدام الطرق القديمة

وذلك بفضل! وكانت هذه مساعدة كبيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top