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 so开发者_JAVA百科me 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.
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.
精彩评论