2011-09-06 16 views
30

Me pregunto si hay alguna forma directa de lograr este efecto, sin necesidad de código de fondo para extraer un marco, guardarlo como un jpg y la base de datos en alguna parte.¿Utiliza dinámicamente el primer fotograma como póster en video HTML5?

Un efecto por el cual el primer fotograma del video aparece como el póster cuando el video se carga sería tan útil (solo funcionaría si el navegador puede reproducir el video obviamente, lo que podría ser un poco diferente de cómo poster tradicionalmente funciona, pero eso no es una preocupación.

Respuesta

19

hay un plugin Popcorn.js llamada Popcorn.capture que permitirá crear carteles de cualquier fotograma de vídeo HTML5.

hay una limitación que se impone por la navegador que prohíbe leer datos de píxeles de los recursos solicitados en todos los dominios (utilizando la API canvas para registrar el valor actual de un cuadro). El video fuente debe estar alojado en el mismo dominio que el script y la página html que lo está solicitando para que este enfoque funcione.

El código para crear póster con este plugin es bastante simple:

// This block of code must be run _after_ the DOM is ready 
// This will capture the frame at the 10th second and create a poster 
var video = Popcorn("#video-id"); 

// Once the video has loaded into memory, we can capture the poster 
video.listen("canplayall", function() { 

    this.currentTime(10).capture(); 

}); 
+0

parece que es lo que necesito. No puedo hacer que las palomitas de maíz funcionen por desgracia ... obteniendo 'Error no capturado: INVALID_STATE_ERR: DOM Exception 11 popcorn.js: 389 Popcorn.extend.Popcorn.forEach.ret popcorn.js: 389' cada vez que lo llamo. – Damon

+0

Parece que no está esperando que se cargue el video. He actualizado el ejemplo de código anterior para esperar y luego configurar el póster. – Rick

+1

gracias ... eso lo hizo funcionar. en su mayor parte de todos modos ... estaba bajo la impresión de los documentos de que 'this.capture ({at: 1}). currentTime (0); 'tomaría un póster desde 1 segundo y luego pondría el video al principio , pero lo deja en 1 segundo. ¿Tienes alguna experiencia con eso? – Damon

6

Puede establecer preload='auto' en el elemento de vídeo para cargar el primer fotograma del vídeo de forma automática.

+0

Solo un consejo: precarga significa que el video puede descargarse automáticamente sin la acción del usuario. Es lo que ocurre de manera predeterminada en Chrome, Firefox e IE en el escritorio. Por lo tanto, asegúrese de que no empeore la experiencia del usuario en su página. – Louhike

+1

Buen punto, aunque este es el caso solo en el escritorio ya que es una sugerencia, no una directiva. Un poco desactualizado, pero vea https://www.stevesouders.com/blog/2013/04/12/html5-video-preload/ –

8

Recientemente hice esto para un proyecto reciente que funciona en computadoras de escritorio y dispositivos móviles. El truco era hacer que funcionara en iPhone.

Configuración preload=metadata funciona en dispositivos de escritorio y Android pero no en iPhone.

Para iPhones tuve que configurarlo en autoplay para que la imagen del póster aparezca automáticamente en la carga inicial. Los iPhones evitarán que el video se reproduzca automáticamente, pero la imagen del póster aparecerá como resultado.

Tenía que hacer un control para iPhone usando la respuesta de Pavan que se encuentra aquí. Detect iPhone Browser. Luego, use la etiqueta de video adecuada con o sin autoplay dependiendo del dispositivo.

var agent = navigator.userAgent; 
var isIphone = ((agent.indexOf('iPhone') != -1) || (agent.indexOf('iPod') != -1)) ; 

$videoTag = ""; 
if(isIphone()) { 
    $videoTag = '<video controls autoplay preload="metadata">'; 
} else { 
    $videoTag = '<video controls preload="metadata">'; 
} 
+1

Esta respuesta explica por qué ocurre este problema y brinda una alternativa.Tenga en cuenta que en iOS 10 el atributo de reproducción automática se puede cumplir si se cumplen algunas condiciones. Así que sugeriría que todos pausen el video inmediatamente para evitar la reproducción automática. –

+0

@Alessandro puede mostrar un código de cómo podemos manejar esto en ios 10 sería genial Gracias – Mourice

+1

algo así como 'var video = document.createElement ('video'); video.controls = true; video.preload = 'metadata'; if (isIphone) {video.autoplay = verdadero; video.pause(); } ' –