即使关闭UIWebView,iPad仍然可以继续播放视频/音频流。

33

我只在iPad上遇到了这个问题。同样的操作在iPhone上正常。

我在应用程序中使用UIWebView打开URL。如果URL是普通网页,它会按预期正常工作。但是如果URL是远程视频/音频文件,则UIWebView会打开默认播放器,这也很好。

现在当我关闭UIWebView(通过点击播放器上的“完成”按钮)时,流媒体不会停止,音频/视频会在后台继续播放(我看不到它,但可以听到它)。创建webView的UIViewController也已经被释放了(我在dealloc方法中放置了一个日志语句),但流媒体并没有停止。

请问有人可以帮忙解决为什么会出现这种情况吗?如何在关闭UIWebView时停止音频/视频流?

谢谢。

11个回答

53

我有与问题陈述相同的问题,但这种情况下无法停止播放的视频是使用object/embed方法嵌入的Youtube视频。

我花了很长时间尝试弄清如何停止视频播放,我发现唯一的解决方案是在关闭视图之前告诉UIWebView加载一个空白页面:

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

编辑(2015年5月12日):如下方@chibimai所提到的,alloc_iNit的这个答案也是基于同样的方法,但由于我的回答是在5年前写的,而他的回答只有4年,所以链接的答案可能更适用。我不再从事iPhone开发工作,因此无法确定哪种方式更好。


1
我已经修改了我的原始帖子,以展示我实际在做什么。我认为我喜欢“about:blank”这种方法,因为它不涉及更多的网络开销(特别是如果它开始尝试获取资源)。 - nivekastoreth
问题可能在iOS 5中已经不存在了吗? - fabb
5
这篇帖子不应该被采纳。如果视频在已解除的控制器中继续播放,那么这是因为控制器(或webview)没有正确释放!尝试在您的dealloc方法中添加一个断点。使用上面的解决方案修复问题非常糟糕,也不能防止您的应用程序泄漏! - Martin
2
看看这个问题中被接受的答案。那个对我有用。https://dev59.com/62w05IYBdhLWcg3wxkmr - caribbean
11年过去了,问题依旧。 - A. Amini
显示剩余4条评论

4

我知道这个帖子已经很老了,但是为了像我这样的新开发人员着想。

我的情况是:我正在使用分割控制器,在主控制器上有媒体列表,在详细控制器部分有播放器。

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

最终我弄清楚了问题很简单,我在主控制器中持有详细控制器的引用,并且没有释放早期的详细控制器。在正确的位置上对主控制器进行简单的释放即可解决问题。


1
你如何进行这个发布? - Starwave

4
我发现这个行为是因为Web视图没有被释放。

2

我正在解决同样的问题。我发现,如果你在脚本标签中定义类似这样的内容:

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

然后在你的UIViewController中添加:

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

看起来它试图暂停/停止视频几秒钟,但是你仍然可以听到音频继续播放!


更新!

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


将播放时间设置为-1是为了什么?是为了视频、Web视图还是在设置中的某个地方?感谢您的帮助。 - lostInTransit
1
在您的HTML5视频对象上,只需通过JavaScript将currentTime设置为-1即可,如下:function stopVideo(){ video = document.getElementById('myVideo'); video.pause(); video.currentTime = -1; } - tolar
谢谢,这在我将视频嵌入Web视图中时很有效。但是,在我在Web视图中打开视频的URL的情况下,怎样才能确保这也能成功?(我只是使用视频的URL创建一个NSURLRequest) - lostInTransit

1
事实上,我更喜欢使用空链接来解决问题。就像这样:


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

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>

为了完成这个项目

附注:非常感谢 Viktor Gubrienko 提供的解决方案


0

这是我使用的。它会记录这个错误“Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.”,但会停止音频文件的播放(淡出)并记住播放位置。

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

0

由于Web视图尚未释放,视频在后台继续播放。

因此,您需要使用以下代码简单地释放Web视图,这对我来说很有效。

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

希望这能有所帮助...


0

感谢您在此问题上的帖子,我能够找到一个完全解决该问题的解决方案,并在我的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声...任何音频文件都可以...
希望这能帮到你...

0

我在表视图中遇到了同样的问题,其中表视图单元格有一个加载音频文件的 Web 视图。一旦你播放并返回到另一个屏幕,音频仍然会继续播放。

解决方案:在表视图控制器的 viewWillDisappear(_:) 中重新加载表视图,这样一旦你导航到另一个屏幕,音频就会停止播放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接