2015-01-15 23 views
7

Sto costruendo una piccola applicazione che utilizza l'API MediaRecoder per dividere il video di ricodifica dalla webcam e caricare tutta la parte sul server.
Vedo che con l'API di Media Source, ho bisogno di suonare la prima parte e quindi riprodurre qualsiasi altra parte.Come generare il segmento di inizializzazione del video Webm da utilizzare con l'API di Media Source

In base a http://www.w3.org/TR/media-source/#examples ho bisogno del "segmento di inizializzazione" all'inizio del file.

Come posso generare "Segmento di inizializzazione" di WebM in JS in modo da poter riprodurre qualsiasi parte che scelgo. C'è qualche possibilità per questo? (Non ho conoscenza di WebM formato di flusso di byte)

+0

ciao @nvcnvn! qualche progresso con argomento? Genero stream vp8 per la porta udp e il mio piccolo server per udp-> websockets. Inoltre non so che tipo di segmento di inizializzazione dovrei pubblicare e come generarlo .. – zarkone

+1

@zarkone, ho trovato che questo è il "vicolo cieco" del mio progetto, MediaRecoder non divide il video in tonnellate di parti può giocare, è semplicemente dividere il video in una parte di byte. Non c'è modo di riprodurre queste parti con Media Source – nvcnvn

risposta

2

è necessario utilizzare le estensioni di origine supporti

Si prega di fare riferimento al di sotto esempio

<script> 
    var appendID = "123"; 

    function onOpen(e) { 
    var video = e.target; 

    var headers = GetStreamHeaders(); 

    if (headers == null) { 
     // Error fetching headers. Signal end of stream with an error. 
     video.sourceEndOfStream(HTMLMediaElement.EOS_NETWORK_ERR); 
    } 

    video.sourceAddId(appendID, 'video/webm; codecs="vorbis,vp8"'); 

    // Append the stream headers (i.e. WebM Header, Info, and Tracks elements) 
    video.sourceAppend(appendID, headers); 

    // Append some initial media data. 
    video.sourceAppend(appendID, GetNextCluster()); 
    } 

    function onSeeking(e) { 
    var video = e.target; 

    // Abort current segment append. 
    video.sourceAbort(appendID); 

    // Notify the cluster loading code to start fetching data at the 
    // new playback position. 
    SeekToClusterAt(video.currentTime); 

    // Append clusters from the new playback position. 
    video.sourceAppend(appendID, GetNextCluster()); 
    video.sourceAppend(appendID, GetNextCluster()); 
    } 

    function onProgress(e) { 
    var video = e.target; 

    if (video.sourceState == video.SOURCE_ENDED) 
     return; 

    // If we have run out of stream data, then signal end of stream. 
    if (!HaveMoreClusters()) { 
     video.sourceEndOfStream(HTMLMediaElement.EOS_NO_ERROR); 
     return; 
    } 

    video.sourceAppend(appendID, GetNextCluster()); 
    } 

    var video = document.getElementById('v'); 
    video.addEventListener('sourceopen', onOpen); 
    video.addEventListener('seeking', onSeeking); 
    video.addEventListener('progress', onProgress); 
</script> 


<video id="v" autoplay> </video> 

<script> 
    var video = document.getElementById('v'); 
    video.src = video.mediaSourceURL; 
</script> 
+1

Quindi, come si può implementare la funzione "GetStreamHeaders"? Nota che la mia domanda riguarda la generazione dell'intestazione da javascript! – nvcnvn

+0

@nvcvn, non è possibile eseguire tale personalizzazione per GetStreamHeaders utilizzando JavaScript sul lato client, quindi è necessario fare affidamento sulle cose lato server. Puoi fare riferimento ai collegamenti wiki per lo stesso usando PHP su https://gerrit.wikimedia.org/r/#/c/34560/1/includes/filerepo/file/File.php – Mazzu