Вставка HTTP-потока в AVMutableComposition - PullRequest
14 голосов
/ 30 ноября 2011

Я пытаюсь вставить AVURLAsset объекта AVPlayerItem, который сообщает AVPlayerItemStatusReadyToPlay в AVMutableComposition, например:

composition_ = [[AVMutableComposition alloc] init];
insertionPoint_ = kCMTimeZero;
item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]] retain];
[item_ addObserver:self forKeyPath:@"status" options:0 context:nil];
player_ = [[AVPlayer playerWithPlayerItem:item_] retain];
[player_ addObserver:self forKeyPath:@"currentItem.duration" options:0 context:nil];


/**
 * append a player-item to our composition 
 */
- (void)addItemToComposition:(AVPlayerItem *)item
{
    NSError *error = nil;
    VTRACE(@"item duration: %g", CMTimeGetSeconds(item.duration));
    if (![composition_ insertTimeRange:CMTimeRangeMake(kCMTimeZero, item.duration) 
                              ofAsset:item.asset
                               atTime:insertionPoint_ 
                                error:&error]) 
    {
        VTRACE(@"error: %@", error);
    }
}

/**
 * simplified value observer callback
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[AVPlayerItem class]])
    {
        AVPlayerItem *item = (AVPlayerItem *)object;
        //playerItem status value changed?
        if ([keyPath isEqualToString:@"status"])
        {   //yes->
            switch(item.status)
            {
                case AVPlayerItemStatusFailed:
                    VTRACE(@"player item status failed");
                break;
                case AVPlayerItemStatusReadyToPlay:
                    VTRACE(@"player item status is ready to play");
                    [self addItemToComposition:player_.currentItem];
                break;
                case AVPlayerItemStatusUnknown:
                    VTRACE(@"player item status is unknown");
                break;
            }
        }
    }
    else if([object isKindOfClass:[AVPlayer class]])
    {
        if ([keyPath isEqualToString:@"currentItem.duration"])
        {   //yes->
            VTRACE(@"player item duration available");
        }
    }
}

К сожалению, все, что я получаю, это паршивое сообщение об ошибке при попытке вызватьAVMutableComposition insertTimeRange:ofAsset:atTime:error:

2011-11-29 22: 24: 59.446 XXX [13626: 10703] - [XXX addItemToComposition:] - ошибка: Ошибка домена = код AVFoundationErrorDomain = -11800 "Операция можетне завершено "UserInfo = 0x7699f30 {NSLocalizedFailureReason = Произошла неизвестная ошибка (-12780), NSUnderlyingError = 0xd124dd0" Операция не может быть завершена. (Ошибка OSStatus -12780.) ", NSLocalizedDescription = Операция не может быть завершена}

Чего мне не хватает?

Почему невозможно вставить предмет в композицию?

При проверке AVURLAsset этого AVPlayerItem я также заметил, что массив дорожек выделен, но пуст.Может ли это быть причиной, и если да, то как заставить AVURLAsset правильно хранить действительные треки?

1 Ответ

13 голосов
/ 02 декабря 2011

Ну, я получил ответ из другого источника, и он мне не нравится ...

Очевидно, что возможно вставлять только локальные элементы (ресурсы) в AVMutableComposition, удаленные элементы (например, HTTP)видео потоки) не будет работать.

Тот факт, что в документации об этом не говорится, и тот факт, что сообщение об ошибке, которое я получаю, бесполезен, кажется упущением Apple.Я сделал отчет об ошибке, чтобы улучшить эту ситуацию.

Apple Radar Bug Id: 10517711

Отчет об ошибках открытого радара .

...