1

我用几个视频剪辑创建了一个合成,我还添加了一些空白范围,我用 CoreAnimation 显示标题屏幕。

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

等等...一切正常,当我开始使用时出现问题:AVMutableVideoComposition、AVMutableVideoCompositionInstruction 和 AVMutableVideoCompositionLayerInstruction,我必须这样做才能正确旋转视频。

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

在我的 AVPlayer 中工作正常,但如果我这样做:

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

下次我推送新的视图控制器或在导航控制器堆栈中弹出当前视图控制器时,应用程序会崩溃。有时有内存警告有时没有它,但根据仪器我只分配了 1.5Mb。

去年 WWDC 的 AVFoundation 中的 Working With Media 我已经看过好几次了,我唯一能想到的就是评论

AVMutableVideoCompositionInstruction 不得重叠或包含间隙。

它真的没有。我有整个作文时间的说明。但是 AVMutableCompositionTrack(我的视频轨道)中存在一些空白,我不打算展示视频,而只展示 CoreAnimation 层。

有没有其他人遇到过类似的问题?

4

3 回答 3

1

扩展 Erik 的解决方案,这就是我所做的。我创建了一个非常简短的黑色影片剪辑,并将其添加到空白时间范围的尾部。它似乎工作正常,但我希望存在更优雅的解决方案。(请注意,在我的代码中,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

您需要在轨道上使用 InsertEmptyTimeRange 方法,以便轨道上没有间隙。

有关更多信息,请参阅扩展 AVMutableComposition 。

于 2012-08-18T15:59:39.917 回答
0

在某些情况下插入空时间范围有效,但我们发现它不够好,因为当我们让用户快退/快进并在时间栏上更改时它会中断。为了解决这个问题,我们在没有其他内容显示时添加了一个黑色视频剪辑。

于 2012-09-07T04:27:15.837 回答