ios AVMutuableComposition Список треков и отладка

Может кто-то указать мне правильное направление, чтобы помочь мне отладить, почему мой AVMutuableComposition для AVPlayerItem в ios 6.1 не загружает список дорожек правильно.

То, что я делаю, - это создание AVMutableCompositionTrack и добавление к нему временных диапазонов из того же mp4 для воспроизведения. Это работает правильно для меня с другими файлами, но у меня есть некоторые файлы, которые были закодированы с разрешением 720p со скоростью 30 кадров в секунду, и они не будут правильно создавать список дорожек. Я хочу отображать их по порядку, без проблем.

Вот часть моего кода:

    - (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;
    }

Таким образом, этот код работает с некоторыми видеофайлами, но некоторые из них могут загружать только 1-ю дорожку, а затем не загружать другие дорожки и т. Д. Просто получите черные кадры или остановки видео. По сути, это неправильно строит список треков. Так как я могу отлаживать любые предупреждения или коды ошибок, возвращаемые из загрузки, чтобы сказать мне, действительны ли временные диапазоны и т. Д.

Есть ли другие полезные ресурсы, кроме документации Apple, которые могут объяснить процессы загрузки. Apple документация скудная. Я уже рассмотрел некоторые из сессий wwdc. Любая помощь будет принята с благодарностью. Спасибо!

1 ответ

Решение

Похоже, что видео, которое было экспортировано в моем настольном приложении, было искажено видео h.264. У объекта AVComposition отсутствует допуск для правильного воспроизведения, даже если он правильно воспроизводится на рабочем столе и т. Д. Не удивительно, поскольку Ipad хочет, чтобы видео h.264 придерживалось определенных параметров.

Если кто-нибудь знает инструменты на ios, которые могут помочь отладить проблемы с видео, это было бы здорово!

Другие вопросы по тегам