2012-02-21 20 views
8

Tôi gặp sự cố khi nhận ví dụ hoạt động đọc siêu dữ liệu từ tệp WebVTT, được chỉ định bởi yếu tố <track> của <video> trong trang HTML5. Để rõ ràng, tôi không nói về việc đọc siêu dữ liệu ra khỏi chính tệp video (ví dụ như bạn sẽ làm với một luồng truyền tải MPEG). Những gì tôi đang nói đến là phần tử <track> được sử dụng cho phụ đề video. Một trong những thuộc tính của một <track>kind, mà có thể được quy định như bất kỳ những giá trị sau:Đọc siêu dữ liệu từ <track> của HTML5 <video> bằng cách sử dụng Phụ đề

  • Subtitles
  • Mô tả
  • Captions
  • Navigation
  • Chương
  • Metadata

Tôi đang thử g để sử dụng loại dữ liệu siêu dữ liệu để truy cập văn bản được lưu trữ trong tệp WebVTT tương ứng, mà tôi định sử dụng JavaScript. Tôi biết điều này là có thể, vì nó là mentioned by Silvia Pfeiffer cũng như by the maker of Captionator, là hình ảnh đa chiều JavaScript mà tôi đang sử dụng để thực hiện chức năng diễn giải các thẻ <track>. Tuy nhiên, tôi không thể làm cho nó hoạt động được.

Mã của tôi dựa trên ví dụ về phụ đề của tài liệu Captionator. Tôi đã thêm một nút để truy xuất siêu dữ liệu và hiển thị nó khi tôi nhấp vào nút. Thật không may, nó vẫn hiển thị "không xác định" thay vì siêu dữ liệu. Bất kỳ ý tưởng những gì tôi có thể làm không chính xác? Ngoài ra, có ai biết một ví dụ làm việc ở đâu mà tôi có thể xem không? Tôi không thể tìm thấy một nơi nào.

Nếu bạn quan tâm để xem xét mã của tôi, tôi đã bao gồm nó dưới đây:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>HTML5 Video Closed Captioning Example</title> 
     <meta charset="utf-8"> 
     <link rel="stylesheet" type="text/css" media="screen" href="js/Captionator-v0.5-12/css/captions.css"/> 
    </head> 
    <body> 
     <h1>HTML5 Video Closed Captioning Example</h1> 
     <div> 
      <p id="metadataText">Metadata text should appear here</p> 
      <input type='button' onclick='changeText()' value='Click here to display the metadata text'/> 
     </div> 

     <video controls autobuffer id="videoTest" width="1010" height="464"> 
      <source src="http://localhost:8080/Videos/testVideo.webm" type="video/webm" /> 
      <source src="http://localhost:8080/Videos/testVideo.mp4" type="video/mp4" /> 

      <!-- WebVTT Track Metadata Example --> 
      <track label="Metadata Track" kind="metadata" src="http://localhost:8080/Videos/Timed_Text_Tracks/testVideo_metadata.vtt" type="text/webvtt" srclang="en" /> 
     </video> 

     <!-- Include Captionator --> 
     <script type="text/javascript" src="js/Captionator-v0.5-12/js/captionator.js"></script> 

     <!-- Example Usage --> 
     <script type="text/javascript" src="js/Captionator-v0.5-12/js/captionator-example-api.js"></script> 
     <script type="text/javascript"> 
      window.addEventListener("load",function() { 
       captionator.captionify(null,null,{ 
        debugMode: !!window.location.search.match(/debug/i), 
        sizeCuesByTextBoundingBox: !!window.location.search.match(/boundingBox/i), 
        enableHighResolution: !!window.location.search.match(/highres/i), 
       }); 

       var videoObject = document.getElementsByTagName("video")[0]; 
       videoObject.volume = 0; 
       document.body.appendChild(generateMediaControls(videoObject)); 
      },false); 

      function changeText() { 
       document.getElementById('metadataText').innerHTML = testVar; 
       var cueText = document.getElementById("video").tracks[0].activeCues[0].getCueAsSource(); 
       document.getElementById('metadataText').innerHTML = cueText; 
      } 
     </script> 
    </body> 
</html> 

tập tin WebVTT của tôi trông như thế này:

WEBVTT 

0 
00:00.000 --> 00:04.000 
Testing 1 2 3 . . . 
+3

Hey - Tôi là nhà phát triển của Captionator và ngay từ cái nhìn đầu tiên, những gì bạn đang làm có vẻ đúng. Tôi đang nhìn vào khả năng rằng bạn có thể đã tìm thấy một lỗi - và tôi sẽ đăng một câu trả lời với những gì tôi tìm thấy. :) – Christopher

