QTMovie index of out bounds exception when trying to addImage:forDuration:withAttributes

3

I am trying to create a movie in Cocoa using QTKit. This movie should consist of a bunch of NSImage's that I have created. I'm running into some problems with this. The overall problem is that the movie isn't created. I get a file which appears to be empty, only contains a couple of hundred bytes, but no movie to speak of. Anyway, the code is:

- (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];
}

The line to keep an eye on is the [movie addImage.... This is where the error occurs. I get the following exception:

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
)

I have googled around a lot and found nothing that really answers this question. The code is pretty straightforward, it looks exactly the same as most code samples out there. The image is loaded fine, but it isn't added at all. Any ideas? It's a JPEG-image if that is relevant.

objective-c
cocoa
movie
qtkit
asked on Stack Overflow Jun 7, 2011 by Erik Rothoff

1 Answer

2

Your code is fine. There seems to be a problem with the NSImage instance that is returned by [NSImage imageNamed:].
Try to replace that line with (assuming you image is copied into the bundle's resource folder):

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

Don't forget to add [image release] after you added it to your movie.

answered on Stack Overflow Jun 8, 2011 by Thomas Zoechling • edited Jun 8, 2011 by Thomas Zoechling

User contributions licensed under CC BY-SA 3.0