Поток Akamai Token Protection не может воспроизводиться в IOS
Я разработчик в IpTV. Мы разработали наше приложение для Android и теперь хотим перейти на устройства IOS. Akamai это наш CDN. На данный момент у нас есть простое приложение IOS, которое может воспроизводить потоки HLS. Мы можем перемещаться по каждому каналу, и все потоки воспроизводятся правильно. Для защиты наших потоков мы планировали использовать токен. Мы уже внедрили токен на Android, но сейчас у меня возникают трудности с IOS. Потоки, защищенные токеном, не воспроизводятся, экран остается черным.
Вот пример моего потока
http://this_is_my_stream_protected_with_token.m3u8/?__token__=exp=1432902926~acl= токен = exp = 1432902926 ~ acl = *~hmac=1e1d2afa7e7fbca72b0da6f5820ba1063446631e75fea80093c8183b619c0acc
Если я пытаюсь воспроизвести этот поток в моем приложении, экран остается черным с другой стороны, если я открываю его с помощью VLC или проигрывателя в веб- браузере ( http://www.flashls.org/latest/examples/chromeless/), он воспроизводится правильно.
Я создал функцию, которая делает http-запрос по этой ссылке, и ответ сервера:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=1629884,CODECS="avc1.77.31,mp4a.40.2",RESOLUTION=640x360
chunklist.m3u8?__token__=exp%3D1432902926%7Eacl%3D*%7Ehmac%3D1e1d2afa7e7fbca72b0da6f5820ba1063446631e75fea80093c8183b619c0acc
Чтобы мое приложение правильно генерировало токен, я сделал его жестко закодированным, и у меня все еще остается та же проблема.
Поскольку это не проблема Akamai и не проблема генерации токенов, это заставляет меня поверить, что, возможно, мне нужно как-то кодировать поток в проигрывателе. Я везде читал об этой проблеме и до сих пор не могу найти рабочее решение
Вот мой код игрока:
var param = ["auth":encryption.Token()] as Dictionary<String,String>;
WebHelper().httpPostNSString(currentChannel.channelTokenUrl, params: param, consumeData: { (nsstring) -> () in
//this is a custom method. it makes a post HttpRequest. It takes Token Url path and Dictionary with parameters and it returns the respnse data converted to String.
token = nsstring;
_URL_ += token;
_URL_ = _URL_.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet());
//remove spaces just in case (this is a 'MUST' in Android)
var address = "http://this_is_my_stream_protected_with_token.m3u8?__token__=exp=1432902926~acl=*~hmac=1e1d2afa7e7fbca72b0da6f5820ba1063446631e75fea80093c8183b619c0acc"
let url = NSURL(string: address)
self.moviePlayer = MPMoviePlayerController(contentURL: url)
self.moviePlayer?.controlStyle = MPMovieControlStyle.None;
if(self.db.select.getStringValue(forKey: self.db.STRING_VALUE_CURRENT_CHANNEL) == nil){
self.db.insert.CoreData_Insert(value: "-1", coreDataKey: self.db.STRING_VALUE_CURRENT_CHANNEL)
}
Logs().sendHit(currentChannel.channelNumber, accessway: self.access_way, lastchannel: self.db.select.getStringValue(forKey: self.db.STRING_VALUE_CURRENT_CHANNEL).value, username: self.db.select.getStringValue(forKey: self.db.STRING_VALUE_USERNAME).value);
self.db.delete.deleteEntityFromCore(entityName: "StringValue", field_Name: "key", field_Value: self.db.STRING_VALUE_CURRENT_CHANNEL);
self.db.insert.CoreData_Insert(value: currentChannel.channelNumber, coreDataKey: self.db.STRING_VALUE_CURRENT_CHANNEL);
//we save some data and than proceed to play selected channel.
if let player = self.moviePlayer{
//save the new channel
player.view.frame = self.view.bounds
player.prepareToPlay()
player.scalingMode = .AspectFill
self.view.addSubview(player.view)
self.view.bringSubviewToFront(self.two_way_channel);
player.play();
//send hits
}
})
Благодарю вас