2014-09-14 1 views
5

J'écris un script utilisateur pour télécharger des vidéos. Le lecteur flash du site Web utilise un fichier JSON.
Le but de mon script est d'obtenir l'url de la vidéo en téléchargeant et en analysant la vidéo en fonction de la page Web. Actuellement, il peut télécharger un extrait de l'URL des vidéos avec succès.Comment obtenir la hauteur et la largeur d'une vidéo à partir d'une URL MP4 avec ecmascript pur et sans le navigateur pour h.264?

La partie importante de l'apparence du fichier JSON comme ceci:

{ 
     "ammProfile": "AMM-HBBTV", 
     "version": "VF", 
     "versionProg": "1", 
     "VFO": "HBBTV", 
     "VMT": "mp4", 
     "VUR": "http://vo.llnwd.net/v2/am/HBBTV/051332-074-A_SQ_2_VF_01464306_MP4-2200_AMM-HBBTV.mp4" 
    }, { 
     "ammProfile": "AMM-HBBTV", 
     "version": "VF", 
     "versionProg": "1", 
     "VFO": "HBBTV", 
     "VMT": "mp4", 
     "VUR": "http://vo.llnwd.net/v2/am/HBBTV/051332-074-A_EQ_2_VF_01464315_MP4-1500_AMM-HBBTV.mp4" 
    } 

Les deux URL ici sont de la même vidéo, ce juste est que la résolution du changement.

Alors, Comment puis-je analyser les métadonnées pertinentes sans télécharger le fichier entier? La norme pour le codec vidéo H.264 est très difficile à lire.

+0

Note: ce regard possible * (au moins) * pour les fichiers audio avec [mp4js] (https://github.com/lennart/mp4). Il n'y a pas de contrainte sur la même politique d'origine, donc AJAX peut fonctionner * (C'est comme ça que je reçois l'URL des fichiers) *. Le lien fourni ici ne sont pas les vrais liens, car je ne peux pas les partager publiquement. L'encodage vidéo utilisé pour tous les fichiers est ** H.264 **, mais les brevets logiciels ne s'appliquent pas dans ma région, donc c'est bien de décoder les métadonnées. – user2284570

Répondre

2

Vous pouvez utiliser l'en-tête HTTP Range via XMLHttpRequest pour obtenir seulement une partie du fichier:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Par exemple:

xhr.setRequestHeader ('Range', 'bytes=0-' + (fragment_size - 1)) 
xhr.setRequestHeader ('Content-Length', fragment_size) // This part isn't absolutely required on most (all?) browsers. 
+0

... et ensuite analyser le fragment de données binaires (MP4) dans le JavaScript principalement non privilégié? Comment fait-on * cela * exactement? Pouvez-vous en quelque sorte utilisé des tableaux typés pour obtenir les octets? –

+1

Ce serait un problème si les vidéos étaient .. "téléchargées" .. de l'utilisateur, mais nous utilisons vraisemblablement ici Ajax, qui peut définitivement lire les données sous forme d'octets et les alimenter en tableaux typés. Même s'il était entièrement côté client (pas d'accès internet), vous pourriez peut-être installer un faux serveur HTTP ... – Agamemnus

+0

@Agamemnus: Cela ressemble à [très dur] (http://stackoverflow.com/a/6477652/2284570). – user2284570

7

vous n'avez pas besoin de charger l'ensemble vidéo pour obtenir la hauteur:

function getVideoHeight(url, fnCallback){ 

var video=document.createElement("video"); 
    video.autoplay=true; 
    video.oncanplay=function(){ 
    fnCallback(this.offsetWidth, this.offsetHeight); 
    this.src="about:blank"; 
    document.body.removeChild(video); 
    }; 

    document.body.appendChild(video); 
    video.src=url; 

} 


//test: 

getVideoHeight(
    "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4", 
    function(w,h){ alert(w+"X"+h); } 
); // shows: "640X360" 
+1

Une grande partie du marché des navigateurs ne prend pas en charge le codec vidéo H.264 ... La solution HTML5 nécessite que le navigateur prenne en charge le codec ... – user2284570

+0

@ user2284570: en fait, il ne s'agit que de Firefox sur OSX , mais la plupart des utilisateurs Mac utilisent Safari ou Chrome de toute façon. Si vous avez un lecteur flash, vous pouvez faire le même style de charge-vérifier-décharger en utilisant flash. voir http://caniuse.com/#feat=mpeg4 pour les détails du navigateur. – dandavis

+0

Ok: selon vous, 30% des personnes qui utilisent Internet sont une part négligeable? Le but de mon script utilisateur est d'éviter d'utiliser Flash sur leur site. – user2284570

2

J'utilise l'entête de gamme xhr à faire wnload contenu partiel, puis obtenir les informations de fichier en utilisant videoconverter.js, une version JS de ffmpeg (dont vous devez vérifier la licence si vous prévoyez d'utiliser l'un de ces).

var videoUrl = 'https://dl.dropboxusercontent.com/u/17698405/bla.mp4'; 
 

 
var cmd = '-i myfile.mp4'; 
 
var args = parseArguments(cmd); 
 
var sizeToDownload = 200*1024; 
 

 
retrieveVideo(videoUrl, sizeToDownload, function(fileData) { 
 
\t ffmpeg_run({ 
 
\t \t arguments: args, 
 
\t \t files: [{ 
 
\t \t \t name: 'myfile.mp4', 
 
\t \t \t data: fileData 
 
\t \t }], 
 
\t \t print: print, 
 
\t \t printErr: print \t 
 
\t }); \t 
 
}); 
 

 
function parseArguments(text) { 
 
    text = text.replace(/\s+/g, ' '); 
 
    var args = []; 
 
    text.split('"').forEach(function(t, i) { 
 
    t = t.trim(); 
 
    if ((i % 2) === 1) { 
 
     args.push(t); 
 
    } else { 
 
     args = args.concat(t.split(" ")); 
 
    } 
 
    }); 
 
    return args; 
 
} 
 

 

 
function retrieveVideo(path, fragment_size, callback) { 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.open("GET", path, true); 
 
    xhr.responseType = "arraybuffer"; 
 
    xhr.setRequestHeader ('Range', 'bytes=0-' + (fragment_size - 1)); 
 

 
    xhr.onload = function (oEvent) { 
 
    var arrayBuffer = xhr.response; 
 
    if (arrayBuffer) { 
 
     callback(new Uint8Array(arrayBuffer)); 
 
    } 
 
    }; 
 

 
    xhr.send(null); 
 
} 
 

 
var textarea = document.getElementsByTagName('textarea')[0]; 
 

 
function print(text) { 
 
\t textarea.value += '> ' + text + '\n'; 
 
}
* { box-sizing: border-box } 
 
html,body { height: 100%; margin: 0; padding: 0; overflow: hidden } 
 
textarea { width: 100%; height: 100%; }
<script src="https://rawgit.com/bgrins/videoconverter.js/master/build/ffmpeg-all-codecs.js"></script> 
 
<textarea></textarea>

+0

Ok, juste par curiosité, comment cela fait pour contourner la même politique d'origine? – user2284570

+0

Le domaine que j'ai utilisé ici permet un accès interdomaines via les en-têtes http CORS – antishok

+0

Ok, vous voulez dire que ça ne marcherait pas dans mon script. – user2284570

Questions connexes