Я пытаюсь динамически добавлять фрагменты .aac (обычно 10 секунд) во время воспроизведения в AVQueuePlayer
, чтобы имитировать воспроизведение AVPlayer
hls.
Однако он воспроизводит песни одну за другой, как я и хотел, между песнями есть промежуток от 200 до 400 мс.
следующий вопрос, кажется, имеет ответ на этот вопрос, но он не работает для меня.
Воспроизведение AVQueuePlayer без разрывов и зависаний
У меня есть одноэлементный проигрыватель и одноэлементный avplayeritem
, чтобы отслеживать последний элемент. то с помощью следующего кода я могу успешно воспроизводить песни с пробелом.
NSURL *url = [NSURL URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
//NSData *urlData = [NSData dataWithContentsOfURL:url];
GlobalPlayer *singleton=[GlobalPlayer sharedManager];
//AVPlayerItem *item=[AVPlayerItem playerItemWithURL:url];
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
NSArray *keys = [NSArray arrayWithObject:@"playable"];
if (singleton.lastItem==nil) {
//initilize player
//NSArray *playerArray=[[NSArray alloc] initWithObjects:item, nil];
//singleton.globPlayer=[[AVQueuePlayer alloc] initWithItems:playerArray];
//[singleton.globPlayer play];
singleton.globPlayer=[[AVQueuePlayer alloc] init];
singleton.lastItem=[AVPlayerItem alloc];
__block AVPlayerItem *playerItem;
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
{
dispatch_async(dispatch_get_main_queue(), ^
{
playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
[singleton.globPlayer insertItem:playerItem afterItem:nil];
singleton.lastItem=playerItem;
[singleton.globPlayer play];
});
}];
}
else
{
//[singleton.globPlayer insertItem:item afterItem:singleton.lastItem];
__block AVPlayerItem *playerItem;
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
{
dispatch_async(dispatch_get_main_queue(), ^
{
playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
[singleton.globPlayer insertItem:playerItem afterItem:singleton.lastItem];
singleton.lastItem=playerItem;
});
}];
}
Должен ли я декодировать фрагменты, а затем передавать PCM на AVQueuePlayer
? Если это единственное решение, как передать NSData, который содержит pcm, в AVPlayerItem
?
http://playlists.ihrhls.com/c5/1469/playlist.m3u8
без каких-либо проблем, между фрагментами .aac нет промежутков. Поэтому я вручную разбираю этот поток hls и добавляю фрагменты .acc вAVQueuePlayer
, но между фрагментами возникает пробел. Мое первое предположение заключалось в том, что проблема заключалась в том, как он декодирует фрагменты или в том, как фрагменты кодируются, но я не уверен. - person Mord Fustang   schedule 08.04.2015