Commit 47d0dca7b001a21696210cfa1f7e6401e002e90c

Authored by ykxie
1 parent 23052588

更改逻辑

example/recording.html 0 → 100644
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +<head>
  4 + <meta charset="UTF-8">
  5 + <title>录音demo</title>
  6 +</head>
  7 +<body>
  8 + <div class="code-warp"></div>
  9 + <audio controls autoplay></audio>
  10 + <fieldset>
  11 + <legend>录音 AUDIO</legend>
  12 + <input onclick="startRecording()" type="button" value="录音" />
  13 + <input onclick="stopRecording()" type="button" value="停止" />
  14 + <input onclick="playRecording()" type="button" value="播放" />
  15 + <input onclick="uploadAudio()" type="button" value="提交" />
  16 + <input onclick="downloadAudio()" type="button" value="下载" />
  17 + <input onclick="pauseAudio()" type="button" value="暂停/继续" />
  18 + </fieldset>
  19 +
  20 +<script type="text/javascript" src="../src/js/recorder/Myna.js"></script>
  21 +<script>
  22 + var recorder;
  23 + var audioData = [];
  24 + var _audio = '';
  25 + var size = 0;
  26 + window.URL = window.URL || window.webkitURL;
  27 + console.log(recorder)
  28 + var audio = document.querySelector('audio');
  29 +
  30 + function startRecording() {
  31 + HZRecorder.get(function (rec) {
  32 + console.log(recorder)
  33 + console.log('----------------------')
  34 + recorder = rec;
  35 + recorder.start();
  36 + console.log(recorder)
  37 + });
  38 + }
  39 + console.log('++++++++++++++++++++')
  40 + console.log(recorder)
  41 +
  42 + function pauseAudio(){
  43 + recorder.pause();
  44 + }
  45 +
  46 + function stopRecording() {
  47 + recorder.stop();
  48 + // audioData.push(recorder.getBlobData());
  49 + audioData.push(window.URL.createObjectURL(recorder.getBlobData()));
  50 + console.log(audioData);
  51 + }
  52 +
  53 + function playRecording() {
  54 + recorder.play(audio);
  55 + }
  56 +
  57 + function uploadAudio() {
  58 + recorder.upload("Handler1.ashx", function (state, e) {
  59 + switch (state) {
  60 + case 'uploading':
  61 + //var percentComplete = Math.round(e.loaded * 100 / e.total) + '%';
  62 + break;
  63 + case 'ok':
  64 + //alert(e.target.responseText);
  65 + alert("上传成功");
  66 + break;
  67 + case 'error':
  68 + alert("上传失败");
  69 + break;
  70 + case 'cancel':
  71 + alert("上传被取消");
  72 + break;
  73 + }
  74 + });
  75 + }
  76 +</script>
  77 +</body>
  78 +</html>
  79 +
src/index.html
@@ -93,15 +93,14 @@ @@ -93,15 +93,14 @@
93 </div> 93 </div>
94 </div> 94 </div>
95 </div> 95 </div>
96 -  
97 </div> 96 </div>
  97 +
98 <div class="col-md-4" id="previewpanel"> 98 <div class="col-md-4" id="previewpanel">
99 <div id="resultpanel" class="panel panel-default"> 99 <div id="resultpanel" class="panel panel-default">
100 <div class="panel-heading"> 100 <div class="panel-heading">
101 <div class="btn-group"> 101 <div class="btn-group">
102 <button type="button" class="btn btn-success" id="play" data-status="0" title="" style="display: none;"><</button> 102 <button type="button" class="btn btn-success" id="play" data-status="0" title="" style="display: none;"><</button>
103 <p id="replay">预览录制</p> 103 <p id="replay">预览录制</p>
104 -  
105 </div> 104 </div>
106 <div class="btn-group pull-right" id="comprunbtngrp"></div> 105 <div class="btn-group pull-right" id="comprunbtngrp"></div>
107 </div> 106 </div>
@@ -135,17 +134,18 @@ @@ -135,17 +134,18 @@
135 134
136 <!-- 录音控制条 --> 135 <!-- 录音控制条 -->
137 <div class="recording-ctrl-bar"> 136 <div class="recording-ctrl-bar">
138 - <button id="recording-btn" class="btn recording" type="button" data="1" title="正在录制"></button>  
139 - <button class="btn new-recording" title="重新录制" style="display: none;"></button> 137 + <button id="start-recording" class="btn new-recording" type="button" data="1" title="开始录制"></button>
  138 + <!-- <button id="recording-btn" class="btn recording" type="button" data="1" title="结束录制" style="display: none;"></button> -->
  139 + <!-- <button class="btn new-recording" title="重新录制" style="display: none;"></button> -->
