2015-01-15 3 views
7

Я создаю небольшое приложение, использующее API MediaRecoder для разделения перекодированного видео с веб-камеры и загрузки всей части на сервер.
Я вижу, что с Media Source API мне нужно сыграть первую часть, а затем сыграть любую другую часть.Как сгенерировать Сеанс инициализации веб-видео для использования с Media Source API

Согласно http://www.w3.org/TR/media-source/#examples Мне нужен «Инициализирующий сегмент» в начале файла.

Как я могу сгенерировать «Сегмент инициализации» WebM в JS, чтобы я мог играть любую часть, которую я выбираю. Есть ли для этого lib? (У меня нет знаний о WebM байт формата поток)

+0

привета @nvcnvn! любой прогресс с темой? Я генерирую поток vp8 в порт udp и мой маленький сервер в udp-> websockets. Я также не знаю, какой сегмент инициализации я должен поставить и как его генерировать. – zarkone

+1

@zarkone, я обнаружил, что это «тупик» для моего проекта, MediaRecoder не разбивает видео в тоннных частях, может играть, просто пробить разделение видео на части байтов. Невозможно воспроизвести эти части с помощью Media Source – nvcnvn

ответ

2

Вы должны использовать расширение источников средств массовой

Пожалуйста, обратитесь к ниже, например

<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

Итак, как вы можете реализовать функцию GetStreamHeaders? Обратите внимание, что мой вопрос заключается в генерации заголовка javascript! – nvcnvn

+0

@nvcvn, эта настройка для GetStreamHeaders невозможна с использованием Javascript на стороне клиента, поэтому вам нужно полагаться на серверные вещи. Вы можете ссылаться на ссылки wiki для тех же, что и PHP, на https://gerrit.wikimedia.org/r/#/c/34560/1/includes/filerepo/file/File.php – Mazzu