2015-01-15 18 views
7

Tôi đang xây dựng một ứng dụng nhỏ sử dụng API MediaRecoder để tách video mã hóa khỏi webcam và tải tất cả phần lên máy chủ.
Tôi thấy rằng với API nguồn truyền thông, tôi cần phát phần đầu tiên và sau đó phát bất kỳ phần nào khác.Cách tạo Phân đoạn khởi tạo của video trên web để sử dụng với API nguồn truyền thông

Theo http://www.w3.org/TR/media-source/#examples Tôi cần "Phân đoạn khởi tạo" ở đầu tệp.

Làm cách nào để tạo "Phân đoạn khởi tạo" của WebM trong JS để tôi có thể phát bất kỳ phần nào mình chọn. Có lib cho điều đó không? (Tôi không có kiến ​​thức về định dạng dòng byte WebM)

+0

chào @nvcnvn! bất kỳ tiến bộ nào với chủ đề? Tôi tạo luồng vp8 tới cổng udp và máy chủ nhỏ của tôi tới udp-> websockets. Tôi cũng không biết loại phân khúc khởi tạo nào tôi nên phân phối và cách tạo nó .. – zarkone

+1

@zarkone, tôi thấy đây là "kết thúc chết" cho dự án của tôi, MediaRecoder không chia nhỏ video trong các phần tấn mà nó có thể chơi, nó chỉ đơn giản là chia video thành một phần của byte. Không có cách nào để phát lại các phần này bằng Media Source – nvcnvn

Trả lời

2

Bạn cần phải sử dụng phần mở rộng nguồn phương tiện truyền thông

Vui lòng tham khảo bên dưới ví dụ

<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

Vậy làm thế nào bạn có thể thực hiện chức năng "GetStreamHeaders"? Lưu ý rằng câu hỏi của tôi là về việc tạo tiêu đề bằng javascript! – nvcnvn

+0

@nvcvn, bạn không thể thực hiện tùy chỉnh đó cho GetStreamHeaders bằng Javascript phía máy khách, vì vậy bạn cần phải dựa vào những thứ bên phía máy chủ. Bạn có thể tham khảo các liên kết wiki cho cùng sử dụng PHP tại https://gerrit.wikimedia.org/r/#/c/34560/1/includes/filerepo/file/File.php – Mazzu

Các vấn đề liên quan