2

Web サイト サービス用にフォト ライブラリからビデオ ファイルを再エンコードする必要があります。以下のコードを試してみましたが、「ビデオ合成には合成指示が必要です」のようなエラーが発生しました。

(コード)

AVAsset *anAsset = [[AVURLAsset alloc] initWithURL:videoFileUrl options:nil];
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:anAsset];
if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]) {

    self.exportSession = [[AVAssetExportSession alloc]
                          initWithAsset:anAsset presetName:AVAssetExportPresetPassthrough];



    AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];

    AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, anAsset.duration) ofTrack:[[anAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];

    AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];


    AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,nil];


    AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];
    MainCompositionInst.frameDuration = CMTimeMake(1, 30);    // bit rate
    MainCompositionInst.renderSize = CGSizeMake(640, 480);    // frame rate

    [self.exportSession setVideoComposition:MainCompositionInst];

    NSURL *furl = [NSURL fileURLWithPath:self.tmpVideoPath];

    self.exportSession.outputURL = furl;

    self.exportSession.outputFileType = AVFileTypeQuickTimeMovie;

    CMTime start = CMTimeMakeWithSeconds(self.startTime, anAsset.duration.timescale);
    CMTime duration = CMTimeMakeWithSeconds(self.stopTime-self.startTime, anAsset.duration.timescale);
    CMTimeRange range = CMTimeRangeMake(start, duration);
    self.exportSession.timeRange = range;

    self.trimBtn.hidden = YES;
    self.myActivityIndicator.hidden = NO;
    [self.myActivityIndicator startAnimating];
    [self.exportSession exportAsynchronouslyWithCompletionHandler:^{

        switch ([self.exportSession status]) {
            case AVAssetExportSessionStatusFailed:
                NSLog(@"Export failed: %@", [[self.exportSession error] localizedDescription]);
                break;
            case AVAssetExportSessionStatusCancelled:
                NSLog(@"Export canceled");
                break;
            default:
                NSLog(@"NONE");
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self.myActivityIndicator stopAnimating];
                    self.myActivityIndicator.hidden = YES;
                    self.trimBtn.hidden = NO;
                    [self playMovie:self.tmpVideoPath];
                });

                break;
        }
    }];

}

}

フレームレートとビットレートを変更しなくても、完全に機能します。何かアドバイスをください。ありがとう。

4

2 に答える 2

0

確かではありませんが、いくつかの点を確認してください。残念ながら、AVFoundation のこれらのケースでは、エラー メッセージから多くの情報を得ることはできません。

一般的に、私は物事をシンプルにしてゆっくりと機能を追加します。最初に、すべてのレイヤーがゼロから開始し、最終デュレーションで終了するようにします。メインコンポジションについても同じことを行います。無効な時間により、このようなエラーが発生する場合があります。指示については、同時に開始し、同時に終了することも確認してください

于 2013-10-25T15:43:56.417 に答える