综合案例

课后整理 2021-1-7

整合HTML5多媒体API中各种属性、方法和事件,本例演示如何在一个视频中实现对这些信息进行访问和操控,示例效果如图20所示。

预览效果

图20 HTML5多媒体API接口访问

【操作步骤】

第1步,设计文档结构。整个结构包含3部分:<video id='video'>视频播放界面、<div id='buttons'>视频控制方法集、<div id="info">接口访问信息汇总。

<h1>HTML5 Web Video API</h1>
<div>
    <video id='video' controls preload='none'  poster="video/trailer.png">
        <source id='mp4' src="video/trailer.mp4"  type='video/mp4'>
        <source id='webm'  src="video/trailer.webm" type='video/webm'>
        <source id='ogv'  src="video/trailer.ogv" type='video/ogg'>
        <p>你的浏览器不支持HTML5 video元素。</p>
    </video>
    <div id='buttons'>
        <button  onclick="getVideo().load()">load()</button>
        <button  onclick="getVideo().play()">play()</button>
        <button  onclick="getVideo().pause()">pause()</button>
        <button  onclick="getVideo().currentTime+=10">currentTime+=10</button>
        <button  onclick="getVideo().currentTime-=10">currentTime-=10</button>
        <button  onclick="getVideo().currentTime=50">currentTime=50</button>
        <button  onclick="getVideo().playbackRate++">playbackRate++</button>
        <button onclick="getVideo().playbackRate--">playbackRate--</button>
        <button  onclick="getVideo().playbackRate+=0.1">playbackRate+=0.1</button>
        <button  onclick="getVideo().playbackRate-=0.1">playbackRate-=0.1</button>
        <button  onclick="getVideo().volume+=0.1">volume+=0.1</button>
        <button  onclick="getVideo().volume-=0.1">volume-=0.1</button>
        <button  onclick="getVideo().muted=true">muted=true</button>
        <button  onclick="getVideo().muted=false">muted=false</button>
        <button onclick="switchVideo(0);">Sintel  teaser</button>
        <button  onclick="switchVideo(1);">Bunny trailer</button>
        <button  onclick="switchVideo(2);">Bunny movie</button>
        <button  onclick="switchVideo(3);">Test movie</button>
    </div>
    <div id="info">
        <table>
             <caption>媒体事件</caption>
             <tbody id='events'> </tbody>
        </table>
        <table>
             <caption>媒体属性</caption>
             <tbody  id='properties'></tbody>
        </table>
        <table  id='canPlayType'>
             <caption>播放类型</caption>
             <tbody id='m_video'></tbody>
        </table>
        <table id='tracks'>
             <caption>轨道</caption>
             <tbody>
                 <tr><th>Audio</th><th>Video</th><th>Text</th></tr>
                 <tr><td id='m_audiotracks' class='false'>?</td><td  id='m_videotracks' class='false'>?</td> <td id='m_texttracks'  class='false'>?</td></tr>
             </tbody>
        </table>
    </div>
</div>

第2步,初始化多媒体事件和属性数据。

//初始化事件类型
var media_events = new Array();
media_events["loadstart"] = 0;
media_events["progress"] = 0;
media_events["suspend"] = 0;
media_events["abort"] = 0;
media_events["error"] = 0;
media_events["emptied"] = 0;
media_events["stalled"] = 0;
media_events["loadedmetadata"] = 0;
media_events["loadeddata"] = 0;
media_events["canplay"] = 0;
media_events["canplaythrough"] = 0;
media_events["playing"] = 0;
media_events["waiting"] = 0;
media_events["seeking"] = 0;
media_events["seeked"] = 0;
media_events["ended"] = 0;
media_events["durationchange"] = 0;
media_events["timeupdate"] = 0;
media_events["play"] = 0;
media_events["pause"] = 0;
media_events["ratechange"] = 0;
media_events["resize"] = 0;
media_events["volumechange"] = 0;
//在数组中汇集多媒体属性
var media_properties = [ "error", "src",  "srcObject", "currentSrc", "crossOrigin",  "networkState", "preload", "buffered",  "readyState", "seeking", "currentTime",  "duration","paused", "defaultPlaybackRate",  "playbackRate", "played", "seekable",  "ended", "autoplay", "loop",  "controls", "volume","muted",  "defaultMuted", "audioTracks", "videoTracks",  "textTracks", "width", "height",  "videoWidth", "videoHeight", "poster" ];

第3步,初始化事件函数,在该函数中根据初始化的多媒体事件数组media_events,逐一读取每一个元素所存储的事件类型,然后为播放的视频对象绑定事件。同时使用for语句把每个事件的当前状态值汇集并显示在页面表格中,如上图所示。

function init_events(id, arrayEventDef) {
    var f;
    for (key in arrayEventDef) {
         document._video.addEventListener(key, capture, false);
    }
    var tbody = document.getElementById(id);
    var i = 1;
    var tr = null;
    for (key in arrayEventDef) {
        if (tr == null)  tr    = document.createElement("tr");
        var th =  document.createElement("th");
        th.textContent = key;
        var td =  document.createElement("td");
         td.setAttribute("id", "e_" + key);
        td.textContent =  "0";
        td.className =  "false";
        tr.appendChild(th);
        tr.appendChild(td);
 
        if ((i++ % 5) == 0) {
             tbody.appendChild(tr);
             tr = null;
        }
    }
    if (tr != null) tbody.appendChild(tr);
}

第3步,初始化属性函数,在该函数中根据初始化的多媒体属性数组media_properties,逐一读取每一个元素所存储的属性,然后使用do语句把每一个属性值显示在页面表格中,如上图所示。

function init_properties(id, arrayPropDef, arrayProp) {
    var tbody = document.getElementById(id);
    var i = 0;
    var tr = null;
    do {
        if (tr == null)  tr    = document.createElement("tr");
        var th =  document.createElement("th");
        th.textContent =  arrayPropDef[i];
        var td =  document.createElement("td");
        var r;
         td.setAttribute("id", "p_" + arrayPropDef[i]);
        r =  eval("document._video." + arrayPropDef[i]);
        td.textContent = r;
        if (typeof(r) !=  "undefined") {
             td.className = "true";
        } else {
             td.className = "false";
        }
        tr.appendChild(th);
        tr.appendChild(td);
        arrayProp[i] = td;
        if ((++i % 3) == 0) {
             tbody.appendChild(tr);
             tr = null;
        }
    } while (i < arrayPropDef.length);
    if (tr != null) tbody.appendChild(tr);
}

第4步,定义页面初始化函数,在该函数init()中,获取页面中的视频播放控件,然后调用init_events()和init_properties()函数,同时使用定时器,定义每隔250毫秒,将调用一次update_properties(),该函数将不断刷新多媒体属性值,并动态显示出来。

function init() {
    document._video =  document.getElementById("video");
    webm = document.getElementById("webm");
    media_properties_elts = new  Array(media_properties.length);
    init_events("events", media_events);
    init_properties("properties",  media_properties, media_properties_elts);
    init_mediatypes();
    setInterval(update_properties, 250);
}