2011-06-07 103 views
3

我正在尝试使用QTKit在Cocoa中创建电影。这部电影应该由我创建的一堆NSImage组成。我遇到了一些问题。总体问题是电影没有创建。我看到一个文件似乎是空的,只包含几百个字节,但没有电影可言。总之,代码:QTMovie尝试添加图像时出现异常的异常索引:forDuration:withAttributes

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSLog(@"Creating .mov out of NSImage(s)"); 

    NSError *error = nil; 

    // Create empty QTMovie with writable data reference 
    QTMovie *movie = [[QTMovie alloc] initToWritableFile:@"Temp.mov" error:&error]; 

    // If an error occurred, print it 
    if (error) 
     NSLog(@"Error creating movie: %@", [error localizedDescription]); 

    // Sanity-check to see that our movie is writable 
    assert([[movie attributeForKey:QTMovieEditableAttribute] boolValue] == YES); 

    // Load our image 
    NSImage *image = [NSImage imageNamed:@"screen-1"]; 

    // Check that our image is loaded 
    assert(image != nil); 

    // Add the image to our movie, duration is 6000/600 = 10 seconds? 
    NSDictionary *attributesForImage = [NSDictionary dictionaryWithObjectsAndKeys:@"tiff", QTAddImageCodecType, nil]; 
    [movie addImage:image forDuration:QTMakeTime(6000, 600) withAttributes:attributesForImage]; 

    // Store our movie in a file called "Done.mov" 
    // flattening it seems like a good idea 
    NSDictionary *attributesForExport = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], 
           QTMovieFlatten, nil]; 
    error = nil; 
    BOOL didSucceed = [movie writeToFile:@"Done.mov" withAttributes:attributesForExport error:&error]; 

    if (! didSucceed || error) 
     NSLog(@"Did not succeed. Error was: %@", [error localizedDescription]); 
    else 
    { 
     // If we did succeed, error should be nil, right? 
     assert(error == nil); 

     NSLog(@"Did succeed."); 
    } 

    // Cleanup 
    [movie release]; 
    [[NSFileManager defaultManager] removeItemAtPath:@"Temp.mov" error:nil]; 
    [NSApp terminate:nil]; 
} 

该行密切关注的是[movie addImage...。这是发生错误的地方。我得到以下异常:

eException', reason: '*** -[NSArray objectAtIndex:]: index (0) beyond bounds (0)' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x90e806ba __raiseError + 410 
1 libobjc.A.dylib      0x97cde509 objc_exception_throw + 56 
2 CoreFoundation      0x90ec5321 -[__NSArray0 objectAtIndex:] + 209 
3 QTKit        0x9387492c -[QTMovie_QuickTime addImage:forDuration:atTime:withAttributes:] + 708 
4 QTKitServer       0x000208ba do_addImageAtTimeWithAttributes + 327 
5 QTKitServer       0x0000cb03 _XaddImageAtTimeWithAttributes + 291 
6 QTKitServer       0x000021bb QTKitServer_server + 113 
7 QTKitServer       0x0001e194 mach_port_callback + 84 
8 CoreFoundation      0x90dee772 __CFMachPortPerform + 338 
9 CoreFoundation      0x90dea4db __CFRunLoopRun + 6523 
10 CoreFoundation      0x90de8464 CFRunLoopRunSpecific + 452 
11 CoreFoundation      0x90dee3a4 CFRunLoopRun + 84 
12 QTKitServer       0x0001e702 main + 1068 
13 QTKitServer       0x00002141 start + 53 
) 

我身边有很多一派,发现没有真正回答这个问题。代码非常简单,它看起来与大多数代码示例完全相同。图像加载正常,但不会添加。有任何想法吗?这是一个JPEG图像,如果这是相关的。

+0

你已经说过这是一个JPEG图像,但是你在你的属性字典中将'QTAddImageCodecType'设置为'tiff'。这可能与你的问题有关。 – 2011-06-08 02:48:36

回答

2

您的代码没问题。由[NSImage imageNamed:]返回的NSImage实例似乎有问题。
尝试更换该行(假设你的图像复制到该包的资源文件夹):

NSString* imagePath = [[[NSBundle mainBundle] resourcePath]  
         stringByAppendingPathComponent:@"screen-1.jpg"]; 
NSImage* image = [[NSImage alloc] initWithContentsOfFile:imagePath]; 

不要忘记添加[image release]您添加到您的电影。

+1

这就是解决方案!但不是你的版本,我做了:NSData * data = [image TIFFRepresentation]; NSImage * image2 = [[NSImage alloc] initWithData:data];哪些工作。这个问题很奇怪。任何想法有什么错误的形象? – ErikPerik 2011-06-08 12:25:23

+2

我在苹果提交了一个bug。看起来QTKit绊倒了图像名称元数据,该元数据被写入通过[NSImage imageNamed:]加载的任何NSImage对象。 – 2011-06-08 13:43:24