2014-09-14 3 views
5

Я пишу сценарий пользователя для загрузки видео. Flash-плеер веб-сайта использует JSON-файл.
Цель моего скрипта - получить URL-адрес видео, загрузив и разобрав видео в соответствии с веб-страницей. В настоящее время он может загрузить извлечение URL-адреса видео успешно.Как получить высоту и ширину видеоролика с URL-адреса MP4 с помощью чистого ecmascript и без поддержки браузера для h.264?

Важная часть JSON файл выглядит следующим образом:

{ 
     "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" 
    } 

Оба URL здесь о том же видео, это просто только разрешение, которое изменение.

Итак, Как я могу проанализировать соответствующие метаданные без скачивания всего файла? Стандарт для видеокодека H.264: очень сложно читать.

+0

Примечание: этот взгляд возможно * (по крайней мере) * для аудио файлов с [mp4js] (https://github.com/lennart/mp4). Нет ограничений относительно одной и той же политики происхождения, поэтому AJAX может работать * (Вот как я получаю URL-адрес файлов) *. Ссылка, представленная здесь, не является реальными ссылками, потому что я не могу публично их публиковать. Кодировка видео, используемая для всех файлов, - ** H.264 **, но патенты на программное обеспечение не применяются в моем регионе, поэтому прекрасно декодировать метаданные. – user2284570

ответ

2

Вы можете использовать заголовок Range HTTP, чтобы получить только часть файла с помощью XMLHttpRequest:

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

Например:

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

... а затем проанализировать фрагмент двоичных (MP4) данных в большинстве непривилегированных JavaScript? Как это делается точно. Можете ли вы каким-то образом использовать типизированные массивы, чтобы получить байты? –

+1

Было бы проблемой, если бы видео были «загружены» .. от пользователя, но предположительно мы используем Ajax здесь, который может определенно читать данные в виде байтов и подавать их в типизированные массивы. Даже если это было полностью на стороне клиента (без доступа в Интернет), вы могли бы установить какой-то поддельный HTTP-сервер ... – Agamemnus

+0

@Agamemnus: Похоже, [очень сложно] (http://stackoverflow.com/a/6477652/2284570). – user2284570

7

вам не нужно загружать весь видео, чтобы получить высоту:

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

Большая часть рынка браузеров не поддерживает видеокодек H.264 ... Решение HTML5 требует, чтобы браузер поддерживал кодек ... – user2284570

+0

@ user2284570: на самом деле это довольно просто firefox на OSX, который будет иметь проблемы , но большинство пользователей Mac в любом случае используют Safari или Chrome. если у вас есть флеш-плеер, вы можете сделать тот же стиль загрузки-проверки-разгрузки с использованием флэш-памяти. см. http://caniuse.com/#feat=mpeg4 для получения сведений о браузере. – dandavis

+0

Хорошо: по вашему мнению, 30% людей, которые пользуются Интернетом, являются пренебрежимо малой долей? Цель моего пользовательского скрипта - избегать использования flash на своем сайте. – user2284570

2

Я использую заголовок диапазона xhr, чтобы сделать wnload частичный контент, а затем получить информацию о файле, используя videoconverter.js, версию JF ffmpeg (чью лицензию вы должны проверить, планируете ли вы использовать ее).

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

Хорошо, просто из любопытства, как это делается, чтобы обойти политику одного и того же происхождения? – user2284570

+0

Домен, который я использовал там, позволяет использовать междоменный доступ через HTTP-заголовки CORS – antishok

+0

Хорошо, вы имеете в виду, что он не будет работать в моем скрипте. – user2284570