2013-08-12 53 views
7

Sự hiểu biết của tôi về mp4 phân mảnh là nó là một tệp duy nhất, nhưng nội bộ nó được cấu trúc dưới dạng phân đoạn. Ai đó có thể giải thích cho tôi về cách những đoạn này có thể được giải quyết trong tệp .mpd cho DASH không? Các tập tin .mpd mà tôi đã nhìn thấy dường như để giải quyết các phân đoạn khác nhau với các url riêng biệt, nhưng một mp4 phân mảnh, tôi tưởng tượng, sẽ phải được giải quyết bằng cách bù đắp byte vào cùng một url. Làm thế nào để trình duyệt sau đó biết những gì thời gian tương ứng với những gì byte phạm vi?MPEG-DASH và mp4 phân mảnh

+0

Tôi thấy không ai trả lời phần 2 câu hỏi của bạn "Làm cách nào để trình duyệt biết thời gian nào tương ứng với byte nào?" : ( –

Trả lời

5

Đây là một example mpd cho cấu hình chính MPEG DASH. Các tập tin mp4 được mô tả bởi mpd này là một mp4 phân mảnh. Như bạn thấy:

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

Tại <SegmentURL> phần tử, các mảnh vỡ có thể được giải quyết vào url giống nhau, và bạn có thể tìm offsets byte tại @mediaRange thuộc tính.

0

Máy chủ có tệp kê khai có thể được tạo bằng cách quét tệp cho các hộp moof. Một moof + mdat = một đoạn. Khi một yêu cầu cho một mảnh được thực hiện, các tập tin bù đắp được nhìn lên trong biểu hiện và các hộp chính xác được trả về.

+0

Có phải tệp kê khai mà bạn đang nói đến chỉ là tệp kê khai (tệp .mpd) được gửi cho khách hàng không? Ở khắp mọi nơi mà tôi đọc về DASH, biểu hiện duy nhất mà họ nói đến là tệp được gửi cho khách hàng, vì vậy tôi không biết – bhh1988

+0

Kinh nghiệm của tôi là ở dạng Silverlight, nó là một định dạng tệp kê khai khác nhau, nhưng có cùng định dạng tệp video. Trong Silverlight, bạn cung cấp tệp kê khai máy chủ (ism) Tuy nhiên tệp kê khai được tạo bằng cách quét tệp phương tiện.Tôi giả định rằng tệp kê khai được tạo bởi máy chủ được lưu trong bộ nhớ cho dấu gạch ngang. Nhưng bạn nghi thức tôi không chắc chắn 100%. – szatmary

0

Theo như tôi hiểu nó ... Trong trường hợp hồ sơ DASH 'onDemand', đó là công việc của trình bao gói DASH để tạo tệp * .mpd (tệp kê khai) và chỉ định dải byte nào ánh xạ tới một phân đoạn (có thể là một số đoạn). Sau đó, máy khách sẽ tải tệp * .mpd và thực hiện các yêu cầu phạm vi byte http cho các phạm vi trong tệp kê khai. Tôi nghĩ rằng hồ sơ 'sống' của DASH tương tự như việc phát trực tuyến mượt mà trong mỗi phân khúc có một url.

Nếu bạn cần tìm vị trí của các đoạn trong hộp chứa mp4, tôi tin rằng thông tin này nằm trong hộp 'sidx' của đoạn.

3

Tệp .mpd có danh sách các phân đoạn có phạm vi byte như được hiển thị ở trên. Để truy cập các phân đoạn, bạn cần phải phân tích cú pháp thuộc tính mediarange cho mỗi dòng và yêu cầu nó với thứ gì đó như XHR với setRequestHeader để chỉ định phạm vi byte. Với phương pháp này, không có thành phần máy chủ cần thiết. Dưới đây là một số mã tôi đã sử dụng:

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); 
Các vấn đề liên quan