1

いくつかのビデオ クリップでコンポジションを作成し、CoreAnimation でタイトル画面を表示するいくつかの空の範囲も追加します。

|--Video1--|--NoVideo(AVsyncLayer)--|--Video2--|

など...すべて正常に動作しますが、ビデオを適切に回転させるために必要なAVMutableVideoComposition、AVMutableVideoCompositionInstruction、およびAVMutableVideoCompositionLayerInstructionを使用し始めると問題が発生します。

|--Video1--|--NoVideo(AVsyncLayer)--|

私の AVPlayer では正常に動作しますが、代わりに次のようにすると:

|--NoVideo(AVsyncLayer)--|--Video1--|

次に新しいビュー コントローラーをプッシュするか、現在のビュー コントローラーをナビゲーション コントローラー スタックにポップすると、アプリケーションがクラッシュします。メモリの警告が表示されることもあれば、表示されないこともありますが、計測器によると、1.5Mb しか割り当てられませんでした。

昨年の WWDC の AVFoundation でのメディアの操作を何度か見ましたが、思いつくのは次のコメントだけです。

AVMutableVideoCompositionInstruction は、重複したりギャップを含んだりしてはなりません。

それは本当にそうではありません。作曲の全期間についての指示があります。しかし、AVMutableCompositionTrack (私のビデオ トラック) には、ビデオを表示する予定がなく、CoreAnimation レイヤーのみを表示する予定のギャップがあります。

他の誰かが同様の問題を経験しましたか?

4

3 に答える 3

1

エリックのソリューションを拡張して、これが私がしたことです。非常に短い黒いムービークリップを作成し、これを空の時間範囲の最後に追加します。もっとエレガントな解決策が存在することを願っていますが、それはうまくいくようです。(私のコードでは、TMAVCompositionTrackは、オーディオとビデオ、およびその他のAVMutableCompositionTrackを保持する単なるラッパーであることに注意してください。

- (void)createEmptySpaceOnTrack:(TMAVCompositionTrack*)avtrack timeRange:(CMTimeRange)timeRangeOfShot {
        [avtrack.videoCompositionTrack insertEmptyTimeRange:timeRangeOfShot];
        [avtrack.audioCompositionTrack insertEmptyTimeRange:timeRangeOfShot];

        // there is a bug where emptyness is trimmed out, so put a brief burst of video blackness at the end of the "emptyness"
        NSURL* assetURL = [[NSBundle mainBundle] URLForResource:@"blackness" withExtension:@"mov"];
        AVAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:@{ AVURLAssetPreferPreciseDurationAndTimingKey:@(YES) }];
        AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        CMTimeRange timeRangeInAsset = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(0.01, 600));
        CMTime tailEnd = CMTimeSubtract(CMTimeRangeGetEnd(timeRangeOfShot), timeRangeInAsset.duration);
        [avtrack.videoCompositionTrack insertTimeRange:timeRangeInAsset ofTrack:clipVideoTrack atTime:tailEnd  error:nil];
    }
于 2012-10-09T14:36:16.447 に答える
0

空の時間範囲の挿入が機能する場合もありますが、ユーザーに巻き戻し/早送りをさせてタイムバーを変更させると壊れてしまうため、十分ではありませんでした。これを解決するために、他に何も表示されていないときに黒いビデオ クリップを追加しました。

于 2012-09-07T04:27:15.837 に答える
0

トラックにギャップがないように、トラックで InsertEmptyTimeRange メソッドを使用する必要があります。

詳細については、AVMutableComposition の拡張を参照してください。

于 2012-08-18T15:59:39.917 に答える