0

我有 3 个视频,我正在使用 an 进行排序AVMutableComposition,然后使用 an 播放视频AVPlayer并使用AVPlayerItemVdeoOutput. 视频序列如下:

[Logo Video - n seconds][Main video - m seconds][Logo Video - l seconds]

代码如下所示:

    // Build the composition.
    pComposition            = [AVMutableComposition composition];

    // Fill in the assets that make up the composition
    AVMutableCompositionTrack* pCompositionVideoTrack   = [pComposition addMutableTrackWithMediaType: AVMediaTypeVideo preferredTrackID: 1];
    AVMutableCompositionTrack* pCompositionAudioTrack   = [pComposition addMutableTrackWithMediaType: AVMediaTypeAudio preferredTrackID: 2];

    CMTime          time            = kCMTimeZero;
    CMTimeRange     keyTimeRange    = kCMTimeRangeZero;
    for( AVAsset* pAssetsAsset in pAssets )
    {
        AVAssetTrack*   pAssetsAssetVideoTrack  = [pAssetsAsset tracksWithMediaType: AVMediaTypeVideo].firstObject;
        AVAssetTrack*   pAssetsAssetAudioTrack  = [pAssetsAsset tracksWithMediaType: AVMediaTypeAudio].firstObject;

        CMTimeRange     timeRange               = CMTimeRangeMake( kCMTimeZero, pAssetsAsset.duration );

        NSError*        pVideoError             = nil;
        NSError*        pAudioError             = nil;

        if ( pAssetsAssetVideoTrack )
        {
            [pCompositionVideoTrack insertTimeRange: timeRange ofTrack: pAssetsAssetVideoTrack atTime: time error: &pVideoError];
        }
        if ( pAssetsAssetAudioTrack )
        {
            [pCompositionAudioTrack insertTimeRange: timeRange ofTrack: pAssetsAssetAudioTrack atTime: time error: &pAudioError];
        }

        if ( pAssetsAsset == pKeyAsset )
        {
            keyTimeRange    = CMTimeRangeMake( time, timeRange.duration );
        }

        NSLog( @"%@", [pVideoError description] );
        NSLog( @"%@", [pAudioError description] );

        time        = CMTimeAdd( time, pAssetsAsset.duration );
    }

徽标视频是无声的,仅显示我的徽标。我手动创建这些视频,所以这里的一切都很完美。然而,“主视频”可能会以错误的方向结束。为了解决这个问题,AVMutableVideoComposition看起来像是一个完美的前进方式。所以我设置了一个简单的视频合成,它执行一个简单的 setTransform,如下所示:

pAsset = pComposition; pPlayerItem = [AVPlayerItem playerItemWithAsset: pAsset]; pPlayer = [AVPlayer playerWithPlayerItem: pPlayerItem];

    NSArray*        pPlayerTracks   = [pAsset tracksWithMediaType: AVMediaTypeVideo];
    AVAssetTrack*   pPlayerTrack    = pPlayerTracks[0];

    pVideoCompositionLayerInstruction               = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstruction];
    [pVideoCompositionLayerInstruction setTransform: [[pKeyAsset tracksWithMediaType: AVMediaTypeVideo].firstObject preferredTransform] atTime: kCMTimeZero];

    pVideoCompositionInstruction                    = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    pVideoCompositionInstruction.backgroundColor    = [[UIColor blackColor] CGColor];
    pVideoCompositionInstruction.timeRange          = keyTimeRange;
    pVideoCompositionInstruction.layerInstructions  = @[ pVideoCompositionLayerInstruction ];

    pVideoComposition                               = [AVMutableVideoComposition videoComposition];
    pVideoComposition.renderSize                    = [[pKeyAsset tracksWithMediaType: AVMediaTypeVideo].firstObject naturalSize];
    pVideoComposition.frameDuration                 = [[pKeyAsset tracksWithMediaType: AVMediaTypeVideo].firstObject minFrameDuration];
    pVideoComposition.instructions                  = @[ pVideoCompositionInstruction ];

    pPlayerItem.videoComposition    = pVideoComposition;

但是,当我开始播放视频序列时,我没有返回任何输出。AVPlayerItemVideoOutput hasNewPixelBufferForItemTime总是返回NO。如果我注释掉上面代码中的最后一行(即设置 videoComposition),那么一切都会像以前一样工作(视频方向错误)。有人知道我做错了什么吗?任何想法都非常感谢!

4

1 回答 1

2

这里的问题是,keyTimeRange如果您的徽标视频的持续时间不为零,则它可能不会在零时间开始。pVideoCompositionInstruction将从 开始keyTimeRange.start,而不是 kCMTimeZero (当 AVMutableComposition 开始时),这违反了AVVideoCompositionInstructions

“对于数组中的第一条指令,timeRange.start 必须小于或等于尝试播放或其他处理的最早时间(通常是 kCMTimeZero)”,根据文档

为了解决这个问题,设置一个包含三个对象pVideoComposition.instructions的数组,每个对象根据每个 AVAsset 的变换都有自己的。三个指令中每一个的时间范围应该是这些资产出现在合成轨道中的时间。确保它们完全对齐。AVMutableVideoCompositionInstructionAVMutableVideoCompositionLayerInstruction

于 2015-03-05T19:26:26.657 回答