我只在iPad上看到这个问题。同样的事情在iPhone上运行正常。
我在UIWebView中打开我的应用程序的URL。如果URL是普通网页,它可以正常工作。但是,如果URL是远程视频/音频文件的URL,则UIWebView会打开默认播放器,这也是好的。
现在,当我关闭UIWebView(通过点击播放器上的完成按钮)时,流媒体不会停止,音频/视频会在后台继续播放(我看不到它,但它会继续在后台播放,可以听到它)。创建webview的UIViewController也被解除分配(我在dealloc方法中放入了一个日志语句),但流不会停止。
有人可以帮我解释为什么会发生这种情况吗?当UIWebView关闭时,如何停止音频/视频流?
感谢。
答案 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(_ :)中,并且一旦导航到另一个屏幕,音频就会停止播放。