2016-04-14 2 views
2

Я использую структуру AVFoundation для потокового воспроизведения в реальном времени. Теперь у меня есть плейлист, подобный нижеКак получить EXT-X-PROGRAM-DATE-TIME из плейлиста

#EXT-X-VERSION:4 
#EXT-X-ALLOW-CACHE:NO 
#EXT-X-MEDIA-SEQUENCE:8148007 
#EXT-X-TARGETDURATION:6 
#EXT-X-PROGRAM-DATE-TIME:1972-04-14T08:51:01.497Z 

Я думаю, что AVPlayer запросит этот плейлист. Могу ли я использовать классы в AVFoundation для извлечения EXT-X-TARGETDURATION и EXT-X-PROGRAM-DATE-TIME. Если нет, другие способы? Спасибо

+0

Как вы получили именно эту информацию? Вы вошли в систему? http://stackoverflow.com/questions/13039577/using-avplayer-in-ios-can-you-know-the-current-ts-file-or-the-current-timestamp? – Larme

+0

Нет, я использую Чарльза для регистрации. – RayChen

+0

извините, не могли бы вы указать более подробно @AshishKakkad – RayChen

ответ

1

Я не думаю, что AVFoundation предоставляет доступ ко всем этим тегам. Однако, когда мне нужно отлаживать потоки, я использую пользовательский NSURLProtocol, чтобы перехватить весь трафик. Я иногда думаю, что это лучше, чтобы увидеть необработанный список воспроизведения и ответ HTTP, потому что AVPlayer не дает хорошее сообщение об ошибке (например, «Операция не может быть завершена»)

Хороший учебник по NSURLProtocol можно найти здесь: https://www.raywenderlich.com/59982/nsurlprotocol-tutorial

Сначала система URL загрузки знаю, что вы можете обрабатывать запрос HLS по телефону [NSURLProtocol registerClass:/* your class */] и переопределить +(BOOL)canInitWithRequest:

+(BOOL)canInitWithRequest:(NSURLRequest *)request { 
    BOOL handled = [[NSURLProtocol propertyForKey:@"handled" inRequest:request] boolValue]; 
    return [request.URL.pathExtension isEqualToString:@"m3u8"] && !handled; 
} 

Затем переопределить -(void)startLoading в пользовательском URLProtocol

-(void)startLoading { 
    newRequest = [self.request mutableCopy]; 
    [NSURLProtocol setProperty:@YES forKey:@"handled" inRequest:newRequest]; 
    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:newRequest 
     completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

      /* Inspect response body(playlist) and error */ 
      NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

      /* Return data and control to AVPlayer*/ 
      [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
      [self.client URLProtocol:self didLoadData:data]; 
      [self.client URLProtocolDidFinishLoading:self]; 
    }]; 

    [task resume]; 
} 
0

#EXT-X-PROGRAM-DATE-TIME можно получить по адресу Недвижимость. Он не сообщает дату тега напрямую, а скорее дату последнего тега перед текущей позицией воспроизведения, а также любой воспроизводимый интервал с тех пор.

#EXT-X-TARGETDURATION не доступен напрямую. Вам придется либо загружать список воспроизведения самостоятельно, либо вставлять себя в процесс загрузки. У меня был успех с AVAssetResourceLoader и AVAssetResourceLoaderDelegate. Вы можете переписать схемы URL-адреса на то, что загрузчик не распознает (ничего, кроме http или https), и выполнять загрузку от имени игрока.

 Смежные вопросы

  • Нет связанных вопросов^_^