140 <button class="audio-play hidden" title="播放预览" data="1"> 140 <button class="audio-play hidden" title="播放预览" data="1">
141 <i class="icon iconfont icon-play"></i> 141 <i class="icon iconfont icon-play"></i>
142 </button> 142 </button>
143 - <div class="recording-time twinkle" value="">00:00:00</div> 143 + <div class="recording-time" value="">00:00:00</div>
144 <div class="audio-view" style="display: none;"> 144 <div class="audio-view" style="display: none;">
145 <audio id="audio" autoplay></audio> 145 <audio id="audio" autoplay></audio>
146 </div> 146 </div>
147 <div class="save-wrap"> 147 <div class="save-wrap">
148 - <input type="button" id="upload" class="upload-teach" style="display: ;" disabled="disabled" value="保存"> 148 + <input type="button" id="upload" class="upload-teach" disabled="disabled" value="保存">
149 <input type="button" id="savecorde" class="upload-stud" style="display: none;" disabled="disabled" value="保存"> 149 <input type="button" id="savecorde" class="upload-stud" style="display: none;" disabled="disabled" value="保存">
150 <input type="button" id="cancel" value="关闭"> 150 <input type="button" id="cancel" value="关闭">
151 </div> 151 </div>
@@ -156,7 +156,7 @@ @@ -156,7 +156,7 @@
156 </div> 156 </div>
157 157
158 <div class="record-before"> 158 <div class="record-before">
159 - <div class="tip" style="display: none;"> 159 + <div class="tip">
160 <a class="start-btn"></a> 160 <a class="start-btn"></a>
161 </div> 161 </div>
162 <div class="error" style="display: none;"> 162 <div class="error" style="display: none;">
@@ -173,138 +173,22 @@ @@ -173,138 +173,22 @@
173 <script src="js/recording/recording.js"></script> 173 <script src="js/recording/recording.js"></script>
174 174
175 <script> 175 <script>
176 - var global_trigger_record = 1;  
177 var recorder; 176 var recorder;
178 - var startRec = $('#startRec');  
179 - var stopRec = $('#stopRec');  
180 - var playRec = $('#playRec');  
181 - var submitRec = $('#submitRec');  
182 var _role = getQuery('role'); 177 var _role = getQuery('role');
183 var _chapterId = getQuery('chapterId'); 178 var _chapterId = getQuery('chapterId');
184 var userId = getQuery('userId'); 179 var userId = getQuery('userId');
185 180
186 var audio = document.querySelector('audio'); 181 var audio = document.querySelector('audio');
187 -  
188 var saveAudio = document.getElementById("save"); 182 var saveAudio = document.getElementById("save");
189 -  
190 - $('.recording').click(function(){  
191 - $('.recording').hide();  
192 - $('.recording-time').removeClass('twinkle');  
193 - timer.stopTimer(); // 停止计时器  
194 -  
195 - $('#upload').removeClass('upload-teach').addClass('recording-finish').removeAttr('disabled').prop("disabled",false);  
196 - $('#savecorde').removeClass('upload-teach').addClass('recording-finish').removeAttr('disabled').prop("disabled",false);  
197 - // $('#cancel').attr('disabled', 'disabled').prop("disabled", true);  
198 -  
199 - // $('.recording').hide();  
200 - $('.new-recording').show();  
201 - $('.audio-play').removeClass('hidden').addClass('show');  
202 -  
203 - if (_role == 0) {  
204 - recorder.stop();  
205 - $('#upload').show();  
206 -  
207 - }else if (_role == 1) {  
208 - $('#savecorde').show();  
209 - }  
210 -  
211 -  
212 - })  
213 -  
214 - $('.new-recording').click(function(){  
215 - $('.recording').show();  
216 - $('.new-recording').hide();  
217 - window.location.reload();  
218 - })  
219 -  
220 -  
221 - $('.audio-finish').click(function(){  
222 - var data = $(this).attr('data');  
223 - timer.stopTimer();  
224 -  
225 - $('#upload').removeClass('upload-teach').addClass('recording-finish').removeAttr('disabled').prop("disabled",false);  
226 - $('#savecorde').removeClass('upload-teach').addClass('recording-finish').removeAttr('disabled').prop("disabled",false);  
227 - $('#cancel').attr('disabled', 'disabled').prop("disabled", true);  
228 -  
229 - if (data == 1){  
230 - if (_role == 0) {  
231 - recorder.stop();  
232 - console.log(recorder);  
233 - $('#upload').show()  
234 - }else if (_role == 1) {  
235 - $('#savecorde').show()  
236 - }  
237 - submitRec.removeAttr('disabled').prop("disabled", false);  
238 - $('#imgAudio').removeClass("microphone")  
239 - $(this).attr('data', 0).attr('data-original-title', '重新录制');  
240 - $(this).children('span').removeClass('stop').addClass('restart')  
241 - $('.audio-play').css('background-color', '#7FDE94').attr('data', '1').attr('data-original-title', '播放录音')  
242 - } else {  
243 - window.location.reload();  
244 - }  
245 - })  
246 183
247 // 结束播放事件 184 // 结束播放事件
248 audio.addEventListener("ended", function() { 185 audio.addEventListener("ended", function() {
  186 + console.log('结束播放事件');
249 timer.stopTimer(); 187 timer.stopTimer();
250 $('.audio-play').attr('data', '1') 188 $('.audio-play').attr('data', '1')
251 $('.audio-play').prop('disabled', false); 189 $('.audio-play').prop('disabled', false);
252 }, false); 190 }, false);
253 191
254 -  
255 - // 播放录音  
256 - $("#startRec").click(function(){  
257 - startRecording();  
258 - })  
259 - function startRecording(obj) {  
260 - HZRecorder.get(function(rec) {  
261 - var seconds = 0;  
262 - var countdown = setInterval(function(){  
263 - seconds += 1;  
264 - document.getElementById('countdown').innerHTML = 4-seconds;  
265 - if(seconds == 4){  
266 - clearInterval(countdown);  
267 - $("#countdown").css("display", "none");  
268 - recorder = rec;  
269 - recorder.start();  
270 - }  
271 - },1000);  
272 -  
273 - startRec.val('录音中...').attr('disabled', 'disabled').prop("disabled", true);  
274 - playRec.attr('disabled', 'disabled').prop("disabled", true);  
275 - submitRec.attr('disabled', 'disabled').prop("disabled", true);  
276 - });  
277 - $("#countdown").css("display", "block")  
278 - }  
279 - // 停止录音  
280 - $("#stopRec").click(function(){  
281 - stopRecording()  
282 - })  
283 - function stopRecording() {  
284 - recorder.stop();  
285 - startRec.val('重新录音').removeAttr('disabled').prop("disabled", false);  
286 - stopRec.val('录制完成').attr('disabled', 'disabled').prop("disabled", true);  
287 - playRec.removeAttr('disabled').prop("disabled", false);  
288 - submitRec.removeAttr('disabled').prop("disabled", false);  
289 - }  
290 -  
291 - // 播放录音  
292 - $("#playRec").click(function(){  
293 - playRecording()  
294 - })  
295 - function playRecording() {  
296 - recorder.play(audio);  
297 - playRec.val('正在播放...').attr('disabled', 'disabled').prop("disabled", true);  
298 - setTimeout(function(){  
299 - playRec.val('播放').removeAttr('disabled').prop("disabled", false);  
300 - }, 2000);  
301 - }  
302 -  
303 - // 下载录音文件  
304 - function downloadAudio(saveAudio){  
305 - recorder.download(saveAudio);  
306 - }  
307 -  
308 $('#upload').click(function(){ 192 $('#upload').click(function(){
309 uploadAudio() 193 uploadAudio()
310 }) 194 })
src/js/gbreplayer.js
@@ -21,7 +21,6 @@ $(function(){ @@ -21,7 +21,6 @@ $(function(){
21 $('#upload').show(); 21 $('#upload').show();
22 } 22 }
23 23
24 -  
25 var GBCodePlayBack = { 24 var GBCodePlayBack = {
26 records: [], 25 records: [],
27 excercise_records: [], 26 excercise_records: [],
@@ -475,6 +474,7 @@ $(function(){ @@ -475,6 +474,7 @@ $(function(){
475 474
476 // 播放录制代码过程 475 // 播放录制代码过程
477 $('.audio-play').click(function(){ 476 $('.audio-play').click(function(){
  477 + timer.init($recording_time);
478 var data = $(this).attr('data'); 478 var data = $(this).attr('data');
479 if (_role == 0) { 479 if (_role == 0) {
480 $('.audio-play').attr('disabled', true); 480 $('.audio-play').attr('disabled', true);
@@ -560,6 +560,7 @@ $(function(){ @@ -560,6 +560,7 @@ $(function(){
560 //播放代码回放 560 //播放代码回放
561 $('#playrecord').click(function(){ 561 $('#playrecord').click(function(){
562 // GBCodePlayBack.playRecordStart = new Date().getTime(); // 开始播放的时间 562 // GBCodePlayBack.playRecordStart = new Date().getTime(); // 开始播放的时间
  563 + console.log("---------------------")
563 if($(window).width()>992){ 564 if($(window).width()>992){
564 var $tutorial = $('#tutorialinfopanel'), 565 var $tutorial = $('#tutorialinfopanel'),
565 $editorpanel = $('#editorpanel'), 566 $editorpanel = $('#editorpanel'),
@@ -1319,7 +1320,7 @@ $(function(){ @@ -1319,7 +1320,7 @@ $(function(){
1319 currenttime = new Date().getTime(); 1320 currenttime = new Date().getTime();
1320 // if(!GBCodePlayBack.record_startime) GBCodePlayBack.record_startime = currenttime; 1321 // if(!GBCodePlayBack.record_startime) GBCodePlayBack.record_startime = currenttime;
1321 //根据不同的身份设置录制代码的时间间隔,当学生端输入的时候,重置间隔为100毫秒 1322 //根据不同的身份设置录制代码的时间间隔,当学生端输入的时候,重置间隔为100毫秒
1322 - if(_role == 0) { 1323 + if(_role == 0 && GBCodePlayBack.record_startime) {
1323 intervaltime = currenttime - GBCodePlayBack.record_startime; 1324 intervaltime = currenttime - GBCodePlayBack.record_startime;
1324 } 1325 }
1325 var recordobj = { 1326 var recordobj = {
@@ -1329,8 +1330,10 @@ $(function(){ @@ -1329,8 +1330,10 @@ $(function(){
1329 trigger: 0, 1330 trigger: 0,
1330 playTime: 0 1331 playTime: 0
1331 }; 1332 };
  1333 + console.log(GBCodePlayBack.records)
1332 GBCodePlayBack.records.push(recordobj); 1334 GBCodePlayBack.records.push(recordobj);
1333 GBCodePlayBack.record_startime = currenttime; //设定起始时间 1335 GBCodePlayBack.record_startime = currenttime; //设定起始时间
  1336 +
1334 }, 1337 },
1335 changeValueCallback: function(record, replay_type, offset) { 1338 changeValueCallback: function(record, replay_type, offset) {
1336 var obj = record.changeobj, editor = record.editor; 1339 var obj = record.changeobj, editor = record.editor;
@@ -1353,7 +1356,7 @@ $(function(){ @@ -1353,7 +1356,7 @@ $(function(){
1353 1356
1354 record.trigger = 1; //标记已运行 1357 record.trigger = 1; //标记已运行
1355 record.playTime = new Date().getTime(); // 播放开始时间 1358 record.playTime = new Date().getTime(); // 播放开始时间
1356 - 1359 + console.log(record);
1357 if(replay_type){ 1360 if(replay_type){
1358 GBCodePlayBack.excercise_triggertotal += 1; 1361 GBCodePlayBack.excercise_triggertotal += 1;
1359 }else{ 1362 }else{
@@ -1474,40 +1477,89 @@ $(function(){ @@ -1474,40 +1477,89 @@ $(function(){
1474 } 1477 }
1475 } 1478 }
1476 1479
  1480 + $('.record-before').hide();
  1481 + GBCodePlayBack.recordinit();
  1482 +
  1483 + // 开始录制
  1484 + $('#start-recording').click(function(){
  1485 + console.log('ooooooo');
  1486 + var data = $(this).attr('data');
  1487 + console.log(data);
  1488 + if(data == 1){
  1489 + console.log('++++++++++');
  1490 + startReacoder();
  1491 + }else{
  1492 + console.log('*********');
  1493 + stopReacoder();
  1494 + }
  1495 +
  1496 + })
  1497 +
1477 // 呼气麦克风和录制代码 1498 // 呼气麦克风和录制代码
1478 - if(document.URL.indexOf('index.htm') >= 0 && _role == 0){  
1479 - HZRecorder.get(function(rec) {  
1480 - var seconds = 0;  
1481 - $('.tip').show();  
1482 - $('.start-btn').click(function(){  
1483 - $('.tip').hide();  
1484 - $("#countdown").find('img').attr('src', 'img/dribbble-1.gif');  
1485 - var countdown = setInterval(function(){  
1486 - seconds += 1;  
1487 - if(seconds == 3){  
1488 - $('.record-before').hide();  
1489 - clearInterval(countdown);  
1490 - $("#countdown").css("display", "none");  
1491 - $("#countdown").find('img').attr('src', '');  
1492 - GBCodePlayBack.record_startime = new Date().getTime();  
1493 - recorder = rec;  
1494 - recorder.start();  
1495 - GBCodePlayBack.recordinit();  
1496 - timer.init($recording_time);  
1497 - }  
1498 - },1000);  
1499 - })  
1500 - }); 1499 + // if(document.URL.indexOf('index.htm') >= 0 && _role == 0){
  1500 + // HZRecorder.get(function(rec) {
  1501 + // var seconds = 0;
  1502 + // $('.tip').show();
  1503 + // $('.start-btn').click(function(){
  1504 + // $('.tip').hide();
  1505 + // $("#countdown").find('img').attr('src', 'img/dribbble-1.gif');
  1506 + // var countdown = setInterval(function(){
  1507 + // seconds += 1;
  1508 + // if(seconds == 3){
  1509 + // $('.record-before').hide();
  1510 + // clearInterval(countdown);
  1511 + // $("#countdown").css("display", "none");
  1512 + // $("#countdown").find('img').attr('src', '');
  1513 + // GBCodePlayBack.record_startime = new Date().getTime();
  1514 + // recorder = rec;
  1515 + // recorder.start();
  1516 + // GBCodePlayBack.recordinit();
  1517 + // timer.init($recording_time);
  1518 + // }
  1519 + // },1000);
  1520 + // })
  1521 + // });
1501 1522
1502 - }else{  
1503 - $('.record-before').hide();  
1504 - GBCodePlayBack.recordinit();  
1505 - timer.init($recording_time);  
1506 - } 1523 + // }else{
  1524 + // $('.record-before').hide();
  1525 + // GBCodePlayBack.recordinit();
  1526 + // timer.init($recording_time);
  1527 + // }
1507 1528
  1529 + function startReacoder(){
  1530 + HZRecorder.get(function(rec) {
  1531 + console.log('+++++++++++++++++++')
  1532 + recorder = rec;
  1533 + recorder.start();
  1534 +
  1535 + GBCodePlayBack.htmleditor.setValue('');
  1536 + GBCodePlayBack.records = [];
  1537 + GBCodePlayBack.record_startime = new Date().getTime();
  1538 +
  1539 + $('#start-recording').removeClass('new-recording').addClass('recording').attr('data', '0').attr('data-original-title', '结束录制');
  1540 + $('.recording-time').addClass('twinkle');
  1541 + timer.init($recording_time);
  1542 + $('.audio-play').removeClass('show').addClass('hidden');
  1543 + });
  1544 + }
1508 1545
  1546 + function stopReacoder(){
  1547 + $('#start-recording').removeClass('recording').addClass('new-recording').attr('data', '1').attr('data-original-title', '重新录制');
  1548 + $('.recording-time').removeClass('twinkle');
  1549 + timer.stopTimer();
1509 1550
  1551 + $('#upload').removeClass('upload-teach').addClass('recording-finish').removeAttr('disabled').prop("disabled",false);
  1552 + $('#savecorde').removeClass('upload-teach').addClass('recording-finish').removeAttr('disabled').prop("disabled",false);
  1553 + $('.audio-play').removeClass('hidden').addClass('show');
  1554 + if (_role == 0) {
  1555 + recorder.stop();
  1556 + $('#upload').show();
1510 1557
  1558 + }else if (_role == 1) {
  1559 + $('#savecorde').show();
  1560 + }
  1561 +
  1562 + }
1511 1563
1512 1564
1513 // 初始化渲染编辑页面 1565 // 初始化渲染编辑页面
src/js/recorder/Myna.js
@@ -14,18 +14,12 @@ @@ -14,18 +14,12 @@
14 var recorder = createScript.apply(context, [4096, 1, 1]); 14 var recorder = createScript.apply(context, [4096, 1, 1]);
15 15
16 var audioData = { 16 var audioData = {
17 - size: 0 //录音文件长度  
18 - ,  
19 - buffer: [] //录音缓存  
20 - ,  
21 - inputSampleRate: context.sampleRate //输入采样率  
22 - ,  
23 - inputSampleBits: 16 //输入采样数位 8, 16  
24 - ,  
25 - outputSampleRate: config.sampleRate //输出采样率  
26 - ,  
27 - oututSampleBits: config.sampleBits //输出采样数位 8, 16  
28 - , 17 + size: 0, //录音文件长度
  18 + buffer: [], //录音缓存
  19 + inputSampleRate: context.sampleRate, //输入采样率
  20 + inputSampleBits: 16, //输入采样数位 8, 16
  21 + outputSampleRate: config.sampleRate, //输出采样率
  22 + oututSampleBits: config.sampleBits, //输出采样数位 8, 16
29 input: function(data) { 23 input: function(data) {
30 this.buffer.push(new Float32Array(data)); 24 this.buffer.push(new Float32Array(data));
31 this.size += data.length; 25 this.size += data.length;
@@ -148,6 +142,7 @@ @@ -148,6 +142,7 @@
148 142
149 //停止 143 //停止
150 this.stop = function() { 144 this.stop = function() {
  145 + console.log('&&&&&&&&&&&&');
151 recorder.disconnect(); 146 recorder.disconnect();
152 } 147 }
153 148
@@ -157,6 +152,11 @@ @@ -157,6 +152,11 @@
157 return audioData.encodeWAV(); 152 return audioData.encodeWAV();
158 } 153 }
159 154
  155 + // 获取音频文件
  156 + this.getBlobData = function(){
  157 + return audioData.encodeWAV();
  158 + }
  159 +
160 //回放 160 //回放
161 this.play = function(audio) { 161 this.play = function(audio) {
162 console.log(window.URL.createObjectURL(this.getBlob())) 162 console.log(window.URL.createObjectURL(this.getBlob()))
src/player.html
@@ -128,7 +128,6 @@ @@ -128,7 +128,6 @@
128 </div> 128 </div>
129 </div> 129 </div>
130 </div> 130 </div>
131 -  
132 <div class="play-bar"> 131 <div class="play-bar">
133 <button id="playrecord" data-status='0' title="播放"> 132 <button id="playrecord" data-status='0' title="播放">
134 <i class="icon iconfont icon-play"></i> 133 <i class="icon iconfont icon-play"></i>