Найти активы в библиотеке - добавить в AVMutableComposition - export = crash - PullRequest
1 голос
/ 05 июля 2011

Я пытался добавить ресурсы из библиотеки фотографий iPhone в AVMutableComposition и затем экспортировать их. Вот что я получил:

Поиск активов: (здесь я беру AVURLAsset)

-(void) findAssets {

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

// Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    // Within the group enumeration block, filter to enumerate just videos.
    [group setAssetsFilter:[ALAssetsFilter allVideos]];
    [group enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop){

        // The end of the enumeration is signaled by asset == nil.
        if (alAsset) {
            ALAssetRepresentation *representation = [alAsset defaultRepresentation];
            NSURL *url = [representation url];
             AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
            // Do something interesting with the AV asset.

            [thumbs addObject:alAsset];
            [assets addObject:avAsset];
        }else if(alAsset == nil){
            [self createScroll];
        }
    }];
}
                     failureBlock: ^(NSError *error) {
                         // Typically you should handle an error more gracefully than this.
                         NSLog(@"No groups");
                     }];
[library release];

}

Здесь я добавляю актив в свою композицию (первый объект в массиве я использую только для тестирования.

-(void) addToCompositionWithAsset:(AVURLAsset*)_asset{
NSError *editError = nil;
composition = [AVMutableComposition composition];
AVURLAsset* sourceAsset = [assets objectAtIndex:0];

Float64 inSeconds = 1.0;
Float64 outSeconds = 2.0;
// calculate time
CMTime inTime = CMTimeMakeWithSeconds(inSeconds, 600);
CMTime outTime = CMTimeMakeWithSeconds(outSeconds, 600);
CMTime duration = CMTimeSubtract(outTime, inTime);
CMTimeRange editRange = CMTimeRangeMake(inTime, duration);
[composition insertTimeRange:editRange ofAsset:sourceAsset atTime:composition.duration error:&editError];

if (!editError) {
    CMTimeGetSeconds (composition.duration);
}

} И, наконец, я экспортирую комп и вот он вылетает

-(void)exportComposition {
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetPassthrough];

NSLog (@"can export: %@", exportSession.supportedFileTypes);

NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [dirs objectAtIndex:0];
NSString *exportPath = [documentsDirectoryPath stringByAppendingPathComponent:EXPORT_NAME];

[[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
NSURL *exportURL = [NSURL fileURLWithPath:exportPath];

exportSession.outputURL = exportURL;
exportSession.outputFileType = AVFileTypeQuickTimeMovie;//@"com.apple.quicktime-movie";

[exportSession exportAsynchronouslyWithCompletionHandler:^{
    NSLog (@"i is in your block, exportin. status is %d",
           exportSession.status);
    switch (exportSession.status) {
        case AVAssetExportSessionStatusFailed:
        case AVAssetExportSessionStatusCompleted: {
            [self performSelectorOnMainThread:@selector (exportDone:)
                                   withObject:nil
                                waitUntilDone:NO];
            break;
        }
    };
}];

}

Кто-нибудь имеет представление о том, что это может быть? Вылетает на

AVAssetExportSession * exportSession = [[AVAssetExportSession alloc] initWithAsset: набор presetName: AVAssetExportPresetPassthrough];

А я пробовал разные пресеты и выходные типы файлов.

Спасибо

* решено *

1 Ответ

2 голосов
/ 05 июля 2011

Теперь я должен ответить на свой вопрос, когда решу. Удивительно, что я боролся с этим целый день, а потом исправляю это сразу после публикации вопроса:)

Я изменился и переехал:

Композиция = [AVMutableComposition Состав];

до:

состав = [[AVMutableComposition alloc] init];

Мне кажется, я слишком устал, когда вчера работал над этим. Спасибо, ребята!

...