потоковая передача m3u8 не работает на Apple tv (airplay)

#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