m3u8流不在苹果电视上工作(airplay)

问题描述 投票:0回答:2

我正在使用AVPlayer为我的m3u8流媒体完美地在iphone和ipad设备上工作,但是当我尝试通过Airplay在Apple电视上播放它不能正常工作时我为AppleTv设置AVPlayer像这样:

NSURL * url = [NSURL URLWithString:@“// m3u8 path here”]; 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;

连接我的手机与苹果电视后我运行上面的代码,然后苹果电视开始加载和完成加载后,我只能看到我的电视上流媒体的第一张图片然后停止卡住我不知道为什么它卡住我尝试很多其他m3u8链接,但每个链接都停留在苹果电视上,所以有人可以帮助我,告诉我哪里出错.....谢谢

objective-c live-streaming airplay m3u8
2个回答
0
投票

我可以在ios上播放m3u8流。

这是示例代码:

@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;
            }
    }
}

希望这很有用


0
投票

此代码适用于Apple TV,使用Swift 4.2和Xcode 10

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: &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

© www.soinside.com 2019 - 2024. All rights reserved.