Quiero poder controlar jugadores de YouTube basados en iframe. Estos reproductores ya estarán en HTML, pero quiero controlarlos a través de la API de JavaScript.
He estado leyendo la documentación de la API de iframe que explica cómo agregar un nuevo video a la página con la API, y luego controlarlo con las funciones del reproductor de YouTube:
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('container', {
height: '390',
width: '640',
videoId: 'u1zgFlCw8Aw',
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
Ese código crea un nuevo objeto jugador y lo asigna a 'jugador', luego lo inserta dentro del #container div. Entonces puedo operar en 'jugador' y llamada playVideo()
, pauseVideo()
etc. en ella.
Pero quiero poder operar con reproductores de iframe que ya están en la página.
Podría hacer esto muy fácilmente con el antiguo método de inserción, con algo como:
player = getElementById('whateverID');
player.playVideo();
Pero esto no funciona con los nuevos iframes. ¿Cómo puedo asignar un objeto iframe que ya está en la página y luego usar las funciones API en él?
fuente
Respuestas:
Fiddle Links: Código fuente - Vista previa - Versión pequeña
Actualización: Esta pequeña función solo ejecutará código en una sola dirección. Si desea soporte completo (por ejemplo, oyentes / captadores de eventos), eche un vistazo a Escuchar eventos de Youtube en jQuery
Como resultado de un análisis de código profundo, he creado una función:
function callPlayer
solicita una llamada de función en cualquier video de YouTube enmarcado. Ver la referencia de la API de YouTube para obtener una lista completa de posibles llamadas a funciones. Lea los comentarios en el código fuente para obtener una explicación.El 17 de mayo de 2012, el tamaño del código se duplicó para cuidar el estado de preparación del jugador. Si necesita una función compacta que no se ocupe del estado de preparación del reproductor, consulte http://jsfiddle.net/8R5y6/ .
Uso:
Posibles preguntas (y respuestas):
P : ¡No funciona!
R : "No funciona" no es una descripción clara. ¿Recibe usted algún mensaje de error? Por favor, muestre el código relevante.
P :
playVideo
no reproduce el video.R : La reproducción requiere la interacción del usuario y la presencia de
allow="autoplay"
iframe. Ver https://developers.google.com/web/updates/2017/09/autoplay-policy-changes y https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guideP : ¡He incrustado un video de YouTube usando
<iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
pero la función no ejecuta ninguna función!R : Debe agregar
?enablejsapi=1
al final de su URL:/embed/vid_id?enablejsapi=1
.P : Recibo el mensaje de error "Se especificó una cadena no válida o ilegal". ¿Por qué?
R : La API no funciona correctamente en un host local (
file://
). Aloje su página (prueba) en línea o use JSFiddle . Ejemplos: Vea los enlaces en la parte superior de esta respuesta.P : ¿Cómo supiste esto?
R : He pasado algún tiempo para interpretar manualmente la fuente de la API. Llegué a la conclusión de que tenía que usar el
postMessage
método. Para saber qué argumentos pasar, creé una extensión de Chrome que intercepta los mensajes. El código fuente de la extensión se puede descargar aquí. .P : ¿Qué navegadores son compatibles?
R : Todos los navegadores que admiten JSON y
postMessage
.document.readyState
se implementó en 3.6)Respuesta / implementación relacionada: Fade-in en un video enmarcado usando jQuery
Soporte completo de API: Escuchando el evento de Youtube en jQuery
API oficial: https://developers.google.com/youtube/iframe_api_reference
Revisión histórica
Implementado
onYouTubePlayerReady
:callPlayer('frame_id', function() { ... })
.Las funciones se ponen en cola automáticamente cuando el reproductor aún no está listo.
Actualizado y probado sucesivamente en los navegadores compatibles (mirar hacia adelante).
callPlayer
obliga a una verificación de disponibilidad. Esto es necesario, porque cuandocallPlayer
se llama justo después de la inserción del iframe mientras el documento está listo, no puede saber con certeza si el iframe está completamente listo. En Internet Explorer y Firefox, este escenario resultó en una invocación demasiado temprana depostMessage
, lo cual fue ignorado.&origin=*
en la URL.&origin=*
a la URL.fuente
PostMessage
método se basa en la API YT JS (?enablejsapi=1
). Sin habilitar la API JS, elpostMessage
método no hará nada. Consulte la respuesta vinculada para una implementación sencilla de los oyentes de eventos. También he creado, pero no publicado, código legible para comunicarme con el marco. Decidí no publicarlo, porque su efecto es similar al API Frame predeterminado de YouTube.playVideo
, así que recomiendo usar la API oficial para eso. Consulta developers.google.com/youtube/iframe_api_reference#Events .¡Parece que YouTube ha actualizado su API JS, por lo que está disponible de forma predeterminada! Puede usar una ID de iframe de YouTube existente ...
... en tu JS ...
... y el constructor usará su iframe existente en lugar de reemplazarlo por uno nuevo. Esto también significa que no tiene que especificar el videoId al constructor.
Ver Cargando un reproductor de video
fuente
event
ocommand
enviar al iframe de YT para detenerlistening
el estado?Puede hacer esto con mucho menos código:
Ejemplo de trabajo: http://jsfiddle.net/kmturley/g6P5H/296/
fuente
Mi propia versión del código de Kim T anterior que se combina con algunos jQuery y permite la orientación de iframes específicos.
fuente
OnStateChange
: developers.google.com/youtube/iframe_api_reference#EventsGracias Rob W por tu respuesta.
He estado usando esto dentro de una aplicación Cordova para evitar tener que cargar la API y poder controlar fácilmente los iframes que se cargan dinámicamente.
Siempre quise poder extraer información del iframe, como el estado (getPlayerState) y la hora (getCurrentTime).
Rob W ayudó a resaltar cómo funciona la API usando postMessage, pero, por supuesto, esto solo envía información en una dirección, desde nuestra página web al iframe. El acceso a los captadores requiere que escuchemos los mensajes publicados desde el iframe.
Me tomó algo de tiempo descubrir cómo ajustar la respuesta de Rob W para activar y escuchar los mensajes devueltos por el iframe. Básicamente busqué en el código fuente dentro del iframe de YouTube hasta que encontré el código responsable de enviar y recibir mensajes.
La clave fue cambiar el 'evento' a 'escuchar', esto básicamente dio acceso a todos los métodos que fueron diseñados para devolver valores.
A continuación se encuentra mi solución, tenga en cuenta que he cambiado a 'escuchar' solo cuando se solicitan captadores, puede modificar la condición para incluir métodos adicionales.
Tenga en cuenta además que puede ver todos los mensajes enviados desde el iframe agregando un console.log (e) al window.onmessage. Notará que una vez que se activa la escucha, recibirá actualizaciones constantes que incluyen la hora actual del video. Al llamar a getters como getPlayerState se activarán estas actualizaciones constantes, pero solo enviarán un mensaje que involucre el estado del video cuando el estado haya cambiado.
fuente