如何播放沙盒里的m3u8

作者: HOHO521 | 来源:发表于2016-11-03 12:49 被阅读1240次


播放沙盒里的m3u8流,大致流程为:

1、在沙盒里搭建本地虚拟服务器

2、下载m3u8文件到沙盒(本文采取把已下载好的流拷贝到沙盒里)

3、以虚拟host+port的方式,播放m3u8流

一、搭建沙盒虚拟服务器

我们借助开源项目GCDWebServer,附上github链接GCDWebServer

1、创建工程,导入GCDWebServer

pod 'GCDWebServer/WebDAV', '~> 3.3.3'

2、搭建虚拟服务器,并启动

#import "AppDelegate.h"

#import "GCDWebDAVServer.h"

@interface AppDelegate ()

@property (nonatomic, strong) GCDWebDAVServer* davServer;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

_davServer = [[GCDWebDAVServer alloc] initWithUploadDirectory:documentsPath];

[_davServer start];

NSLog(@"serverURL:%@", _davServer.serverURL);

return YES;

}

二、拷贝m3u8流到沙盒里

拷贝m3u8索引文件及其ts切片到沙盒document目录里

#import "ViewController.h"

#import "GCDWebDAVServer.h"

#import "PlayerViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

btn.backgroundColor = [UIColor redColor];

btn.frame = CGRectMake(100, 100, 50, 50);

[btn setTitle:@"click" forState:UIControlStateNormal];

[btn addTarget:self action:@selector(bntClick) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:btn];

[self copyFileToDocument:@"testVideo" type:@"m3u8"];

[self copyFileToDocument:@"testVideo-0" type:@"ts"];

[self copyFileToDocument:@"testVideo-1" type:@"ts"];

}

- (void)bntClick{

PlayerViewController *player = [[PlayerViewController alloc] init];

[self presentViewController:player animated:YES completion:nil];

}

