2010-04-27 98 views
32

我只在iPad上看到此問題。 iPhone上的預期效果也一樣。即使UIWebView已關閉,視頻/音頻流也不會停止 - iPad

我打開我的應用程序在UIWebView中的URL。如果該URL是一個普通的網頁,它可以正常工作。但是,如果URL是遠程視頻/音頻文件的URL,那麼UIWebView將打開默認播放器,該播放器再次良好。

現在當我關閉UIWebView(通過單擊播放器上的完成按鈕),流不停止,音頻/視頻在後臺繼續播放(我看不到它,但它確實繼續播放背景,可以聽到它)。在其中創建webview的UIViewController也被處理(我在dealloc方法中放入了一條日誌語句),但流式傳輸不停止。

有人可以幫我解釋爲什麼會發生這種情況嗎?如何在UIWebView關閉時停止音頻/視頻流?

謝謝。

回答

51

我有同樣的問題,但在這種情況下,不會停止播放的視頻是使用對象/嵌入方法嵌入的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開發工作,所以我無法確定哪種方法更好。

+0

這是一個解決方法,儘管是一個骯髒的!感謝分享。如果您發現其他問題,請告知我們。 – lostInTransit 2010-05-01 03:40:20

+0

我打開google.com;) – 2010-05-01 06:26:27

+1

我修改了我原來的帖子,以顯示我實際在做什麼。我想我喜歡「關於:空白」的方法,因爲它不涉及更多的網絡開銷(特別是如果它開始嘗試獲取資源)。 – nivekastoreth 2010-05-06 08:43:48

2

我正在解決同樣的問題。我發現,如果你在你的腳本標籤定義是這樣的:

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

然後,添加在:

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

這似乎試圖暫停/停止視頻數秒,但隨後您會聽到音頻繼續播放!


更新!

這是媒體播放器的一般錯誤。您必須將播放時間設置爲-1才能使其真正停止。

+0

播放時間爲-1是爲了什麼?視頻,網絡視圖,設置中的某個地方?欣賞幫助 – lostInTransit 2010-04-29 04:22:04

+1

在您的HTML5視頻對象上,只需通過JavaScript設置currentTime爲-1,ala: function stopVideo(){ video = document.getElementById('myVideo'); video.pause(); video.currentTime = -1; } – tolar 2010-04-29 17:40:00

+0

非常感謝,我將視頻嵌入到網頁瀏覽中。但是,如果我在webview中打開視頻的網址,我該如何確保它可以正常工作? (我只是創建一個NSURLRequest與視頻的URL) – lostInTransit 2010-04-30 04:23:36

0

感謝你在這個問題上的線索我能夠找出一個完全解決問題的解決方案,並且我在我的iPad上測試了它,而不僅僅是模擬器。這也解決了音頻播放的問題。這不是永久的解決方案,而是有效的解決方法。

概述做法:

基本上所有需要的是發送短音頻文件到web視圖。我製作了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之前,我顯示我的下一個音頻/視頻。這樣,聲音文件的小型播放欄就不會顯示在顯示屏上。有剛有柔提示音的聲音......任何音頻文件會做...

我希望這有助於...

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提供的解決方案

4

我知道這是相當古老的線程,但爲了像我這樣的新開發者。

我的情況是:我用的是分體式控制器,與主機和播放器的詳細控制器部分

媒體列表我面臨着同樣的問題,並嘗試各種解決辦法的。

我終於明白,問題很簡單,我在主人手中持有詳細控制器的參考資料,並沒有發佈早期的詳細控制器。在正確的地方在主人的簡單版本解決了問題。

4

我也發現這種行爲只是因爲網絡視圖尚未發佈。

0

這就是我使用的。它會記錄此錯誤「停用正在運行I/O的音頻會話。在停用音頻會話之前,應停止或暫停所有I/O。」但會阻止音頻文件播放(淡出)並記住播放位置。

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

實際上,我更願意使用null鏈接來解決問題。 這樣的:

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

隨着網絡意見都沒有被釋放,該影片繼續播放,在後臺的Web視圖。

所以你需要簡單地通過使用下面的代碼來發布web視圖,這對我來說很好。

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

我希望這有助於...