如何在iOS中播放包含index0.ts,index1.ts等文件的本地保存的vod.m3u8文件?

时间:2016-03-28 09:28:03

标签: ios avplayer

我想播放存储在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任何帮助。

1 个答案:

答案 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样本开始,然后对其进行编辑以使其与细分的属性相匹配,而不是尝试从头开始构建并猜测哪些值很重要。