- (void)copyFileToDocument:(NSString*)fileName type:(NSString *)fileType{

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@",fileName, fileType]];

NSFileManager *fm = [NSFileManager defaultManager];

//判断沙盒下是否存在,把工程的文件复制document目录下

BOOL isExist = [fm fileExistsAtPath:filePath];

if (!isExist){

//获取工程中文件

NSString *fileBundlePath = [[NSBundle mainBundle] pathForResource:fileName ofType:fileType];

if ([fm copyItemAtPath:fileBundlePath toPath:filePath error:nil]) {

NSLog(@"%@.%@成功复制到沙盒", fileName, fileType);

}else {

NSLog(@"%@.%@复制到沙盒失败", fileName, fileType);

}

} else {

NSLog(@"%@.%@已存在沙盒里", fileName, fileType);

}

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

三、开始播放

采取最简单的AVPlayer来播放

#import "PlayerViewController.h"

@interface PlayerViewController ()

@property (nonatomic, strong) AVPlayerLayer *playerLayer;

@property (nonatomic, strong) AVPlayer *player;

@property (nonatomic, strong) AVPlayerItem *playerItem;

@end

@implementation PlayerViewController

- (void)viewDidLoad

{

[super viewDidLoad];

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *filePath = [documentsPath stringByAppendingPathComponent:@"testVideo.m3u8"];

NSFileManager *fm = [NSFileManager defaultManager];

if ([fm fileExistsAtPath:filePath]) {

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:8080/testVideo.m3u8"]];

self.playerItem = [AVPlayerItem playerItemWithURL:url];

self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

self.playerLayer.frame = self.view.bounds;

self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;

[self.view.layer addSublayer:self.playerLayer];

[self.player play];

}else {

NSLog(@"文件不存在");

}

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

四、运行效果

五、最后附上网盘源码链接

经小伙伴指出,在真机上无法播放,查了下原因是,代码里webServer的端口写的默认的,应该是被占用了,因此就换了个端口,更新了下demo

新的demo源码

github-demo链接


相关文章

  • 如何播放沙盒里的m3u8

    播放沙盒里的m3u8流,大致流程为: 1、在沙盒里搭建本地虚拟服务器 2、下载m3u8文件到沙盒(本文采取把已下载...

  • iOS原生播放器 播放ts视频文件

    前面写过使用VLC播放器如何直接播放ts文件,不使用m3u8去做引导,这篇主要记录下原生播放器+m3u8引导去播放...

  • 升级iOS11之后WKWebview新坑之本地文件限制

    之前项目用的wkwebview使用video标签播放沙盒里cache文件夹下的视频,结果升级系统后,竟然播放不了...

  • 书签-视频

    视频 Android 离线播放 (HLS)m3u8文件 - CSDN博客Android 实现m3u8视频缓存 - ...

  • iOS 沙盒文件增删

    图片 写入 沙盒 删除沙盒里的文件 向沙盒里 写入文件夹,并向文件夹里 写入东西 得到沙盒文件夹 下的所有文件 来...

  • Mac环境nginx反向代理实现m3u8播放下载

    之前我发布了一篇文章讲了如何通过mp4文件生成m3u8,接下我们把上次的劳动成果用起来,搭建一个可以播放m3u8的...

  • M3U8视频播放与下载

    现在很多视频都采用了M3U8格式播放视频,不同于MP4整个文件URL直接播放,iOS要针对M3U8文件作特殊处理,...

  • 沙盒

    iOS APP可以在自己的沙盒里读写文件,每一个APP有自己独立的沙盒。沙盒里面的文件可以是照片、声音文件、文本、...

  • iOS m3u8本地缓存播放(控制下载并发、暂停恢复)

    一、m3u8缓存播放的整个流程 1.下载m3u8文件2.解析m3u8文件获取视频切片单元的信息。3.根据2.获取的...

  • 什么是沙箱模型?哪些操作是属于私有api范畴?

    1、应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒。 2、应用程序间不能共享数据,沙盒里的文件...

网友评论

  • 极客飞:感谢感谢
  • sjeffery:为什么用这个方法播放M3u8文件刚开始都可以播放的,过几天之后就播放不了了。直接黑屏了。里面的ts文件会消失了?还是索引出了问题?
    sjeffery:@HOHO521 谢谢。
    [self.davServer startWithPort:8111 bonjourName:@"video port"];
    self.videoPlayer.urlString = [NSString stringWithFormat:@"%@%@",@"http://localhost:8111/";,url];
    你的意思是说有可能这个端口被别的app占用了播放起来可能黑屏是这样的吗,顺便问一下怎么查看端口是否被占用了。暂时还没能复现该问题,所以排查起来也比较麻烦了,也不知道是不是文件没了。但是也没有调用文件删除的方法。
    HOHO521:@sjeffery 这个得你自己去查下了,看看webserver是否正常开启,还有是否端口被占用,再看看沙盒里文件是否都在,再结合播放器的errorlog分析下。应该是这几个环节里哪出问题了
  • 12ffa95ab1d3:请问为什么我下载搜狐视频到到本地,m3u8在播放的时候会自动暂停,并且无法继续。【ts文件完整,使用本地服务器,优酷m3u8下载播放测试通过,唯独搜狐不行】
  • HOHO521:@Story_End ts是需要m3u8索引的,只单独ts视频切片文件在这是不能播放的,本文是拼接了一个url地址来播放视频,单独的ts没法拼接地址的
    洪呵呵_:懂了,强,无敌
  • 洪呵呵_:真的不是端口问题,m3u8可以播放,但是播放不了ts格式的
  • Minger:如何播放加密的m3u8呢?假设已经拿到key的情况下
  • UILabelkell:我想问下,我只是换个ts文件,咋播放就挂了
    HOHO521:非常感谢小伙伴的指出,原因是在真机上由于端口被占用,导致无法播放,换一个端口就行了
  • UILabelkell:不错可以
  • bigParis:为什么用m3u8?
    HOHO521:@bigParis 播放直播啊,有的公司会把直播流进行数据加密,所以需要下载到本地解密后播放
  • OnlyLoveYu:不是git上 ?demo
    HOHO521:@OnlyLoveYu demo放到百度云盘里了:smile:

本文标题:如何播放沙盒里的m3u8

本文链接:https://www.haomeiwen.com/subject/vbwbuttx.html