iOS- MPMoviePlayerController 无法从远程 URL 播放视频
Posted
技术标签:
【中文标题】iOS- MPMoviePlayerController 无法从远程 URL 播放视频【英文标题】:iOS- MPMoviePlayerController uable to play video from remote URL 【发布时间】:2016-02-25 08:41:31 【问题描述】:我正在尝试从远程 URL 播放视频。但它不起作用。我的代码是:
- (void)viewDidLoad
[super viewDidLoad];
NSLog(@"start playing");
NSURL *nsURL= [[NSURL alloc]initWithString:@"http://my_server_path:8080/content-service/v1/video/12/RGl1Nm1ib1VLMitFUmM5bEZzYVpxVGllM2RrWUw3Y09yMzdVZ0pzYlEvYjNaYUI5bEQvZERhTUhNTjBOaW5lY1hqYlZSRUM5anAvL3FsUTA2NzEwN2NMM2dnUnkxR0s4QUVyMnV2MlBLMjA9?thumb=false"];
videoPlayer = [[MPMoviePlayerController alloc]
initWithContentURL:nsURL];
[videoPlayer.view setFrame:CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.height)];
videoPlayer.controlStyle = MPMovieControlStyleDefault;
videoPlayer.movieSourceType = MPMovieSourceTypeStreaming;//MPMovieSourceTypeFile/MPMovieSourceTypeUnknown ;
[self.view addSubview:videoPlayer.view];
[videoPlayer prepareToPlay];
[videoPlayer play];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:videoPlayer];
videoPlayer.shouldAutoplay = YES;
- (void) moviePlayBackDidFinish:(NSNotification*)notification
NSError *error = [[notification userInfo] objectForKey:@"error"];
if (error)
NSLog(@"Did finish with error: %@", error);
我收到了这条消息
完成但出现错误:Error Domain=MediaPlayerErrorDomain 代码=-11850“操作停止”用户信息=0x15e77b20 NSLocalizedDescription=操作已停止
当我在浏览器中复制/粘贴我的视频 URL 时,它会成功下载(甚至不是浏览器中的缓冲区),完成下载后它在笔记本电脑中可以正常播放。我很沮丧,请帮忙,任何建议都会很棒,在此先感谢
【问题讨论】:
您是否尝试过使用本地服务器以外的 URL? “当我在浏览器中复制/粘贴我的视频 URL 时,它会成功下载(甚至不是浏览器中的缓冲区),完成下载后它在笔记本电脑上可以正常播放” - 这是因为它来自您的计算机,而不是从远程服务器。您的代码看起来不错。 它在模拟器上运行吗? 让我检查一下,完成后我会与您分享结果。 @ Lunatic999,是的,我发现了我的问题:我的 HTTP 服务器不支持字节范围请求。 请务必确保您的 HTTP 服务器支持字节范围请求。有关详细信息,请参阅此链接。 ***.com/questions/22250368/… 【参考方案1】:如果视频没有在设备上播放,您的 HTTP 服务器不支持字节范围请求。
为 ios 托管媒体文件的 HTTP 服务器必须支持字节范围 requests,iOS 用来在媒体播放中执行随机访问。 (字节范围支持也称为内容范围或部分范围 支持。)大多数(但不是全部)HTTP 1.1 服务器已经支持 字节范围请求。
Source From Safari Web Service Content
Source From Byte-Range Request
Solution
【讨论】:
@user3182143,如何知道服务器是否已经支持字节范围(内容范围或部分范围)请求??【参考方案2】:使用此代码:
fileURL 是服务器上视频的 URL
MPMoviePlayerViewController* tmpMoviePlayViewController=[[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
if (tmpMoviePlayViewController)
tmpMoviePlayViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:tmpMoviePlayViewController animated:YES completion:nil];
[tmpMoviePlayViewController.moviePlayer prepareToPlay];
// tmpMoviePlayViewController.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
tmpMoviePlayViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[tmpMoviePlayViewController.moviePlayer play];
【讨论】:
大家好,我在 termianl 上运行此命令并得到以下响应: curl -I my_server_path_/content-service/v1/video............ 结果: HTTP/1.1 200 OK 服务器:Apache-XX-- Content-Disposition:附件; filename="12345" 内容类型:video/mp4 传输编码:chunked 日期:2016 年 2 月 25 日星期四 17:58:46 GMT【参考方案3】:将此代码中的 url 替换为 fileUrl
MPMoviePlayerViewController *mpvc = [[MPMoviePlayerViewController alloc] init];
mpvc.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;
[mpvc.moviePlayer setContentURL:fileURL];
[self presentMoviePlayerViewControllerAnimated:mpvc];
【讨论】:
以上是关于iOS- MPMoviePlayerController 无法从远程 URL 播放视频的主要内容,如果未能解决你的问题,请参考以下文章
MPMoviePlayerController 和 UIWebView
设置 MPMoviePlayerController 的方向
{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO