2013-08-12 3 views
7

단편화 된 mp4에 대한 나의 이해는 단 하나의 파일이지만 내부적으로 단편화 된 것입니다. 누군가가 이러한 조각을 DASH 용 .mpd 파일에서 어떻게 처리 할 수 ​​있는지 설명 할 수 있습니까? 필자가 보았던 .mpd 파일은 여러 개의 세그먼트로 분리 된 URL을 처리하는 것으로 보이지만 조각난 mp4는 동일한 URL로 바이트 오프셋으로 처리해야합니다. 그러면 브라우저는 바이트 범위에 해당하는 시간을 어떻게 알 수 있습니까?MPEG-DASH 및 단편화 된 mp4

+0

아무도 "브라우저가 어떤 시간대가 어떤 바이트 범위에 해당하는지 어떻게 알 수 있습니까?" : ( –

답변

5

MPEG DASH 기본 프로필에 대해 example mpd입니다. 이 mpd에서 설명하는 mp4 파일은 조각난 mp4입니다. 보시다시피 : <SegmentURL> 요소에서

<SegmentURL media="bunny_15s_200kbit/bunny_200kbit_dashNonSeg.mp4" mediaRange="868-347185"/> 
<SegmentURL media="bunny_15s_200kbit/bunny_200kbit_dashNonSeg.mp4" mediaRange="347186-664464"/> 

은 조각 같은 URL로 해결 될 수 있으며, @mediaRange 속성에 바이트 오프셋을 찾을 수 있습니다.

0

서버에는 moof 상자에 대한 파일을 검색하여 만들 수있는 매니페스트가 있습니다. moof + mdat = 하나의 조각. 조각에 대한 요청이 이루어지면 매니페스트에서 파일 오프셋이 조회되고 올바른 상자가 반환됩니다.

+0

당신이 말하는 manifest (.mpd 파일)가 클라이언트에게 전송됩니까? 내가 DASH에 관해 읽은 곳 어디에서나 그들이 말하는 유일한 명언은 클라이언트에게 전송되는 것입니다. 그래서 나는 – bhh1988

+0

내 경험은 실버 라이트이며 매니 페스트 포맷은 다르지만 비디오 파일 포맷은 다르다 실버 라이트에서는 서버 매니페스트 (ism)를 제공한다. 그러나 매니 페스트는 미디어 파일을 스캔하여 생성되었습니다. 매니페스트가 서버에 의해 생성되어 대시를 위해 메모리에 저장되어 있다고 가정합니다. 그러나 당신은 100 % 확실하지 않습니다. – szatmary

0

필자가 이해하는 한 ... DASH 'onDemand'프로필의 경우 DASH 패키지 관리자가 * .mpd (매니페스트)를 만들고 세그먼트에 매핑 할 바이트 범위를 지정해야합니다 (많은 조각 일 수있다). 그런 다음 클라이언트는 * .mpd를로드하고 매니페스트의 범위에 대해 http 바이트 범위 요청을 수행합니다. DASH의 '라이브'프로필은 각 세그먼트에 URL이 있다는 점에서 원활한 스트리밍과 더 유사하다고 생각합니다.

mp4 컨테이너 내의 조각 위치를 알아야 할 경우이 정보가 'sidx'세그먼트에 있다고 생각합니다.

3

.mpd 파일에는 위와 같이 바이트 범위가있는 세그먼트 목록이 있습니다. 세그먼트에 액세스하려면 각 라인의 mediarange 속성을 구문 분석하고 바이트 범위를 지정하는 setRequestHeader와 함께 XHR과 같은 것으로 요청해야합니다. 이 방법을 사용하면 서버 구성 요소가 필요하지 않습니다. 여기에 내가 사용하고있어 일부 코드는 다음과 같습니다

var xhr = new XMLHttpRequest(); 

    // Range is in format of 1234-34567 
    // url is the .mp4 file path 
    if (range || url) { // make sure we've got content in our params 
    xhr.open('GET', url); 
    xhr.setRequestHeader("Range", "bytes=" + range); 
    xhr.send(); 
    xhr.responseType = 'arraybuffer'; 
    try { 
     // watch the ready state 
     xhr.addEventListener("readystatechange", function() { 
     if (xhr.readyState == 4) { //wait for video to load 
      // add response to buffer 
      try { 
      // videoSource is a sourceBuffer on your mediaSource object.    
      videoSource.appendBuffer(new Uint8Array(xhr.response)); 
      videoSource.onreadystatechange = function() { 
       if (videoSource.readyState == videoSource.done) { 
       videoElement.play(); 
       } 
      }; 
      } catch (e) { 
      // fail quietly 
      } 
     } 
     }, false);