0

私の脳はスクランブルエッグのように感じます... 私はビデオクリップを一緒にマージしようとしています. 各クリップの URL を NSMutableArray (arrayClipURL) に保存していますが、これで問題ありません。デバッグ コンソールで timeRanges と track (両方とも NSMutableArrays) を出力すると、すべてがチェックアウトされます。これは、for ループが機能していることを意味します。例外エラーが発生し続けます: ' * -[__NSArrayM insertObject:atIndex:]: object cannot be nil'.

例外ブレークポイントをスローし、その下の最後の行でブレークしました。timeRanges と track の両方が nil ではないため、わかりません...デバッグコンソールでそれらを印刷し、改行の直前で問題なく表示できます。

composition = [[AVMutableComposition composition] init];

composedTrack = [[AVMutableCompositionTrack alloc] init];
composedTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo
                                         preferredTrackID:kCMPersistentTrackID_Invalid];

NSMutableArray * timeRanges = [[NSMutableArray alloc] initWithCapacity:arrayClipURL.count];
NSMutableArray * tracks = [[NSMutableArray alloc] initWithCapacity:arrayClipURL.count];

for (int i=0; i<[arrayClipURL count]; i++){
    AVURLAsset *assetClip = [[AVURLAsset alloc] initWithURL:[arrayClipURL objectAtIndex:i] options:nil];
    AVAssetTrack *clipTrack = [[AVAssetTrack alloc] init];
    clipTrack = [[assetClip tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, assetClip.duration)]];
    [tracks addObject:clipTrack];
}
debug(@"timeranges:  %@",timeRanges);
debug(@"tracks:  %@",tracks);

[composedTrack insertTimeRanges:timeRanges ofTracks:tracks atTime:kCMTimeZero error:nil]; 

ベテランの支援が必要です :( 何が問題を引き起こしているのか、何か考えはありますか?

編集: 2 つの配列がコンソールにどのように表示されるかを次に示します。私が考えることができる唯一のことは、おそらく CMTimeRange または AVAssetTrack が配列内で適切にフォーマットされていないということです??? 何も思いつきません。例外がスローされたときに実際に挿入しようとしているものを確認するのに役立つかもしれないと思っただけです。

    2013-02-18 13:18:20.811 app[5242:907] [AVCaptureManager.m:401] timeranges array:  (
    "CMTimeRange: {{0/1 = 0.000}, {498/600 = 0.830}}",
    "CMTimeRange: {{0/1 = 0.000}, {556/600 = 0.927}}"
)
2013-02-18 13:18:20.812 app[5242:907] [AVCaptureManager.m:402] tracks array:  (
    "<AVAssetTrack: 0x220c21a0, trackID = 1, mediaType = vide>",
    "<AVAssetTrack: 0x1cdec820, trackID = 1, mediaType = vide>"
)
4

1 に答える 1

1

問題は、AVURLAssetインスタンスのスコープが原因で発生します

forループの内側にAVURLAsset*assertClipを挿入しているため、forループの外側では無効であり、抽出したトラックも無効です。

あなたのassetClipをあなたのforループのスコープを生き残る配列に保つなら、それはあなたの問題を修正するはずです

于 2013-02-18T20:17:16.950 に答える