¿Hay una manera relativamente fácil de reproducir un video en AVFoundation?
He creado mi AVPlayer y AVPlayerLayer así:
avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];
avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];
y luego reproduzco mi video con:
[avPlayer play];
El video se reproduce bien pero se detiene al final. Con MPMoviePlayerController, todo lo que tiene que hacer es establecer su repeatMode
propiedad en el valor correcto. No parece haber una propiedad similar en AVPlayer. Tampoco parece haber una devolución de llamada que me diga cuándo ha terminado la película, así que puedo buscar desde el principio y volver a reproducirla.
No estoy usando MPMoviePlayerController porque tiene algunas limitaciones serias. Quiero poder reproducir múltiples transmisiones de video a la vez.
Respuestas:
Puedes recibir una Notificación cuando el jugador termine. Cheque
AVPlayerItemDidPlayToEndTimeNotification
Al configurar el reproductor:
ObjC
Esto evitará que el jugador haga una pausa al final.
en la notificación:
Esto rebobinará la película.
No olvide anular el registro de la notificación al liberar al jugador.
Rápido
Swift 4+
fuente
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
no se detendrá, por lo que no hay necesidad de ponerlo a jugar de nuevo[player play];
después de rebobinar.[[NSNotificationCenter defaultCenter] removeObserver:self];
por ejemplo, cuandoself
escucha las notificaciones.Si ayuda, en iOS / tvOS 10, hay un nuevo AVPlayerLooper () que puede usar para crear un bucle continuo de video (Swift):
Esto se presentó en WWDC 2016 en "Avances en la reproducción de AVFoundation": https://developer.apple.com/videos/play/wwdc2016/503/
Incluso usando este código, tuve un problema hasta que presenté un informe de error con Apple y obtuve esta respuesta:
Resulta que Premiere había estado exportando archivos con una pista de audio de una longitud ligeramente diferente al video. En mi caso, estaba bien eliminar el audio por completo, y eso solucionó el problema.
fuente
En Swift :
Puede recibir una notificación cuando el reproductor termine ... verifique AVPlayerItemDidPlayToEndTimeNotification
al configurar el reproductor:
Esto evitará que el jugador haga una pausa al final.
en la notificación:
Swift3
Esto rebobinará la película.
No olvide anular el registro de la notificación al liberar al jugador.
fuente
Esto es lo que terminé haciendo para evitar el problema de pausa-hipo:
Rápido:
C objetivo:
NOTA: No utilicé
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone
ya que no es necesario.fuente
[weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];
líneas: cuando comento estas líneas ya no hay una pérdida de memoria. He perfilado esto en instrumentos.Recomiendo usar AVQueuePlayer para reproducir sus videos sin problemas. Agregar el observador de notificaciones
y en su selector, reproduce tu video
fuente
Para evitar la brecha cuando se rebobina el video, usar varias copias del mismo activo en una composición funcionó bien para mí. Lo encontré aquí:
www.developers-life.com/avplayer-looping-video-without-hiccupdelays.html(enlace ahora muerto).fuente
esto funcionó para mí sin problemas de hipo, el punto es detener el reproductor antes de llamar al método seekToTime:
init AVPlayer
registro de notificaciones
función videoLoop
fuente
Para Swift 3 y 4
fuente
mi solución en Objective-c con AVQueuePlayer: parece que debe duplicar el AVPlayerItem y al finalizar la reproducción del primer elemento, agregue instantáneamente otra copia. "Tipo de" tiene sentido y funciona para mí sin ningún contratiempo
https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad
fuente
Swift 5:
He hecho algunos pequeños ajustes de las respuestas anteriores, como agregar el elemento de jugador a la cola antes de agregarlo a la capa de jugador.
Y haga que playerLooper sea una propiedad de su UIViewController, de lo contrario, el video solo puede reproducirse una vez.
fuente
Después de cargar el video en AVPlayer (a través de su AVPlayerItem, por supuesto):
El método addDidPlayToEndTimeNotificationForPlayerItem:
En su método viewWillDisappear:
En la declaración de la interfaz de su controlador de vista dentro del archivo de implementación:
¿Necesita ver esto en funcionamiento antes de intentarlo? Descargue y ejecute esta aplicación de muestra:
https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_APLViewIDtrol_Control_LL
En mi aplicación, que usa este mismo código, no hay pausa alguna entre el final del video y el comienzo. De hecho, dependiendo del video, no hay forma de que sepa que el video está al principio nuevamente, salvo la visualización del código de tiempo.
fuente
puede agregar un observador AVPlayerItemDidPlayToEndTimeNotification y reproducir el video desde el inicio en el selector, código como a continuación
fuente
Lo siguiente me funciona en WKWebView en swift 4.1 La parte principal de WKWebView en WKwebviewConfiguration
fuente
Lo que hice es hacer que se reproduzca en bucle, como mi código a continuación:
fuente
Swift 4.2 en Xcode 10.1.
Sí , hay una forma relativamente fácil de reproducir
AVKit
/AVFoundation
usar un videoAVQueuePlayer()
, la técnica de Observación de valores clave (KVO) y un token para ello.Esto definitivamente funciona para un montón de videos H.264 / HEVC con una carga mínima para la CPU.
Aquí hay un código:
fuente
use el siguiente código AVPlayerViewController, me funciona
Todos los controles que se mostrarán, espero que sea útil
fuente
Esta propiedad ya está definida en su interior
AVAudioPlayer
. Espero que esto le pueda ayudar. Estoy usando Xcode 6.3.fuente