Trả lời

11

Cách bạn truy cập tín hiệu là chính xác - không có vấn đề ở đó (mặc dù sẽ có thay đổi trong Chú thích 0,6 từ thuộc tính .tracks thành thuộc tính .textTracks để phù hợp với đặc điểm kỹ thuật hơn. thỉnh thoảng tôi khuyên bạn nên sử dụng 0.6 để tuân thủ các tiêu chuẩn lớn hơn - Tôi đã viết mã bên dưới để sử dụng .textTracks - thay thế cho .tracks nếu bạn muốn tiếp tục sử dụng nhánh ổn định.)

Vấn đề liên quan đến việc tải các bản nhạc. Hiện tại, bạn không thực sự yêu cầu Phụ đề tải bản nhạc. Bởi vì điều này xảy ra không đồng bộ, và theo yêu cầu, có sự chậm trễ không thể tránh khỏi khi nội dung của chúng không có sẵn, bạn cần phải viết mã theo cách có thời gian tải và lỗi tải tiềm năng.

Bạn cũng không phải chờ chính Phụ đề tải - có khả năng người dùng có thể vô tình nhấp vào nút trước khi điều này xảy ra - kích hoạt lỗi JavaScript khó chịu. Đây sẽ không phải là một vấn đề như vậy khi thử nghiệm trên hộp địa phương của bạn, nhưng ngay sau khi bạn triển khai lên internet, bạn sẽ thấy tất cả các loại điều kiện chủng tộc và nasties khác. Xem xét tắt nút cho đến khi cả trang và dữ liệu phụ đề đã tải.


Tôi đã cố gắng để làm cho các API Captionator càng gần càng tốt để các API JS thực tế đó sẽ được hạ cánh trong các trình duyệt rất sớm - vì vậy trong tương lai đây sẽ là giống như cách bạn sẽ tương tác với mẹ đẻ chức năng trình duyệt. Ngay khi chức năng có sẵn một cách tự nhiên, Captionator sẽ nhả ra ngoài và mã của bạn nên (giả sử họ không thay đổi API một lần nữa!) Chỉ hoạt động với API gốc.

Trước hết, bạn cần thực sự yêu cầu Captionator tải nội dung. Điều này được thực hiện, cài đặt 'chế độ hiển thị' của bản nhạc thành SHOWING hoặc 2.

var video = document.getElementByID("myVideo"); 
video.textTracks[0].mode = 2; // SHOWING 

Cách khác, bạn có thể gán trạng thái của một ca khúc để HIDDEN (1) - mà vẫn gây ra một tải, và cueChange sự kiện sẽ vẫn cháy - nhưng sẽ không sơn tín hiệu vào màn hình. Trong Captionator, tôi không vẽ các bản ghi siêu dữ liệu vào màn hình, nhưng API WebKit (buggy) sẽ phát triển.

video.textTracks[0].mode = 1; // HIDDEN 

Sau đó, bạn cần phải lắng nghe khi các tín hiệu được nạp và sẵn:

video.textTracks[0].onload = function() { /* Your Code Here... */ } 

Hoặc khi họ gặp khó khăn:

video.textTracks[0].onerror = function() { /* Whoah, something went wrong... */ } 

Một khi nội dung được tải, bạn có thể truy cập mảng TextTrack.cues (tốt, về mặt kỹ thuật là TextTrackCueList.) Trước khi tải xảy ra, thuộc tính TextTrack.cues sẽ là null.

var myCueText = video.textTracks[0].cues[0].text; 

Hãy nhận biết rằng Captionator phân tích các văn bản cue của mỗi cue, trừ khi các loại ca khúc là metadata - vì vậy đảm bảo bạn gán track loại đúng. Bạn có thể kết thúc với dữ liệu hoặc thẻ Captionator nghĩ là 'không hợp lệ' bị loại bỏ. Bạn có thể tắt tùy chọn này cho các tín hiệu thông thường bằng cách đặt tùy chọn processCueHTML thành false.


Với ý nghĩ đó, dưới đây là cách tôi muốn viết lại mã của bạn:

<div> 
    <p id="metadataText">Metadata text should appear here</p> 
    <input type='button' onclick='changeText()' value='Click here to display the metadata text' id="changetext" disabled /> 
</div> 

