Видеопоток iPhone с сервера rails не работает

Я столкнулся с одной проблемой: мне нужно транслировать видео в приложении iPhone с сервера rails. При отправке потокового запроса мне нужно установить заголовок запроса, который является токеном jwt для аутентификации.

  1. Пытался использовать встроенный компонент iPhone MPMoviePlayerController, но проблема в том, что я не могу установить заголовок, потому что он принимает только NSURL вместо NSURLRequest.

  2. Также попытался добиться этого с помощью UIWebView, создав NSURLRequest с заголовком запроса и загрузив его в Webview. Я впервые могу транслировать видео, когда только что создаю и запускаю приложение. Но после этого он не выполняет потоковую передачу (поскольку при потоковой передаче он отправляет запрос несколько раз, и только для первого запроса он устанавливает заголовок, а не для последующего запроса). Если я переустановлю приложение, оно снова будет работать при первом запуске.

Код выглядит так:

NSString * jwtToken = @“Token”; 
NSString * Bearer = @"Bearer ";
NSString *authHeader=[Bearer stringByAppendingString:jwtToken];
[urlRequest setValue:authHeader forHTTPHeaderField:@"Authorization"];
urlRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
webview.allowsInlineMediaPlayback = YES;
webview.mediaPlaybackRequiresUserAction = NO;
webview.opaque = NO;
webview.backgroundColor = [UIColor clearColor];
[webview setTranslatesAutoresizingMaskIntoConstraints:NO];
webview.delegate = self;
[self.view addSubview:webview];
[webview loadRequest:urlRequest];

Сомневаюсь, 1. Можно ли использовать встроенный в iPhone видеокомпонент с заголовком запроса? 2. Если мне нужно использовать UIwebView, как я могу решить эту проблему?

Пожалуйста, помогите мне решить эту проблему.


person deepak hegde    schedule 02.09.2016    source источник


Ответы (1)


Попробуйте использовать AVPlayer из AVFoundation только с URL. Думаю, он справится с другими вещами. вам не нужно будет устанавливать какой-либо тип заголовка или что-то еще. вы можете воспроизводить видео с удаленного видео через AVPlayer.

Вы можете сделать что-то вроде,

   NSString *urlString = @"yourUrlStrong";
NSURL *url = [NSURL URLWithString:urlString];
self.item = [AVPlayerItem playerItemWithURL:url];
self.player = [[AVPlayer alloc] initWithPlayerItem:self.item];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
 //    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoPlayingFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.item];
playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
playerLayer.backgroundColor = [UIColor greenColor].CGColor;
[self.view.layer addSublayer:playerLayer];
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.player play];
self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;

И убедитесь, что вы объявляете AVPlayer и AVPlayerItem как свойство, а не как локальную переменную.

person Ketan Parmar    schedule 02.09.2016
comment
Спасибо, ketan, за ваш ответ, но мне нужно установить заголовок, потому что он нужен серверу для обслуживания видео. - person deepak hegde; 02.09.2016
comment
какую ошибку вы получаете, если пытаетесь напрямую воспроизвести видео только с url-адреса ?? - person Ketan Parmar; 02.09.2016
comment
сервер не будет обслуживать видео. потому что для аутентификации необходимо установить этот токен. - person deepak hegde; 02.09.2016
comment
Я не могу использовать только URL. - person deepak hegde; 02.09.2016
comment
ваш сервер должен поддерживать byte range для потоковой передачи видео в ios, и тогда вам не нужно устанавливать заголовок. Во-вторых, для прямой трансляции вы должны подготовить свой сервер, как будто он может обслуживать видео прямо с URL-адреса, я имею в виду, что аутентификация или заголовок не требуются !!! - person Ketan Parmar; 02.09.2016
comment
Да, я использую диапазон байтов на сервере, который работает, если я отключу аутентификацию. Но по какой-то причине аутентификацию необходимо реализовать на стороне сервера. - person deepak hegde; 02.09.2016