0

有人可以指出正确的方向来帮助我调试为什么我在 ios 6.1 中的 AVPlayerItem 的 AVMutuableComposition 不能正确加载曲目列表。

我正在做的是创建一个 AVMutableCompositionTrack 并从同一个 mp4 添加时间范围以进行播放。这对我来说与其他文件一起工作正常,但我有一些文件以每秒 30 帧的速度以 720p 编码,它们不会正确创建曲目列表。我想无缝地按顺序显示它们。

这是我的一些代码:

    - (AVPlayerItem *) loadVideoByAVComposition
    {
        AVComposition *composition = [ self loadCompositionTracks];
        AVComposition *immutableSnapshotComposition = [composition copy];
        AVPlayerItem *playerItemForComposition = [[AVPlayerItem alloc]initWithAsset:immutableSnapshotComposition];

        return playerItemForComposition;
     }

加载曲目:

    -(AVMutableComposition *) loadCompositionTracks
    {
        AVMutableComposition *composition = [[AVMutableComposition alloc]init];
        NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:[NSNumber  numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey];

        AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

        // hard coded test mp4
        NSString *videoFileName = @"avi.mp4";
        AVAsset  *asset = [self getAVAssetByFileName:videoFileName optsDict:optionsDictionary];

        if (asset == nil) { return nil; }

        // add some track items
        [self addTrackList:compositionVideoTrack asset:asset];

        return composition;
    }

我们创建这些文件的桌面应用程序按视频文件的帧数和持续时间导出信息。所以我从这些开始并转换为秒以添加到曲目列表中。

    -(void)addTrackList:(AVMutableCompositionTrack *)track asset:(AVAsset *)asset
    {
        if (track == nil) { return; }

        CMTime insertionPointTime = kCMTimeZero;

        // add some test track insert points
        insertionPointTime =  [self addTrackItems:track asset:asset start:100 duration:800 insertTime:insertionPointTime];
        insertionPointTime =  [self addTrackItems:track asset:asset start:1500 duration:600 insertTime:insertionPointTime];
        insertionPointTime =  [self addTrackItems:track asset:asset start:2500 duration:500 insertTime:insertionPointTime];

     }

这是将时间范围实际添加到 AVMutuableComposition 的方法

    -(CMTime)addTrackItems:(AVMutableCompositionTrack *)track asset:(AVAsset *)asset start:(NSUInteger)start duration:(NSUInteger)duration insertTime:(CMTime)insertTime
    {
        if (track == nil) { return insertTime; }

        NSError *videoError = nil;

        Float64 secondsCalc = (start / 30);
        CMTime startTime =  CMTimeMakeWithSeconds(secondsCalc, 600);

        secondsCalc = duration / 30;
        CMTime cmDuration = CMTimeMakeWithSeconds(secondsCalc, 600);

        CMTimeRange timeRange = CMTimeRangeMake(startTime, cmDuration);

        // add video track
        AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        [track insertTimeRange:timeRange ofTrack:clipVideoTrack atTime:insertTime error:&videoError];

       if (videoError != nil)
       {
            NSLog(@"");
            NSLog(@"Error while adding track to composition");       
       }

       // calculate for next insert point
       CMTime resultInsertionPointTime = CMTimeAdd(insertTime, timeRange.duration);

       return resultInsertionPointTime;
    }

所以这段代码适用于一些视频文件,但其中一些可能只加载第一个轨道,然后不加载其他轨道等。只是得到黑帧或视频停止。基本上它没有正确构建曲目列表。那么如何调试从负载返回的任何警告或错误代码,以告诉我 TimeRanges 是否有效等。

除了可以解释加载过程的苹果文档之外,还有其他好的资源吗?苹果文档很少。我也已经看过一些 wwdc 会议。任何帮助将不胜感激。谢谢!

4

1 回答 1

0

看起来在我的桌面应用程序中导出的视频是格式错误的 h.264 视频。AVComposition 对象没有正确播放它的容差,即使它在桌面等上正确播放也是如此。这并不奇怪,因为 Ipad 希望 h.264 视频遵守某些参数。

如果有人知道 ios 上可以帮助调试视频问题的工具,那就太好了!

于 2013-05-07T17:06:13.470 回答