我想播放存储在app主目录中的vod.m3u8文件。 vod.m3u8文件中包含index0,index1等。 .ts文件实际存在于目录中。
#EXTM3U
#EXT-X-VERSION:0
#EXT-X-TARGETDURATION:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:11,
index0.ts
#EXTINF:10,
index1.ts
#EXTINF:5,
index2.ts
#EXTINF:5,
index4.ts
#EXTINF:10,
index5.ts
#EXTINF:10,
index6.ts
#EXTINF:5,
index7.ts
#EXT-X-ENDLIST
以下是我播放视频的代码
-(void)playLocalVideo
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"vod"
ofType:@"m3u8"];
NSURL *url = [[NSURL alloc] initFileURLWithPath: path];
AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
anItem = [AVPlayerItem playerItemWithAsset:asset];
player = [AVPlayer playerWithPlayerItem:anItem];
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];
layer.frame = self.view.layer.bounds;
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 300, 320, 250)];
[view.layer addSublayer:layer];
[self.view addSubview:view];
[player addObserver:self forKeyPath:@"status" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
{
if (object == player && [keyPath isEqualToString:@"status"]) {
if (player.status == AVPlayerStatusFailed) {
NSLog(@"AVPlayer Failed");
} else if (player.status == AVPlayerStatusReadyToPlay) {
NSLog(@"AVPlayer Ready to Play");
[player play];
} else if (player.status == AVPlayerItemStatusUnknown) {
NSLog(@"AVPlayer Unknown");
}
}
}
AVPlayer状态是AVPlayer准备播放,但它从不播放视频。如果我播放任何mp4视频,那么它正在播放,但不是vod.m3u8文件。
Plz任何帮助。
答案 0 :(得分:0)
问题可能出在您的M3U8文件中的值中。
您的目标持续时间应描述.TS段的最大播放长度。您的EXTINF表示分段最长为10秒,因此您应该将#EXT-X-TARGETDURATION:11设置为1而不是1。
您可能需要EXT-X-VERSION的实际值。参见https://developer.apple.com/library/archive/qa/qa1752/_index.html。设置最小值为2。
HLS软件包通常以主清单开头,该清单指向变种播放列表,例如VOD.m3u8,因此您可以尝试创建一个指向VOD.m3u8的master.m3u8,而不是尝试直接播放变种播放列表。
通常,您可能想从一个有效的HLS样本开始,然后对其进行编辑以使其与细分的属性相匹配,而不是尝试从头开始构建并猜测哪些值很重要。