web-dev-qa-db-fra.com

La diffusion audio/vidéo ne s’arrête pas même si UIWebView est fermé - iPad

Je vois ce problème uniquement sur l'iPad. Les mêmes choses fonctionnent comme prévu sur l'iPhone.

J'ouvre l'URL de mon application dans un UIWebView. Si l'URL est une page Web normale, cela fonctionne correctement. Mais si l'URL est celle d'un fichier vidéo/audio distant, UIWebView ouvre le lecteur par défaut, ce qui est à nouveau correct.

Maintenant, lorsque je rejette UIWebView (en cliquant sur le bouton Terminé du lecteur), la diffusion en continu ne s’arrête pas et l’audio/vidéo continue de jouer en arrière-plan (je ne peux pas le voir, mais reste en arrière-plan. il). Le UIViewController dans lequel la vue Web a été créée est également désalloué (j'ai ajouté une instruction de journal dans la méthode dealloc), mais la diffusion en continu ne s'arrête pas.

Quelqu'un peut-il m'aider s'il vous plaît sur pourquoi cela pourrait se produire? Et comment puis-je arrêter le streaming audio/vidéo lorsque UIWebView est fermé?

Merci.

33
lostInTransit

J'ai le même problème que mentionné, mais dans ce cas, la vidéo qui ne s'arrête pas de jouer est une vidéo Youtube incorporée à l'aide de la méthode object/embed. 

J'ai passé beaucoup de temps à essayer de trouver un moyen d'arrêter la lecture de la vidéo et la seule solution que j'ai trouvée était de demander à UIWebView de charger une page vierge avant de fermer la vue:

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

Edit (2015-05-12): Comme mentionné par @chibimai ci-dessous, cette réponse de alloc_iNit fonctionne dans le même sens mais comme ma réponse date d'il y a 5 ans - et ses quatre seulement - la réponse liée peut être plus applicable. Je ne fais plus de travail sur iPhone, je ne peux donc pas déterminer lequel est le mieux.

52
nivekastoreth

Je sais que c'est un vieux fil, mais pour les nouveaux développeurs comme moi.

Mon scénario était le suivant: j'utilisais un contrôleur divisé, avec une liste de médias sur le maître et le lecteur dans la section du contrôleur de détail.

J'ai fait face au même problème et j'ai essayé toutes sortes de solutions de contournement.

J'ai finalement compris que le problème était simple: je tenais la référence du contrôleur de détails dans mon maître et je ne libérais pas le contrôleur de détails précédent. Un simple relâchement dans le maître au bon endroit a résolu le problème.

4
Kalpesh Popat

J'ai également constaté ce comportement simplement parce que la vue Web n'avait pas été publiée.

4
ianjoyner

Je travaille sur le même problème. J'ai constaté que si vous définissez quelque chose comme ceci dans votre balise script:

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

Ensuite, dans votre UIViewController, ajoutez:

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

Il semble essayer de mettre en pause/arrêter la vidéo pendant plusieurs secondes, mais vous entendez alors le son continuer à jouer!


Mettre à jour!

Ceci est un bug général avec le lecteur multimédia. Vous devez définir le temps de lecture sur -1 afin de l'arrêter réellement.

2
tolar

Je viens tout juste de rencontrer un problème d'ouverture d'un fichier mp4 automatiquement dans le lecteur multimédia à partir d'une page Web sans possibilité de le fermer. Le bouton "Terminé" n'a été vu qu'en mode plein écran vidéo et vient de fermer en plein écran. Je n'avais donc aucun moyen de revenir en arrière. sur la page Web sans ajouter de bouton "Précédent" à la barre de navigation. (sur l'iPhone, la vidéo s'ouvrait dans une vue séparée avec le bouton "Terminé" renvoyant à la vue Web avec la page source)

La solution de contournement qui m'a aidé consiste à ouvrir le fichier vidéo dans un lecteur multimédia séparé.

attraper l'ouverture d'un fichier 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;
} 

où 

- (void) showFullscreenMediaWithURL: (NSURL *) mediaURL
{
    MPMoviePlayerViewController *ctrl = [[MPMoviePlayerViewController alloc] initWithContentURL: mediaURL];

    ctrl.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController: ctrl animated: YES];

    [ctrl release];
}

ouvre une vidéo avec une URL dans un lecteur multimédia dans une vue modèle

n'oubliez pas d'ajouter MediaPlayer.framework au projet et de l'importer

#import <MediaPlayer/MediaPlayer.h>

pour que le projet soit construit

PS merci beaucoup à Viktor Gubrienko pour la solution

1

En fait, je préfère utiliser le lien nul pour résoudre le problème Comme ceci:

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

J'ai eu le même problème dans Vue Table où la cellule de la vue Table a une vue Web qui charge un fichier audio. Une fois que vous avez lu et que vous revenez à un autre écran, le son est toujours lu. 

Solution: rechargez la vue tableau dans viewWillDisappear (_ :) du contrôleur de vue table et l'audio s'arrête de jouer lorsque vous accédez à un autre écran.

0
Sateesh Pasala

grâce à votre fil sur ce problème, j'ai pu trouver une solution qui résout complètement le problème, et je l'ai testée sur mon IPad, pas seulement sur le simulateur. Cela résout également le problème de lecture audio. Ce n'est pas la résolution permanente mais un travail efficace autour.

Vue d'ensemble de l'approche:

Fondamentalement, tout ce dont vous avez besoin est d’envoyer un court fichier audio à la WebView. J'ai fait une copie du fichier submarine.m4v de l'iMac, j'ai appelé ping.m4v et je l'ai ajouté à mon projet xcode dans le dossier de ressources.

Ensuite, au moment où je veux que la vidéo/audio s’arrête, je fais les étapes suivantes:

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]];

Maintenant, vous devez également gérer l'erreur "204". L'erreur 204 semble être juste un avertissement indiquant que WebView va gérer ce fichier audio. Pour gérer l'erreur, j'ai ajouté cette seule ligne (voir >>>) à 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.

Enfin, je tourne webView.hidden = FALSE juste avant d’afficher mon prochain fichier audio/vidéo. De cette façon, la petite barre de lecture du fichier son ne s’affiche pas. Il y a juste un son de ping doux ... n'importe quel fichier audio fera l'affaire ... 

J'espère que ça aide...

0
Steve S.

dans mon cas, avec loadHTMLString et non loadRequest avec @ "about: blank", corrige le problème sous macOS

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

C'est ce que j'utilise. Il enregistre cette erreur "Désactivation d'une session audio avec une E/S en cours d'exécution. Toutes les E/S doivent être arrêtées ou suspendues avant la désactivation de la session audio." mais empêche la lecture du fichier audio (sortie en fondu) et se souvient de la position de lecture.

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

La vue Web n'ayant pas été publiée, la vidéo continue de jouer sur la vue Web en arrière-plan.

Vous devez donc libérer la vue Web en utilisant simplement le code ci-dessous, ce qui me convient parfaitement.

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

J'espère que ça aide...

0
Gaurav Manani