我正在使用QTCaptureSession从iSight相机录制视频。
我想在视频的末尾添加一个图像,所以我已经实现了didFinishRecordingToOutputFileAtURL委托方法。以下是我迄今为止所做的:
- (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error
{
// Prepare final video
QTMovie *originalMovie = [QTMovie movieWithURL:outputFileURL error:nil];
[originalMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];
NSImage *splashScreen = [NSImage imageNamed:@"video-ending.jpg"];
NSImage *tiffImage = [[NSImage alloc] initWithData:[splashScreen TIFFRepresentation]];
id attr = [NSDictionary dictionaryWithObjectsAndKeys:@"tiff",
QTAddImageCodecType,
[NSNumber numberWithLong:codecHighQuality], QTAddImageCodecQuality,
nil];
[originalMovie addImage:tiffImage forDuration:QTMakeTime(2, 1) withAttributes:attr];
[tiffImage release];
[originalMovie updateMovieFile];
}
这个代码的问题是,虽然quicktime玩得很好,但其他玩家却没有。我肯定我错过了一些基本的东西。
在视频保存之前将图像添加到视频中也很酷(避免两次保存)。以下是我现在停止录制的方法:
- (void)stopRecording
{
// It would be cool to add an image here
[mCaptureMovieFileOutput recordToOutputFileURL:nil];
}
虽然我使用了Cocoa touch,但这可能仍然适用。根据我为电影创作图像的经验,我有两个建议。首先,虽然我敢打赌addImage:forDuration处理了很多AVAssetExportSessions所没有的事情,但我必须确保图像的添加频率超过每秒几次,否则它们不会很好地适用于所有玩家。其次,如果有一个网络流选项,比如AVAssetExportSession shouldOptimizeForNetworkUse
,可以在电影中向前移动尽可能多的元数据和标题,我发现它也使视频与更多的播放器兼容。