0

録画したビデオからサムネイルを取得する必要があるアプリを構築しています。アルファ ビデオ フレームの配列があります。フレームの各セットをマージしてから、これらの最終フレームでムービーを作成する必要があります。ここに私が扱っているコードがあります:

-(void)createFrameForVideo {

NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/movie.mp4"]];
NSURL *outputURL = [NSURL fileURLWithPath:filePath];
player = [[MPMoviePlayerController alloc]initWithContentURL:outputURL];
float frame = 0.00;
int count = 14;

NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
docPath = [docPath stringByAppendingPathComponent:@"OutPut"];
BOOL success = [fileManager fileExistsAtPath:docPath];

if (success) {
    [fileManager removeItemAtPath:docPath error:nil];
}
[fileManager createDirectoryAtPath:docPath withIntermediateDirectories:YES attributes:nil error:nil];

for (frame = (frameStartTime); frame < (frameStartTime+7); frame+=0.033)
{
    @autoreleasepool
    {
UIImage * singleFrameImage = [player thumbnailImageAtTime:frame timeOption:MPMovieTimeOptionExact];
[player pause];
NSString *imageName = [NSString stringWithFormat:@"export2%d.png",count];
    NSString * file = [[NSBundle mainBundle]pathForResource:imageName ofType:nil];
UIImage *overlayImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:file]];

count = count + 1;
NSString *imagePath = [NSString stringWithFormat:@"%@/%@", docPath, imageName];
if (overlayImage)
    {
        UIImage *  outImage = [self mergeImage:singleFrameImage withImage:overlayImage];
        NSData *imgData = [[NSData alloc] initWithData:UIImagePNGRepresentation(outImage)];
        [fileManager createFileAtPath:imagePath contents:imgData attributes:nil];
        [imgData release];
    }
    else
    {
    NSData *imgData = UIImagePNGRepresentation(singleFrameImage);
         [fileManager createFileAtPath:imagePath contents:imgData attributes:nil];

    }
    [outputFramesArray addObject:imagePath];

    }
}

[player release];

if([fileManager fileExistsAtPath:filePath])
{
[fileManager removeItemAtPath:filePath error:nil];

}

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"/Documents/movie1.mp4"]];
NSLog(@"filePath %@", path);

if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}

[self writeImageAsMovie:outputFramesArray toPath:path size:CGSizeMake(480, 320) duration:10]; NSLog(@"こんにちはレイヤリングが完了しました"); [outputFramesArray removeAllObjects]; [outputFramesArray リリース];

success = [fileManager fileExistsAtPath:docPath];
if (success) {
    [fileManager removeItemAtPath:docPath error:nil];
}

//[self performSelectorOnMainThread:@selector(CompileFilesToMakeMovieWithAudio) withObject:Nil waitUntilDone:YES];

[self CompileFilesToMakeMovieWithAudio];
//  [self compileFinalOutputMovie];

}

問題は、ループ全体でフレームを処理するのに時間がかかることです。誰でもプロセスをスピードアップするのを手伝ってください。私はすでにffmpegを試しましたが、問題はマージにあると思います。誰か提案があれば、共有してください。

4

2 に答える 2

0

楽器を使って、あなたの記憶がどこに縛られているのか、そして漏れがあるかどうかを確かめてみてください。

私は最近、そのようなループで絶えず実行されるコードの一部のリークで同様の問題を抱えていました。ローカル変数をインスタンス変数に変更してから、変数を再利用するだけで、アプリケーションに大量のメモリが割り当てられるのを防ぐことができました。

于 2012-12-21T19:34:33.083 に答える