#objective-c #live-streaming #airplay #m3u8
#objective-c #прямая трансляция #airplay #m3u8
Вопрос:
я использую AVPlayer для потоковой передачи m3u8, которая отлично работает на устройствах iphone и ipad, но когда я пытаюсь воспроизвести эту потоковую передачу на Apple Tv через Airplay, она не работает. я настраиваю AVPlayer для AppleTV следующим образом:
NSURL *url = [NSURL URLWithString:@»//путь к m3u8 здесь»]; AVPlayerItem * playerItem = [AVPlayerItem playerItemWithURL:url];
self.videoPlayer = [AVPlayer playerWithPlayerItem:playerItem];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.videoPlayer];
[self.playerLayer setFrame:self.view.frame];
[self.view.layer addSublayer:self.playerLayer];
[self.videoPlayer play];
[self.videoPlayer setAllowsExternalPlayback:YES];
self.videoPlayer.usesExternalPlaybackWhileExternalScreenIsActive = YES;
После подключения моего мобильного телефона к Apple Tv я запускаю приведенный выше код, а затем Apple tv начинает загружаться, и после полной загрузки я вижу только первое изображение потоковой передачи на моем телевизоре, а затем останавливаю его. застрял. я не знаю, почему он застрял. я пробую много других ссылок m3u8, но каждая ссылка застряла на Apple TV,итак, кто-нибудь может мне помочь и сказать, что происходит не так…..Спасибо
Ответ №1:
Я могу воспроизводить поток m3u8 на ios.
Вот пример кода:
@property (weak, nonatomic) IBOutlet UIView *playerView;
@property (nonatomic, strong) AVURLAsset *asset;
@property (nonatomic, strong) AVPlayer *player;
@property (nonatomic, strong) AVPlayerItem *playerItem;
- (IBAction)startStopForwardingVideo:(id)sender
{
_asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:@"http://******sl.m3u8 live stream url"] options:nil];
NSError *error = nil;
self.playerItem = [AVPlayerItem playerItemWithAsset:_asset];
[self.player addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:AVPlayerItemStatusContext];
self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
playerLayer.frame = CGRectMake(0, 0, self.playerView.frame.size.width, self.playerView.frame.size.height);
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[_playerView.layer addSublayer:playerLayer];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@“status”]) {
AVPlayerStatus status = [change[NSKeyValueChangeNewKey] integerValue];
switch (status) {
case AVPlayerItemStatusUnknown:
break;
case AVPlayerItemStatusReadyToPlay:
{
[self.player play];
}
break;
case AVPlayerItemStatusFailed:
[self stopLoadingAnimationAndHandleError:[[self.player currentItem] error]];
break;
}
}
}
Надеюсь, это полезно
Комментарии:
1. он работает на ios, я говорю о Apple Tv на Apple Tv, который не работает, когда я использую airplay @Punita
Ответ №2:
Этот код работает в AppleTV с использованием Swift 4.2 и Xcode10
import UIKit
import AVKit
class ViewController: UIViewController {
var playerController: AVPlayerViewController!
var asset: AVURLAsset!
var playerItem: AVPlayerItem!
var player: AVPlayer!
private var playerItemContext = 0
override func viewDidLoad() {
super.viewDidLoad()
self.play()
}
func play() {
let url: URL = URL(string: "https://s3-us-west-2.amazonaws.com/hls-playground/hls.m3u8")!
asset = AVURLAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: playerItem)
playerItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: NSKeyValueObservingOptions.new, context: amp;playerItemContext) // AVPlayerItem.Status.readyToPlay)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
self.view.layer.addSublayer(playerLayer)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(AVPlayerItem.status) {
if let change = change {
if let status = change[NSKeyValueChangeKey.newKey] {
switch status as! Int {
case 0: //AVPlayerItem.Status.unknown:
break
case 1: //AVPlayerItem.Status.readyToPlay:
player.play()
default:
break
}
}
}
}
}
}
Вы можете выбрать свой любимый плейлист * .m3u8
Я надеюсь, что это поможет … e