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, которые могут помочь отладить проблемы с видео, это было бы здорово!