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

时间:2010-04-27 06:53:00

标签: uiwebview video-streaming ipad

我只在iPad上看到这个问题。同样的事情在iPhone上运行正常。

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

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

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

感谢。

11 个答案:

答案 0 :(得分: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开发工作,所以我无法确定哪种方式更好。

答案 1 :(得分:4)

我知道这是一个非常古老的主题,但是为了像我这样的新开发者。

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

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

我终于弄清楚问题很简单,我在我的主人手中拿着细节控制器的引用,并没有发布早期的细节控制器。在正确位置的主人简单发布解决了这个问题。

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

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

然后在你的UIViewController中添加:

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

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


更新!

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

答案 4 :(得分: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的解决方案

答案 5 :(得分:1)

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

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

答案 6 :(得分: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将处理此音频文件。为了处理错误,我将这一行(请参阅&gt;&gt;&gt;)添加到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音......任何音频文件都可以......

我希望这会有所帮助......

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

由于网络视图尚未发布,视频会在后台继续在网络视图中播放。

所以你只需要使用下面的代码就可以发布网页视图,这对我来说很合适。

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

我希望这会有所帮助......

答案 9 :(得分:0)

在我的情况下,使用 loadHTMLString 而不是使用@“ about:blank”加载请求,请在macOS上解决此问题

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

答案 10 :(得分:0)

我在表格视图中遇到了相同的问题,其中表格视图单元格具有一个可加载音频文件的网络视图。播放并返回另一个屏幕后,音频仍会播放。

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