web-dev-qa-db-ja.com

UIWebViewを閉じてもビデオ/オーディオストリーミングが停止しない-iPad

この問題はiPadでのみ発生します。 iPhoneでも同じことが期待どおりに機能します。

アプリケーションのURLをUIWebViewで開いています。 URLが通常のWebページである場合、期待どおりに正常に動作します。ただし、URLがリモートビデオ/オーディオファイルのURLである場合、UIWebViewはデフォルトのプレーヤーを開きます。

UIWebViewを閉じると(プレーヤーの[完了]ボタンをクリックして)、ストリーミングが停止せず、オーディオ/ビデオがバックグラウンドで再生され続けます(表示されませんが、バックグラウンドで再生され続けます、聞こえます)それ)。 webviewが作成されたUIViewControllerも割り当て解除されます(deallocメソッドにログステートメントを入れました)が、ストリーミングは停止しません。

なぜこれが起こり得るのか誰かが私を助けてくれますか?また、UIWebViewが閉じているときにオーディオ/ビデオストリーミングを停止するにはどうすればよいですか?

ありがとう。

33
lostInTransit

上記と同じ問題がありますが、この場合、再生を停止しないビデオは、object/embedメソッドを使用して埋め込まれたYouTubeビデオです。

ビデオの再生を停止する方法を理解するために長い時間を費やしましたが、私が見つけた唯一の解決策は、ビューを閉じる前に空白のページをロードするようにUIWebViewに指示することでした:

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

編集(2015-05-12):以下の@chibimaiで言及されているように、 alloc_iNitによるこの回答は同じ行に沿って機能します ですが、私の回答は5年前のものであり、彼の唯一の4-リンクされた回答の方が適している場合があります。私はもはやiPhone開発作業を行っていないので、どちらが良いのか判断できません。

53
nivekastoreth

私はこれがかなり古いスレッドであることを知っていますが、私のような新しい開発者のためにです。

私のシナリオは:私はスプリットコントローラーを使用しており、詳細コントローラーセクションにマスターとプレーヤーのメディアリストがありました

私は同じ問題に直面し、あらゆる種類の回避策を試しました。

私はようやく問題が簡単で、マスターにディテールコントローラーの参照を保持していて、以前のディテールコントローラーを解放していなかったことがわかりました。適切な場所のマスターでの単純なリリースで問題が解決しました。

4
Kalpesh Popat

また、Webビューが解放されていなかったというだけの理由で、この動作が見つかりました。

4
ianjoyner

私は同じ問題に取り組んでいます。スクリプトタグで次のようなものを定義すると、

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

次に、UIViewControllerに以下を追加します。

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

数秒間ビデオを一時停止/停止しようとするようですが、オーディオが再生され続けるのが聞こえます!


更新!

これは、メディアプレーヤーの一般的なバグです。本当に停止させるには、再生時間を-1に設定する必要があります。

2
tolar

メディアプレーヤーでWebページから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に感謝します

実際、私は問題を解決するためにnullリンクを使用することを好みます。このような:

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

同じ問題がTable viewで発生しました。TableViewセルには、オーディオファイルをロードするWebViewがあります。再生して別の画面に戻った後も、オーディオは再生されます。

解決策:テーブルビューコントローラーのviewWillDisappear(_ :)でテーブルビューをリロードすると、別の画面に移動するとオーディオの再生が停止します。

0
Sateesh Pasala

この問題に関するスレッドのおかげで、問題を完全に解決する解決策を見つけ出すことができました。シミュレータだけでなく、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がこのオーディオファイルを処理するという警告にすぎないようです。エラーを処理するために、この1行(>>>を参照)を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
Steve S.

私の場合loadHTMLStringを使用し、@ "about:blank"を指定したloadRequestではなく、macOSの問題を修正します

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

これは私が使用するものです。このエラーは、「I/Oを実行しているオーディオセッションを非アクティブ化します。オーディオセッションを非アクティブ化する前に、すべてのI/Oを停止または一時停止する必要があります」というログを記録します。ただし、オーディオファイルの再生(フェードアウト)を停止し、再生位置を記憶します。

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

Webビューが解放されていないため、ビデオはWebビューでバックグラウンドで再生され続けます。

だから私のためにうまく機能する以下のコードを使用するだけでWebビューを解放する必要があります。

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

これが役に立てば幸い...

0
Gaurav Manani