2012-03-13 5 views
5

Chciałbym dynamicznie generować strumień bitów w JavaScript, który jest np. duży film OGG. Czy można poprosić przeglądarkę, aby poprosiła o funkcję JavaScript dla strumienia bitów zamiast wysyłać żądanie HTTP-GET do jakiejś lokalizacji?Czy można wygenerować strumień bitów w JS dla źródła wideo HTML5?

Jedyny możliwy sposób na podanie danych do znacznika wideo, który znalazłem, będzie zawierać dane: -URL. Wymaga to jednak zakodowania całego filmu w dokumencie.

To złe rozwiązanie dla dużych filmów, które normalnie byłyby przesyłane strumieniowo. AFAIK, nie możesz dynamicznie dodawać więcej danych do adresów danych.

Czy ktoś wie, czy jest to możliwe?

+0

masz na myśli używając „Dane: string” - jak można w znaczniku img? (http://stackoverflow.com/questions/1207190/embedding-base64-images) – T4NK3R

Odpowiedz

0

Powinno być teraz możliwe z MediaSource API.

Oto przykład z linku powyżej:

var video = document.querySelector('video'); 

var assetURL = 'frag_bunny.mp4'; 
// Need to be specific for Blink regarding codecs 
// ./mp4info frag_bunny.mp4 | grep Codec 
var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'; 

if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) { 
    var mediaSource = new MediaSource(); 
    //console.log(mediaSource.readyState); // closed 
    video.src = URL.createObjectURL(mediaSource); 
    mediaSource.addEventListener('sourceopen', sourceOpen); 
} else { 
    console.error('Unsupported MIME type or codec: ', mimeCodec); 
} 

function sourceOpen (_) { 
    //console.log(this.readyState); // open 
    var mediaSource = this; 
    var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec); 
    fetchAB(assetURL, function (buf) { 
    sourceBuffer.addEventListener('updateend', function (_) { 
     mediaSource.endOfStream(); 
     video.play(); 
     //console.log(mediaSource.readyState); // ended 
    }); 
    sourceBuffer.appendBuffer(buf); 
    }); 
}; 

function fetchAB (url, cb) { 
    console.log(url); 
    var xhr = new XMLHttpRequest; 
    xhr.open('get', url); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function() { 
    cb(xhr.response); 
    }; 
    xhr.send(); 
}; 
0

Jeśli Twój film jest zakodowany do przesyłania strumieniowego, będzie on pobierany stopniowo, niezależnie od tego, jakiej przeglądarki zażąda. Tak po prostu działa. Będziesz potrzebował OGG i MP4 na

FF/Chrome/IE9.

http://www.mediacollege.com/video/streaming/http.html

"zakodowane w dokumencie" nie ma żadnego sensu. Wideo jest zakodowane przez twój koder i może dalej mieć ustawienia optymalizacji pod kątem przesyłania strumieniowego (to znaczy koduje pierwsze XX sekund przy niższej szybkości transmisji, aby rozpocząć szybciej).

1

Nie wiem, czy jest to możliwe z Javascriptem, ale prawdopodobnie możesz zrobić coś takiego z odtwarzaczem Java lub Javascript (?), Takim jak Cortado.

http://www.flumotion.net/cortado/

+0

Dzięki, to jest przydatne. Widziałem gdzieś dekoder JavaScript, który rysuje ramki na płótnie. To oczywiście nie jest tak szybkie i nie ma dźwięku. Ale to wszystko obejście. Cortado wymaga na przykład Java. – anty