python 写简单的服务器server.py:
1 import SimpleHTTPServer 2 import SocketServer 3 import cgi 4 5 host = '' 6 port = 8080 7 8 9 class simpleHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 10 def do_POST(self): 11 try: 12 13 form = cgi.FieldStorage( 14 fp = self.rfile, 15 headers = self.headers, 16 environ = { 17 'REQUEST_METHOD':'POST', 18 'CONTENT_TYPE':self.headers.getheader('current-type') 19 } 20 ) 21 22 23 print form 24 25 26 except IOError: 27 self.send_error(404, ' POST error'); 28 29 30 conn = SocketServer.TCPServer((host, port), simpleHandler) 31 32 33 print 'start server at port:', port 34 35 conn.serve_forever()
index.html:
1 <html> 2 <head> 3 <title>HTML5 video</title> 4 <link type='text/css' rel='stylesheet' href='style.css'> 5 <script src='script.js' type='application/javascript'></script> 6 </head> 7 8 <body> 9 <div id='userInfoDiv'> 10 <form id='userInfoForm'> 11 userName:<input type='text' value='default' id='userName'> 12 password:<input type='text' value='pwd' id='pwd'> 13 </form> 14 </div> 15 16 17 <div id='container'> 18 <div id='videoDiv'> 19 <video id='video_1' poster="newtest.jpg" preload="none" loop='loop' controls='controls'> 20 <source src='newtest.webm' type='video/webm' id='webm'></source> 21 <source src='newtest.ogv' type='video/ogv' id='ogv'></source> 22 <source src='newtest.mo4' type='video/mp4' id='mp4'></source> 23 <p>Your browser does not support HTML5 video</p> 24 </video> 25 </div> 26 27 <div id='buttonsDiv'> 28 <button type='button' onclick="media.load()">Load</button> 29 <button type='button' onclick="media.play()">Play</button> 30 <button type='button' onclick="media.pause()">Pause</button><br> 31 <button type='button' onclick="media.currentTime+=5">currentTime+=5</button> 32 <button type='button' onclick="media.currentTime-=5">currentTime-=5</button> 33 <button type='button' onclick="media.playbackRate++">playbackRate++</button> 34 <button type='button' onclick="media.playbackRate--">playbackRate--</button><br> 35 <button type='button' onclick="media.volume+=0.1">volume+=0.1</button> 36 <button type='button' onclick="media.volume-=0.1">volume-=0.1</button> 37 <button type='button' onclick="media.muted=true">muted=true</button> 38 <button type='button' onclick="media.muted=false">muted=false</button> 39 <button type='button' onclick='switchVideo()'>switchVideo</button><br> 40 <button type='button' onclick='sum_up()'>Summing up</button> 41 </div> 42 </div> 43 44 <div id='userDiv'> 45 </div> 46 <div id='msgPlayDiv'> 47 </div> 48 <div id='msgPauseDiv'> 49 </div> 50 51 <table id='mediaEvent' border='1' cellpadding="10" cellspacing="10"> 52 <caption> Media Event</caption> 53 <tbody id='events'> 54 <tr> 55 <th>loadstart</th> 56 <td id='e_loadstart' class='true'>1</td> 57 <th>progress</th> 58 <td id='e_progress' >0</td> 59 <th>suspend</th> 60 <td id='e_suspend' >0</td> 61 <th>abort</th> 62 <td id='e_abort' >0</td> 63 <th>error</th> 64 <td id='e_error' >0</td> 65 </tr> 66 <tr> 67 <th>emptied</th> 68 <td id='e_emptied' >0</td> 69 <th>stalled</th> 70 <td id='e_stalled' >0</td> 71 <th>loadedmetadata</th> 72 <td id='e_loadedmetadata' >0</td> 73 <th>loadeddata</th> 74 <td id='e_loadeddata' >0</td> 75 <th>canplay</th> 76 <td id='e_canplay' >0</td> 77 </tr> 78 <tr> 79 <th>canplaythrough</th> 80 <td id='e_canplaythrough' >0</td> 81 <th>playing</th> 82 <td id='e_playing' >0</td> 83 <th>waiting</th> 84 <td id='e_waiting' >0</td> 85 <th>seeking</th> 86 <td id='e_seeking' >0</td> 87 <th>seeked</th> 88 <td id='e_seeked' >0</td> 89 </tr> 90 <tr> 91 <th>ended</th> 92 <td id='e_ended' >0</td> 93 <th>durationchange</th> 94 <td id='e_durationchange' >0</td> 95 <th>timeupdate</th> 96 <td id='e_timeupdate' >0</td> 97 <th>play</th> 98 <td id='e_play' >0</td> 99 <th>pause</th> 100 <td id='e_pause' >0</td> 101 </tr> 102 <tr> 103 <th>ratechange</th> 104 <td id='e_ratechange' >0</td> 105 <th>volumechange</th> 106 <td id='e_volumechange' >0</td> 107 </tr> 108 </tbody> 109 </table> 110 111 <table id='propertyTable' border="1" cellpadding="10" cellspacing="10"> 112 <caption>Media Properties</caption> 113 <tbody id="properties"> 114 <tr> 115 <th>error</th> 116 <td id="p_error" class="true">none</td> 117 <th>src</th> 118 <td id="p_src" class="true">none</td> 119 <th>currentSrc</th> 120 <td id="p_currentSrc" class="true">none</td> 121 </tr> 122 <tr> 123 <th>crossOrigin</th> 124 <td id="p_crossOrigin" class="false">undefined</td> 125 <th>networkState</th> 126 <td id="p_networkState" class="true">0</td> 127 <th>preload</th> 128 <td id="p_preload" class="true">none</td> 129 </tr> 130 <tr> 131 <th>buffered</th> 132 <td id="p_buffered" class="true">[object TimeRanges]</td> 133 <th>readyState</th> 134 <td id="p_readyState" class="true">0</td> 135 <th>seeking</th> 136 <td id="p_seeking" class="true">false</td> 137 </tr> 138 <tr> 139 <th>currentTime</th> 140 <td id="p_currentTime" class="true">0</td> 141 <th>duration</th> 142 <td id="p_duration" class="true">NaN</td> 143 <th>startDate</th> 144 <td id="p_startDate" class="false">undefined</td> 145 </tr> 146 <tr> 147 <th>paused</th> 148 <td id="p_paused" class="true">true</td> 149 <th>defaultPlaybackRate</th> 150 <td id="p_defaultPlaybackRate" class="false">undefined</td> 151 <th>playbackRate</th> 152 <td id="p_playbackRate" class="false">undefined</td> 153 </tr> 154 <tr> 155 <th>played</th> 156 <td id="p_played" class="true">[object TimeRanges]</td> 157 <th>seekable</th> 158 <td id="p_seekable" class="true">[object TimeRanges]</td> 159 <th>ended</th> 160 <td id="p_ended" class="true">false</td> 161 </tr> 162 <tr> 163 <th>autoplay</th> 164 <td id="p_autoplay" class="true">false</td> 165 <th>loop</th> 166 <td id="p_loop" class="true">false</td> 167 <th>mediaGroup</th> 168 <td id="p_mediaGroup" class="false">undefined</td> 169 </tr> 170 <tr> 171 <th>controller</th> 172 <td id="p_controller" class="false">undefined</td> 173 <th>controls</th> 174 <td id="p_controls" class="true">true</td> 175 <th>volume</th> 176 <td id="p_volume" class="true">1</td> 177 </tr> 178 <tr> 179 <th>muted</th> 180 <td id="p_muted" class="true">false</td> 181 <th>defaultMuted</th> 182 <td id="p_defaultMuted" class="true">false</td> 183 <th>audioTracks</th> 184 <td id="p_audioTracks" class="false">undefined</td> 185 </tr> 186 <tr> 187 <th>videoTracks</th> 188 <td id="p_videoTracks" class="false">undefined</td> 189 <th>textTracks</th> 190 <td id="p_textTracks" class="false">undefined</td> 191 <th>width</th> 192 <td id="p_width" class="true">0</td> 193 </tr> 194 <tr> 195 <th>height</th> 196 <td id="p_height" class="true">0</td> 197 <th>videoWidth</th> 198 <td id="p_videoWidth" class="true">0</td> 199 <th>videoHeight</th> 200 <td id="p_videoHeight" class="true">0</td> 201 </tr> 202 <tr> 203 <th>poster</th> 204 <td id="p_poster" class="true">none</td> 205 </tr> 206 </tbody> 207 </table> 208 209 <table id="canPlayType" border="1" cellpadding="10" cellspacing="10"> 210 <caption>canPlayType</caption> 211 <tbody id="m_video"> 212 <tr> 213 <th>video/ogv</th> 214 <th>video/mp4</th> 215 <th>video/webm</th> 216 </tr> 217 <tr> 218 <td id='canplayOgv'></td> 219 <td id='canplayMp4'></td> 220 <td id='canplayWebm'></td> 221 </tr> 222 </tbody> 223 </table> 224 225 <table id="tracks" border="1" cellpadding="10" cellspacing="10"> 226 <caption>Tracks</caption> 227 <tbody> 228 <tr> 229 <th>Audio</th> 230 <th>Video</th> 231 <th>Text</th> 232 </tr> 233 234 <tr> 235 <td class="false" id="m_audiotracks">?</td> 236 <td class="false" id="m_videotracks">?</td> 237 <td class="false" id="m_texttracks">?</td> 238 </tr> 239 </tbody> 240 </table> 241 242 </body> 243 </html>
html中需要用到的js文件,script.js:
1 var xmlHttp = null; 2 3 var view_time_values = 0; 4 var view_time = new Array(); 5 6 var media_events = new Array(); 7 8 media_events["play"] = 0; 9 media_events["pause"] = 0; 10 media_events["loadstart"] = 0; 11 media_events["suspend"] = 0; 12 media_events["abort"] = 0; 13 media_events["error"] = 0; 14 media_events["progress"] = 0; 15 media_events["emptied"] = 0; 16 media_events["stalled"] = 0; 17 media_events["canplay"] = 0; 18 media_events["canplaythrough"] = 0; 19 media_events["playing"] = 0; 20 media_events["waiting"] = 0; 21 media_events["seeking"] = 0; 22 media_events["seeked"] = 0; 23 media_events["ended"] = 0; 24 media_events["timeupdate"] = 0; 25 media_events["loadedmetadata"] = 0; 26 media_events["loadeddata"] = 0; 27 media_events["durationchange"] = 0; 28 media_events["ratechange"] = 0; 29 media_events["volumechange"] = 0; 30 31 var media_events_valueChange = new Array(); 32 33 media_events_valueChange["play"] = 0; 34 media_events_valueChange["pause"] = 0; 35 media_events_valueChange["loadstart"] = 0; 36 media_events_valueChange["error"] = 0; 37 media_events_valueChange["playing"] = 0; 38 //media_events_valueChange["waiting"] = 0; 39 //media_events_valueChange["seeking"] = 0; 40 //media_events_valueChange["seeked"] = 0; 41 media_events_valueChange["ended"] = 0; 42 //media_events_valueChange["durationchange"] = 0; 43 //media_events_valueChange["ratechange"] = 0; 44 media_events_valueChange["volumechange"] = 0; 45 46 47 var media_properties = [ "error", "src", "currentSrc", 48 "crossOrigin", "networkState", "preload", 49 "buffered", "readyState", "seeking", 50 "currentTime", "duration", "startDate", 51 "paused", "defaultPlaybackRate", "playbackRate", 52 "played", "seekable", "ended", 53 "autoplay", "loop", "mediaGroup", 54 "controller", "controls", "volume", 55 "muted", "defaultMuted", "audioTracks", 56 "videoTracks", "textTracks","width", 57 "height", "videoWidth", "videoHeight", 58 "poster" ]; 59 60 document.addEventListener("DOMContentLoaded", initFun, false); 61 62 function initFun() 63 { 64 media = document.getElementById('video_1'); 65 66 for (key in media_events) 67 { 68 media.addEventListener(key, capture, false); 69 } 70 71 init_properties(); 72 init_canplayType(); 73 xmlHttpFunction(); 74 setInterval(update_properties, 500); 75 } 76 77 function xmlHttpFunction() 78 { 79 80 if(window.XMLHttpRequest) 81 { 82 xmlHttp = new XMLHttpRequest(); 83 } 84 else if(window.ActiveXObject) 85 { 86 xmlHttp = new ActiveXObject('Microsoft.XMLHTTP'); 87 } 88 } 89 90 /*send post method to server*/ 91 function post_message(key, str) 92 { 93 media_events_valueChange[key] = 0; 94 xmlHttp.open('POST', '192.168.0.61:8080', true); 95 xmlHttp.onreadystatechange = state_change; 96 xmlHttp.setRequestHeader('content_type', 'application/x-www-form-urlencoded'); 97 xmlHttp.send(key + str); 98 } 99 function state_change() 100 { 101 if(xmlHttp.readyState == 4) 102 { 103 if(xmlHttp.status == 200) 104 { 105 document.getElementById('msgDiv').innerHTML = xmlHttp.responseText; 106 } 107 } 108 } 109 110 function sum_up() 111 { 112 var i = 0; 113 var result = 0; 114 115 var totalPauseTime = 0; 116 117 var username = document.getElementById('userName').value; 118 document.getElementById('userDiv').innerHTML = 'Hello, ' + username + ':'; 119 if (view_time.length == 1) 120 { 121 document.getElementById('msgPlayDiv').innerHTML = 'video playback to: ' + Math.round(media.currentTime); 122 return; 123 } 124 125 if(view_time.length % 2 == 0) 126 { 127 for (i = 1; i < (view_time.length-1); i += 2) 128 { 129 result = view_time[i+1] - view_time[i]; 130 totalPauseTime += result; 131 } 132 var curTime = new Date(); 133 result = (curTime.getHours()*3600 + curTime.getMinutes()*60 + curTime.getSeconds()) - view_time[view_time.length - 1]; 134 totalPauseTime += result; 135 } 136 else 137 { 138 for (i = 1; i < view_time.length; i += 2) 139 { 140 result = view_time[i+1] - view_time[i]; 141 142 totalPauseTime += result; 143 } 144 } 145 play_str = 'video playback to: ' + Math.round(media.currentTime, 2) + ' s'; 146 pause_str = 'you have paused: ' + Math.round(totalPauseTime) + ' s'; 147 148 document.getElementById('msgPlayDiv').innerHTML = play_str; 149 document.getElementById('msgPauseDiv').innerHTML = pause_str; 150 return; 151 } 152 153 /*初始化media的properties*/ 154 function init_properties() 155 { 156 //根据media_properties中的参数为属性赋值 157 for(key in media_properties) 158 { 159 var propertyVar = document.getElementById('p_' + media_properties[key]); 160 var r = eval('media.' + media_properties[key]); 161 propertyVar.innerHTML = r; 162 163 if(typeof(r) != 'undefined') 164 { 165 propertyVar.className = 'true'; 166 } 167 else 168 { 169 propertyVar.className = 'false'; 170 } 171 } 172 } 173 174 175 176 /*捕捉到事件,对事件进行处理*/ 177 function capture(event) 178 { 179 media_events[event.type] += 1; 180 if (event.type in media_events_valueChange) 181 media_events_valueChange[event.type] = 1; 182 183 for (key in media_events) 184 { 185 var eventVar = document.getElementById('e_' + key); 186 if(eventVar) 187 { 188 eventVar.innerHTML = media_events[key]; 189 190 if (key in media_events_valueChange) 191 { 192 if ( media_events_valueChange[key] == 1) 193 { 194 if(key == 'pause' || key == 'play') 195 { 196 var mydate = new Date(); 197 198 view_time[view_time_values] = mydate.getHours()*3600 + mydate.getMinutes()*60 + mydate.getSeconds() + mydate.getMilliseconds() / 1000; 199 view_time_values += 1; 200 } 201 202 post_message(key ,' event happend'); 203 } 204 } 205 206 if(media_events[key] > 0) 207 eventVar.className = 'true'; 208 } 209 } 210 211 update_properties(); 212 } 213 214 /*更新所有的属性值*/ 215 function update_properties() 216 { 217 218 for (key in media_properties) 219 { 220 var propertyVar = document.getElementById('p_' + media_properties[key]); 221 var val = eval('media.' + media_properties[key]); 222 propertyVar.innerHTML = val; 223 } 224 225 if (!!media.audioTracks) 226 { 227 var td = document.getElementById('m_audiotracks'); 228 td.innerHTML = media.audioTracks.length; 229 td.className = 'true'; 230 } 231 if(!!media.videoTracks) 232 { 233 var td = document.getElementById('m_videotracks'); 234 td.innerHTML = media.videoTracks.length; 235 td.className = 'true'; 236 } 237 if(!!media.textTracks) 238 { 239 var td = document.getElementById('m_texttracks'); 240 td.innerHTML = media.textTracks.length; 241 td.className = 'true'; 242 } 243 } 244 245 246 /*检查支持的视频类型*/ 247 function init_canplayType() 248 { 249 var ogvType = document.getElementById('canplayOgv'); 250 var mp4Type = document.getElementById('canplayMp4'); 251 var webmType = document.getElementById('canplayWebm'); 252 253 if(media.canPlayType('video/ogv') == '') 254 ogvType.innerHTML = 'unsupported'; 255 else 256 ogvType.innerHTML = media.canPlayType('video/ogv'); 257 258 if(media.canPlayType('video/mp4') =='') 259 mp4Type.innerHTML = 'unsupported'; 260 else 261 mp4Type.innerHTML = media.canPlayType('video/mp4'); 262 263 if(media.canPlayType('video/webm') == '') 264 webmType.innerHTML = 'unsupported'; 265 else 266 webmType.innerHTML = media.canPlayType('video/webm'); 267 } 268 269 /*视频快进操作*/ 270 function video_fastForward(timeVal) 271 { 272 media.currentTime += 10; 273 update_properties(); 274 } 275 276 /*视频快退操作*/ 277 function video_rewind(timeVal) 278 { 279 media.currentTime -= timeVal; 280 update_properties(); 281 } 282 283 284 var posterSrc = ['newtest.jpg', 'movie_ogv.png', 'movie_300.jpg']; 285 var videoSrc = ['newtest.webm', 'newtest.flv', 'newtest.mp4', 'newtest.ogv', 'movie_300.webm']; 286 /*更换视频源*/ 287 function switchVideo() 288 { 289 var video = document.getElementById('webm'); 290 media.setAttribute ('poster', posterSrc[2]); 291 video.setAttribute ('src', videoSrc[4]); 292 media.load(); 293 }
html用到的布局文件,这个布局文件比较简单,style.css:
1 body 2 { 3 background-color: white; 4 font-family: Geneva, sans-serif; 5 margin: 10px auto; 6 border: solid; 7 border-color: #FFFFFF; 8 } 9 10 11 header 12 { 13 color: #FFFFFF; 14 text-align: center; 15 } 16 17 18 div#userInfoDiv 19 { 20 text-align: right; 21 margin: 10px 10px 10px 10px; 22 } 23 24 25 div#container 26 { 27 text-align: center; 28 margin: 20px auto; 29 } 30 31 32 div#buttonsDiv 33 { 34 text-align: center; 35 margin: 10px auto; 36 } 37 38 form#userInfoForm 39 { 40 padding: 10px ; 41 } 42 43 input 44 { 45 background-color: #ffe4c4; 46 } 47 48 49 table 50 { 51 margin: 20px auto; 52 text-align: left; 53 background-color: #c0c0c0; 54 } 55 56 caption 57 { 58 background-color: gray; 59 }
浙公网安备 33010602011771号