<video controls autobuffer id="videoTest" width="512" height="288"> 
    <!-- Your video sources etc... --> 

    <!-- The metadata track --> 
    <track label="Metadata Track" kind="metadata" src="metadata.vtt" type="text/webvtt" srclang="en" /> 
</video> 

<!-- Include Captionator --> 
<script type="text/javascript" src="captionator.js"></script> 
<script type="text/javascript"> 
    document.addEventListener("readystatechange",function(event) { 
     if (document.readyState === "complete") { 
      captionator.captionify(); 

      document.querySelectorAll("#changetext")[0].removeAttribute("disabled"); 
     } 
    },false); 

    function changeText() { 
     // Get the metadataText paragraph 
     var textOutput = document.querySelectorAll("#metadataText")[0]; 

     // Get the metadata text track 
     var metadataTrack = document.querySelectorAll("video")[0].textTracks[0]; 

     if (metadataTrack.readyState === captionator.TextTrack.LOADED) { 
      // The cue is already ready to be displayed! 
      textOutput.innerHTML = metadataTrack.cues[0].text; 

     } else { 
      // We check to see whether we haven't already assigned the mode. 
      if (metadataTrack.mode !== captionator.TextTrack.SHOWING) { 
       textOutput.innerHTML = "Caption loading..."; 

       // The file isn't loaded yet. Load it in! 
       metadataTrack.mode = captionator.TextTrack.SHOWING; // You can use captionator.TextTrack.HIDDEN too. 

       metadataTrack.onload = function() { 
        textOutput.innerHTML = metadataTrack.cues[0].text; 
       } 

       metadataTrack.onerror = function() { 
        textOutput.innerHTML = "Error loading caption!"; 
       } 
      } 
     } 
    } 

</script> 

Ở đây, chúng tôi sẽ vô hiệu hóa các nút, ngăn không cho người dùng trên các kết nối chậm (hoặc chỉ cần ai đó với phản xạ rất nhanh !) từ đánh nó trước khi Captionator hoặc theo dõi siêu dữ liệu đã sẵn sàng, và lắng nghe một sự kiện tải - tại thời điểm đó chúng tôi kích hoạt lại nút và có thể truy xuất văn bản lệnh như bình thường.

+0

Cảm ơn bạn rất nhiều vì phản hồi chi tiết, Christopher. Đó là một trợ giúp lớn! – Steph

1

Bạn có thể cần phải nạp siêu dữ liệu của bạn VTT tập tin thông qua Ajax và phân tích cú pháp và hiển thị nó cho mình.

Tôi đã xem số example từ số HTML5 Doctors' article on video subtitling. Họ đang sử dụng Playr, vì vậy tôi đã kiểm tra mã nguồn của nó và họ chắc chắn yêu cầu tệp VTT không đồng bộ và phân tích cú pháp nội dung khi tệp được tải.

tôi đã có thể tải các nội dung của file VTT và đổ nó vào các yếu tố quy định với đoạn mã sau:

function changeText() { 
    var track = document.getElementById("videoTest").querySelector("track"); 
    var req_track = new XMLHttpRequest(); 
    req_track.open('GET', track.getAttribute("src")); 
    req_track.onreadystatechange = function(){ 
     if(req_track.readyState == 4 && (req_track.status == 200 || req_track.status == 0)){ 
      if(req_track.responseText != ''){ 
       document.getElementById("metadataText").innerHTML = req_track.responseText; 
      } 
     } 
    } 
    req_track.send(null); 
} 

Tôi không quen thuộc với Captionator, nhưng có vẻ như nó có một số khả năng để phân tích các tệp VTT thành một số loại cấu trúc dữ liệu, ngay cả khi nó không nhất thiết hỗ trợ loại theo dõi metadata. Có lẽ bạn có thể sử dụng kết hợp mã này và trình phân tích cú pháp VTT hiện có của Captionator?

+0

Cảm ơn sự giúp đỡ, mã của bạn đã làm việc cho tôi. Tôi cảm thấy như nó đánh bại mục đích của việc sử dụng WebVTT và một polyfill, nhưng tôi cho rằng thực sự không phải là một giải pháp tốt vào thời điểm này vì chưa có ai thực sự hỗ trợ cho 'metadata'' '. – Steph

+0

Có vẻ như vậy. Nếu bạn nghĩ ra điều gì đó tốt, bạn luôn có thể đóng góp cho Captionator. – Brandan

+0

@Steph Tôi có thể đảm bảo với bạn rằng Captionator thực sự hỗ trợ loại theo dõi 'siêu dữ liệu '. :) – Christopher

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