首页 文章

即使UIWebView关闭,视频/音频流也不会停止 - iPad

提问于
浏览
33

我只在iPad上看到这个问题 . 同样的东西在iPhone上运行正常 .

我在UIWebView中打开我的应用程序的URL . 如果URL是普通网页,它可以正常工作 . 但是,如果URL是远程视频/音频文件的URL,则UIWebView会打开默认播放器,这又是好的 .

现在,当我关闭UIWebView(通过点击播放器上的完成按钮)时,流媒体不会停止,音频/视频会在后台继续播放(我看不到它,但它确实在后台继续播放,可以听到它) . 创建webview的UIViewController也被解除分配(我在dealloc方法中放入了一个日志语句),但是流不会停止 .

有人可以帮我解释为什么会发生这种情况吗?当UIWebView关闭时,如何停止音频/视频流?

谢谢 .

10 回答

  • 52

    我有同样的问题,但在这种情况下,不会停止播放的视频是使用object / embed方法嵌入的Youtube视频 .

    我花了很长时间试图弄清楚如何让视频停止播放,我找到的唯一解决方案是在解除视图之前告诉UIWebView加载空白页:

    [self.webContent loadRequest:NSURLRequestFromString(@"about:blank")];
    

    编辑(2015-05-12):如下面的@chibimai所述,this answer by alloc_iNit works along the same lines但由于我的答案来自5年前 - 而他的唯一4 - - 相关答案可能更适用 . 我不再做iPhone开发工作,所以我无法确定哪种方式更好 .

  • 4

    我也发现这种行为只是因为Web视图尚未发布 .

  • 0

    我知道这是一个非常古老的线程,但为了像我这样的新开发者 .

    我的场景是:我使用的是分割控制器,主控制器上的媒体列表和详细控制器部分中的播放器

    我遇到了同样的问题并尝试了各种解决方法 .

    我终于弄清楚问题很简单,我在我的主人手中持有细节控制器的引用,并且没有释放早期的细节控制器 . 在正确位置的主人的简单版本解决了这个问题 .

  • 0

    我正在研究同样的问题 . 我发现如果你在脚本标签中定义这样的东西:

    function stopVideo(){ video.pause(); }
    window.onunload = stopVideo;
    

    然后在你的UIViewController中,添加:

    -(void)viewWillDisappear:(BOOL)animated{
        [webView stringByEvaluatingJavaScriptFromString:@"window.onunload();"];
        [super viewWillDisappear:animated];
    }
    

    它似乎试图暂停/停止视频几秒钟,但随后您听到音频继续播放!


    更新!

    这是媒体播放器的一般错误 . 您必须将播放时间设置为-1才能使其真正停止 .

  • 1

    我刚刚遇到一个问题,一个mp4文件在网页中自动打开媒体播放器而无法关闭它 - “完成”按钮只能在视频全屏模式下看到并且只是关闭全屏,所以我无法返回到网页而不向导航栏添加“后退”按钮 . (在iPhone上,视频在单独的视图中打开,“完成”按钮带回源页面的WebView)

    帮助我的解决方法是在单独的媒体播放器中打开视频文件 .

    赶上打开一个MP4文件

    - (BOOL) webView: (UIWebView *) webView shouldStartLoadWithRequest: (NSURLRequest *) request navigationType: (UIWebViewNavigationType) navigationType
    {
        NSRange range = [request.URL.absoluteString rangeOfString: @".mp4" options: NSCaseInsensitiveSearch];
    
        if ( range.location != NSNotFound ) //opening MP4 video file
        {           
            [self showFullscreenMediaWithURL: request.URL];
    
            return NO;
        }
    
        return YES;
    }
    

    哪里

    - (void) showFullscreenMediaWithURL: (NSURL *) mediaURL
    {
        MPMoviePlayerViewController *ctrl = [[MPMoviePlayerViewController alloc] initWithContentURL: mediaURL];
    
        ctrl.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentModalViewController: ctrl animated: YES];
    
        [ctrl release];
    }
    

    在模型视图中的媒体播放器中打开带有URL的视频

    不要忘记将MediaPlayer.framework添加到项目并导入

    #import <MediaPlayer/MediaPlayer.h>
    

    为了建设项目

    PS . 非常感谢Viktor Gubrienko的解决方案

  • 0

    实际上,我更喜欢使用null链接来解决问题 . 像这样:

    [self.webView loadRequest:NSURLRequestFromString(@"about:blank")];
    
  • 2

    感谢你在这个问题上的线程,我能够找到一个完全解决问题的解决方案,并且我在我的IPad上测试了它,而不仅仅是模拟器 . 这也解决了音频播放的问题 . 这不是永久决议,而是一项有效的解决方案 .

    方法概述:

    基本上所需要的只是将一个简短的音频文件发送到webView . 我制作了IMac submarine.m4v文件的副本,我调用了ping.m4v并将其添加到资源文件夹中的xcode项目中 .

    然后在我希望视频/音频停止时,我执行以下步骤:

    webView.hidden = TRUE;
    NSString *mimeType = [[NSString alloc] initWithString:@"video/x-m4v"];
    NSData *PingData = [NSData alloc];
    PingData = [NSData dataWithContentsOfFile:PingFilePath];
    
    [webView loadData:PingData MIMEType:mimeType textEncodingName:nil baseURL:[NSURL URLWithString:PingFilePath]];
    

    现在你还必须处理错误"204" . 错误204似乎只是一个警告说webView将处理此音频文件 . 为了处理错误,我将这一行(见>>>)添加到 didFailLoadWithError

    (void)webView:(UIWebView *)BHwebView didFailLoadWithError:(NSError *)error
    {
    
        NSLog(@"Error %i", error.code);
        if (error.code == NSURLErrorCancelled) return; // this is Error -999    
            if (error.code == 204) return; // this is Error 204 - for audio player in webview.
    

    最后,在我显示下一个音频/视频之前,我转向 webView.hidden = FALSE . 这样,声音文件的小播放栏不会显示在显示屏上 . 只有一个软ping音......任何音频文件都会...

    我希望这帮助...

  • 1

    这就是我使用的 . 它会记录此错误“取消激活已运行I / O的音频会话 . 在停用音频会话之前,应停止或暂停所有I / O.”但确实停止播放(淡出)音频文件并记住播放位置 .

    AVAudioSession *s = [AVAudioSession sharedInstance];
    if (s != nil)
        [s setActive:NO error:nil];
    
  • 4

    由于Web视图尚未发布,因此视频会在后台继续播放Web视图 .

    因此,您只需使用下面的代码就可以发布Web视图,这对我来说很合适 .

    - (void)viewDidDisappear:(BOOL)animated 
    {
        [super viewDidDisappear:(BOOL)animated];
        [self.wvwebview removeFromSuperview];
    }
    

    我希望这有帮助...

  • 0

    在我的情况下使用 loadHTMLString 而不是loadRequest与@ "about:blank",修复macOS上的问题

    [self.wkWebView loadHTMLString:@"about:blank" baseURL:nil];
    

相关问题