2010-04-27 33 views
32

Veo este problema solo en el iPad. Las mismas cosas funcionan como se espera en el iPhone.La transmisión de video/audio no se detiene incluso si UIWebView está cerrado - iPad

Estoy abriendo la URL de mi aplicación en un UIWebView. Si la URL es una página web normal, funciona bien como se esperaba. Pero si la URL es la de un archivo de video/audio remoto, UIWebView abre el reproductor predeterminado, que nuevamente es bueno.

Ahora cuando descarto UIWebView (haciendo clic en el botón Listo en el reproductor), la transmisión no se detiene y el audio/video se reproduce en segundo plano (no puedo verlo, pero sigue jugando en el fondo, puede escucharlo). El UIViewController en el que se creó la vista web también está desasignado (pongo una declaración de registro en el método dealloc) pero la transmisión no se detiene.

¿Alguien puede ayudarme por qué esto podría estar pasando? ¿Y cómo puedo detener la transmisión de audio/video cuando UIWebView está cerrado?

Gracias.

Respuesta

51

Tengo el mismo problema que el mencionado, pero en este caso el video que no se detiene es un video de Youtube embebido usando el método de objeto/inserción.

Pasé mucho tiempo tratando de encontrar la manera de obtener el video para detener la reproducción y la única solución que encontré fue a decirle al UIWebView para cargar una página en blanco antes de despedir a la vista:

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

Editar (2015-05-12): Como se menciona en @chibimai a continuación, this answer by alloc_iNit works along the same lines pero como mi respuesta es de hace 5 años, y su única respuesta es 4, la respuesta vinculada puede ser más aplicable. Ya no trabajo el desarrollo del iPhone, así que no puedo determinar cuál es mejor de cualquier forma.

+0

¡eso es una solución, aunque sea una sucia! Gracias por compartir. Háganos saber si encuentra algo más. – lostInTransit

+0

Abrí google.com;) –

+1

He modificado mi publicación original para mostrar lo que estoy haciendo en realidad. Creo que me gusta el enfoque "sobre: ​​en blanco", ya que no implica aún más sobrecarga de red (especialmente si comienza a buscar recursos). – nivekastoreth

2

Estoy trabajando en el mismo problema. He descubierto que si se define algo como esto en su etiqueta script:

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

Luego, en su UIViewController, añadir en:

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

Parece que tratar de hacer una pausa/detener el video para varios segundos, pero luego escuchas que el audio continúa sonando


¡Actualización!

Esto es un error general con el reproductor multimedia. Tienes que establecer el tiempo de reproducción en -1 para que realmente se detenga.

+0

el tiempo de reproducción en -1 para qué? El video, la vista web, en algún lugar de la configuración? agradecer la ayuda – lostInTransit

+1

En su objeto de video HTML5, simplemente configure currentTime en -1 a través de javascript, ala: función stopVideo() { video = document.getElementById ('myVideo'); video.pause(); video.currentTime = -1; } – tolar

+0

Gracias, funciona muy bien donde incrusto los videos en las vistas web. Pero en caso de que abra la URL de un video en la vista web, ¿cómo puedo asegurar que esto también funcione? (Solo creo una solicitud de NSURL con la URL del video) – lostInTransit

0

gracias a su hilo sobre este tema Pude descubrir una solución que resuelve el problema por completo, y lo probé en mi iPad, no solo en el simulador. Esto también resuelve el problema con la reproducción de audio. Esta no es la resolución permanente sino una solución efectiva.

general del enfoque:

Básicamente todo lo que se necesita es enviar un archivo de audio corta a la web View. Hice una copia del archivo IMac submarine.m4v, llamé a ping.m4v y lo agregué a mi proyecto xcode en la carpeta de recursos.

A continuación, en el momento en que desea que el vídeo/audio para detener hago los siguientes pasos:

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

Ahora también hay que manejar el error "204". El error 204 parece ser solo una advertencia que dice que webView manejará este archivo de audio. Para controlar el error añadí esta línea única (ver >>>) a 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. 

Finalmente vuelvo webView.hidden = FALSE justo antes de que puedo mostrar mi próximo Audio/Video. De esta forma, la barra de reproducción pequeña para el archivo de sonido no se muestra en la pantalla. No es sólo un ping suave sonido ... cualquier archivo de audio va a hacer ...

espero que esto ayude ...

1

acabo de tener un problemas con una abertura de archivos MP4 de forma automática en el reproductor de medios de una página web sin posibilidad de cerrarla - El botón "Listo" solo se veía en modo de pantalla completa de video y solo cerraba pantalla completa, por lo que no tenía forma de regresar a la página web sin agregar un botón "Atrás" a la barra de navegación. (en iPhone el video se estaba abriendo en una vista separada con el botón "Listo" regresando a WebView con la página de origen)

La solución que me ayudó es abrir el archivo de video en un reproductor multimedia separado.

abrir un archivo 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; 
} 

retén donde

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

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

    [ctrl release]; 
} 

abre vídeo con el URL en un reproductor de medios de comunicación en una vista de modelo

no se olvide de añadir a MediaPlayer.framework el proyecto y la importación

#import <MediaPlayer/MediaPlayer.h> 

para el proyecto que se construirá

PS. muchas gracias a Viktor Gubrienko por la solución

4

Sé que este es un hilo muy viejo, pero por el bien de los nuevos desarrolladores como yo.

Mi escenario era: yo estaba usando el controlador de división, la lista de medios de maestro y jugador de la sección del controlador detalle

me enfrenté al mismo problema y trató todo tipo de solución.

Finalmente me di cuenta de que el problema era simple, tenía la referencia del controlador de detalle en mi maestro y no estaba liberando el controlador de detalles anterior. Un simple lanzamiento en el maestro en el lugar correcto resolvió el problema.

4

También encontré este comportamiento simplemente porque la vista web no se había liberado.

0

Esto es lo que uso. Registra este error "Desactivar una sesión de audio que tiene E/S en ejecución. Todas las E/S deben detenerse o pausarse antes de desactivar la sesión de audio". pero detiene la reproducción del archivo de audio (desvanecimiento) y recuerda la posición de reproducción.

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

De hecho, prefiero usar el enlace nulo para resolver el problema. así:

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

Como vista web no había sido puesto en libertad, el video sigue jugando en la web Ver en el fondo.

Por lo tanto, debe liberar la vista web simplemente utilizando el siguiente código que funciona bien para mí.

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

espero que esto ayude ...

Cuestiones relacionadas