2014-11-22 14 views
9

Le miniature sembravano andare bene per oltre un anno, ma improvvisamente si sono fatte sfocate. La miniatura che appare sul caricamento della pagina sembra corretta, ma ogni volta che viene visualizzata una nuova miniatura usando "player.cueVideoById", sembra molto sfocata.Come forzare le miniature di alta qualità per l'API di YouTube Player iframe Embedded?

Non c'è alcun riferimento nella documentazione su come controllare la qualità dell'anteprima (sono disponibili solo le impostazioni di qualità video, come "setPlaybackQuality"). La documentazione: https://developers.google.com/youtube/iframe_api_reference

Come posso forzare le immagini di anteprima di alta qualità?

risposta

13

Sì, questo problema è facilmente riproducibile. Ho creato un slightly modified version of the documentation example, carica un video e chiama setPlaybackQuality un secondo dopo. È chiaramente visibile che la qualità diminuisce. Infatti, la miniatura originale è https://i.ytimg.com/vi/M7lc1UVf-VE/sddefault.jpg, è stata sostituita da https://i1.ytimg.com/vi/M7lc1UVf-VE/default.jpg.

Mentre il lettore Flash è piuttosto opaco, per il lettore HTML5 possiamo dare un'occhiata al (piuttosto offuscato) source code. Questo pezzo di codice è particolarmente interessante (riformattato per migliorare la leggibilità):

var c; 
if (!a.j) 
{ 
    var d = a.element.clientWidth, 
     e=a.element.clientHeight; 
    if (900 < d || 600 < e) 
    c = Av(b, "maxresdefault.jpg"); 
    !c && (430 < d||320 < e) && (c = Av(b, "sddefault.jpg")) 
} 
c || (c = Av(b, "default.jpg")); 

Questo indica che si sta effettivamente non suppone di controllare la qualità delle miniature, è piuttosto impostato in base alle dimensioni della finestra. Se la larghezza supera i 900 o l'altezza supera i 600, si ottiene maxresdefault.jpg, se la larghezza supera i 430 o l'altezza supera i 320 si ottiene sddefault.jpg e in tutti i casi rimanenti si ottiene default.jpg. Funziona così davvero - per il carico iniziale. E questo sembra essere il comportamento previsto.

Tuttavia, questo non è quello che si ottiene per player.cueVideoById() - c'è sempre default.jpg, presumibilmente perché a.j è impostato (qualunque essa sia) . Modifica: In realtà, il debug del codice ha dimostrato che a.j non è il colpevole qui. Invece, la funzione Av restituisce undefined quando viene richiesto un valore diverso da "default.jpg" perché le strutture di dati (in particolare la mappa b.La) non sono inizializzate completamente. Per me, questo sembra semplicemente un bug, e sembra che fosse già reported to Google.

Per riferimento, il codice sorgente della funzione Av:

function Av(a,b) 
{ 
    if (30 == a.O) 
    { 
    // This branch isn't being entered 
    var c = a.La["default.jpg"]; 
    return c?c:a.videoId?de("//docs.google.com/vt",{id:a.videoId,authuser:a.Wa,authkey:a.Kb}):"//docs.google.com/images/doclist/cleardot.gif" 
    } 
    b || (b="hqdefault.jpg"); 
    return (c = a.La[b]) || "sddefault.jpg" == b || "maxresdefault.jpg" == b ? 
    c : 
    Mt(a.videoId, b) 
} 

Mt(a.videoId, b) sarebbero ritornati l'URL corretto, ma la funzione restituisce c invece significa undefined.

Si noti che il testo sopra si applica solo al lettore HTML5. Il comportamento del lettore Flash è leggermente diverso e allo stesso modo incoerente.

Problemi correlati