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 的方向

iPhone应用程序:仅在小视图中播放视频

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO

IO模型--阻塞IO,非阻塞IO,IO多路复用,异步IO

IO复用阻塞IO非阻塞IO同步IO异步IO