Вставка HTTP-потока в AVMutableComposition
Я пытаюсь вставить 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:] - error: Error Domain = AVFoundationErrorDomain Code = -11800 "Операция не может быть завершена" UserInfo = 0x7699f30 {NSLocalizedFailureReason = Произошла неизвестная ошибка (-12780), NSUnderlyingError = 0xd124dd0 "Операция не может быть завершена. (Ошибка OSStatus -12780.)", NSLocalizedDescription = Операция может не заполняется}
Что мне не хватает?
Почему невозможно вставить элемент в композицию?
При проверке AVURLAsset
этого AVPlayerItem
я также заметил, что массив треков выделен, но пуст. Может ли это быть причиной, и если да, то как мне заставить AVURLAsset
правильно удерживать допустимые дорожки?
Ответы
Ответ 1
Ну, я получил ответ от другого источника, и мне это не нравится...
По-видимому, возможно только вставить локальные элементы (активы) в AVMutableComposition
, удаленные элементы (например, потоки видео HTTP) не будут работать.
Тот факт, что документация не говорит об этом, и тот факт, что сообщение об ошибке, которое я получаю, бесполезно, кажется, является упущением Apple. Я сделал файл с ошибкой, чтобы улучшить эту ситуацию.
Идентификатор ошибки Apple Radar: 10517711
Открыть отчет об ошибке Radar.