我想使用AVPlayer(在Swift中)播放HLS流。
此HLS流在Safari中播放,但在我想使用AVPlayer时则不行。
我的代码:
let hlsLink = 'http://thelinktomyHLSmovie'
let player = AVPlayer(URL: NSURL(string: hlsLink)!)
let playerVC = AVPlayerViewController()
playerVC.player = player
presentViewController(playerVC, animated: true) {
playerVC.player?.play()
}
如果我对HLS URL进行CURL以找出其中包含哪种流,我会得到:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2328000,CODECS="avc1.66.30,mp4a.40.2",RESOLUTION=1280x720
chunklist_w1751887550_b2328000.m3u8?smil=1
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000,CODECS="mp4a.40.2"
chunklist_w1751887550_b128000_ao.m3u8?smil=1
对我来说似乎没问题。
如果我对其他更小更短的流做同样的事情,一切正常。
我已经尝试过观察AVPlayer和AVPlayerItem的状态,但是没有报告任何有用的内容。
我错过了什么?
更新
我添加了一个AVPlayerItem,正如我已经说过的那样。我还为玩家,玩家视图控制器和所有通知的播放器项添加了通知观察者,并print
输出了输出。这给了我以下内容:
Optional(NSConcreteNotification 0x7fd272bcd600 {name = AVPlayerItemTimebaseChangedNotification; object = <AVPlayerItem: 0x7fd2714f6c40, asset = <AVURLAsset: 0x7fd27144e720, URL = http://hls.streamonecloud.net/vod/amlst:pwlsaeYN1ZuH/playlist.m3u8?smil=1>>})
Optional(NSConcreteNotification 0x7fd272bccaf0 {name = AVPlayerItemBecameCurrentNotification; object = <AVPlayerItem: 0x7fd2714f6c40, asset = <AVURLAsset: 0x7fd27144e720, URL = http://hls.streamonecloud.net/vod/amlst:pwlsaeYN1ZuH/playlist.m3u8?smil=1>>})
Optional(NSConcreteNotification 0x7fd272bcd710 {name = AVPlayerCurrentItemDidChangeNotification; object = <AVPlayer: 0x7fd27157ca60>; userInfo = {
CurrentDuration = {
epoch = 0;
flags = 17;
timescale = 0;
value = 0;
};
ReasonForCurrentItemDidChange = ReasonAdvanceAtEnd;
}})
Optional(NSConcreteNotification 0x7fd271759950 {name = AVPlayerItemTimebaseChangedNotification; object = <AVPlayerItem: 0x7fd2714f6c40, asset = <AVURLAsset: 0x7fd27144e720, URL = http://hls.streamonecloud.net/vod/amlst:pwlsaeYN1ZuH/playlist.m3u8?smil=1>>})
我还检查了该项目的accessLog()
和errorLog()
。访问日志不包含任何条目(但确实存在),错误日志为nil。
我不知道该怎么做。我上面的日志包含我想要加载的URL,如果有兴趣的话(我们的服务器上只有Big Buck Bunny)。