Filtern von Videos mit GPUImage

Ich benutzeGPUImage in meiner Anwendung und versuchen, Video zu filtern. Das Filtern von Live-Videos funktioniert gut. Das Problem tritt auf, wenn ich versuche, ein Video aus dem Dateisystem in den Speicher einzulesen und Filter mit dem auf der Website angegebenen Code anzuwendensunsetlakessoftware Tutorial-Seite und in der SimpleVideoFileFilter-Demo.

BEARBEITEN: Mir ist aufgefallen, dass mein ursprünglicher Beitrag möglicherweise keine ausreichend genaue Frage gestellt hat. Was ich frage ist: Wie genau kann ich ein Video von der Festplatte in den Speicher lesen, einen GPUImageFilter anwenden und dann das Original mit der gefilterten Version überschreiben?

Die Anwendung stürzt mit folgendem Fehler ab:

-[AVAssetWriter startWriting] Cannot call method when status is 2

Status 2 istAVAssetWriterStatusCompleted. Ich habe den gleichen Fehler bei allen drei anderen gesehenAVAssetWriterStatuses.

Ich habe den entsprechenden Code unten gepostet.

GPUImageFilter *selectedFilter = [self.allFilters objectAtIndex:indexPath.item];

// get the file url I stored when the video was initially captured
NSURL *url = [self.videoURLsByIndexPath objectForKey:self.indexPathForDisplayedImage];

GPUImageMovie *movieFile = [[GPUImageMovie alloc] initWithURL:url];
movieFile.runBenchmark = YES;
movieFile.playAtActualSpeed = NO;
[movieFile addTarget:selectedFilter]; // apply the u,ser-selected filter to the file

unlink([url.absoluteString UTF8String]); // delete the file that was at that file URL so it's writeable

// A different movie writer than the one I was using for live video capture.
GPUImageMovieWriter *editingMovieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:url size:CGSizeMake(640.0, 640.0)];

[selectedFilter addTarget:editingMovieWriter];

editingMovieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = editingMovieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:editingMovieWriter];

[editingMovieWriter startRecording];
[movieFile startProcessing]; // Commenting out this line prevents crash

// weak variables to prevent retain cycle
__weak GPUImageMovieWriter *weakWriter = editingMovieWriter;
__weak id weakSelf = self;
[editingMovieWriter setCompletionBlock:^{
    [selectedFilter removeTarget:weakWriter];
    [weakWriter finishRecording];
    [weakSelf savePhotosToLibrary]; // use ALAssetsLibrary to write to camera roll
}];

Vielleicht liegt mein Problem im Umfang des editingMovieWriter. Oder vielleicht die Tatsache, dass ich eine GPUImageMovie-Instanz mit derselben URL initialisiere, unter der ich zu schreiben versuche. Ich habe mehrere Posts auf der Issues-Seite des GPUImage-Githubs, mehrere verwandte Posts auf SO, die Readme-Datei und das oben verlinkte Tutorial gelesen.

Jeder Einblick in dieses Thema wäre sehr dankbar. Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage