折腾:

期间,用相关代码:    function testMediaRecorder(mediaStream){

console.log("testMediaRecorder: mediaStream=%o", mediaStream);

const options = {mimeType: 'audio/webm'};

if (MediaRecorder.isTypeSupported(options.mimeType)) {

console.log("support options=%o", options);

} else {

console.log(options.mimeType + ' is not Supported');

}

const recordedChunks = [];

const mediaRecorder = new MediaRecorder(mediaStream, options);

console.log("mediaRecorder=%o", mediaRecorder);

mediaRecorder.addEventListener('dataavailable', function(e) {

console.log("dataavailable: e.data.size=%d, e.data=%o", e.data.size, e.data);

if (e.data.size > 0) {

recordedChunks.push(e.data);

console.log("recordedChunks=%o", recordedChunks);

}

if (shouldStop === true && stopped === false) {

mediaRecorder.stop();

stopped = true;

console.log("stopped=%s", stopped);

}

});

mediaRecorder.addEventListener('stop', function() {

// downloadLink.href = URL.createObjectURL(new Blob(recordedChunks));

// downloadLink.download = 'acetest.wav';

var blobFile = URL.createObjectURL(new Blob(recordedChunks));

console.log("blobFile=%o", blobFile);

$("#downloadSpeakAudio").attr("href", speakAudioFilename);

var curDate = new Date();

console.log("curDate=%o", curDate);

var curDatetimeStr = curDate.Format("yyyyMMdd_HHmmss");

console.log("curDatetimeStr=%o", curDatetimeStr);

var speakAudioFilename = curDatetimeStr + ".wav"

console.log("speakAudioFilename=%o", speakAudioFilename);

$("#downloadSpeakAudio").attr("download", speakAudioFilename);

});

console.log("before start: mediaRecorder.state=%s", mediaRecorder.state);

mediaRecorder.start();

// mediaRecorder.start(100);

console.log("after  start: mediaRecorder.state=%s", mediaRecorder.state);

}

但是始终无法执行到:dataavailable

从而无法得到麦克风录音的数据

MediaRecorder dataavailable not work

chrome中是可以开启摄像头的:

Chrome’s experimental Web Platform Features enabled

MediaRecorder voice

js MediaRecorder voice

去调试:console.log("before start: mediaRecorder.state=%s", mediaRecorder.state);

mediaRecorder.start();

console.log("after start: mediaRecorder.state=%s", mediaRecorder.state);

state是对的:before start: mediaRecorder.state=inactive

main.js:196 after  start: mediaRecorder.state=recording

MediaRecorder dataavailable not fire

“2.2. Attributes

stream, of type MediaStream, readonly

The MediaStream to be recorded.

mimeType, of type DOMString, readonly

The MIME type [RFC2046] that has been selected as the container for recording. This entry includes all the parameters to the base mimeType. The UA should be able to play back any of the MIME types it supports for recording. For example, it should be able to display a video recording in the HTML tag. The default value for this property is platform-specific.

mimeType specifies the media type and container format for the recording via a type/subtype combination, with the codecs and/or profiles parameters [RFC6381] specified where ambiguity might arise. Individual codecs might have further optional specific parameters.

state, of type RecordingState, readonly

The current state of the MediaRecorder object. When the MediaRecorder is created, the UA MUST set this attribute to inactive.

onstart, of type EventHandler

Called to handle the start event.

onstop, of type EventHandler

Called to handle the stop event.

ondataavailable, of type EventHandler

Called to handle the dataavailable event. The Blob of recorded data is contained in this event and can be accessed via its data attribute.

onpause, of type EventHandler

Called to handle the pause event.

onresume, of type EventHandler

Called to handle the resume event.

onerror, of type EventHandler

Called to handle a MediaRecorderErrorEvent.

videoBitsPerSecond, of type unsigned long, readonly

The value of the Video encoding target bit rate that was passed to the Platform (potentially truncated, rounded, etc), or the calculated one if the user has specified bitsPerSecond.

audioBitsPerSecond, of type unsigned long, readonly

The value of the Audio encoding target bit rate that was passed to the Platform (potentially truncated, rounded, etc), or the calculated one if the user has specified bitsPerSecond.”

换写法:        // mediaRecorder.addEventListener('dataavailable', function(e) {

mediaRecorder.ondataavailable = function(e) {

console.log("dataavailable: e.data.size=%d, e.data=%o", e.data.size, e.data);

if (e.data.size > 0) {

recordedChunks.push(e.data);

console.log("recordedChunks=%o", recordedChunks);

}

if (shouldStop === true && stopped === false) {

mediaRecorder.stop();

stopped = true;

console.log("stopped=%s", stopped);

}

// });

};

结果问题依旧。

参考:

去看看,是不是codecs不支持?        if (MediaRecorder.isTypeSupported(options.mimeType)) {

console.log("support options=%o", options);

} else {

console.log(options.mimeType + ' is not Supported');

options = {mimeType: 'video/webm;codecs=vp8'};

if (!MediaRecorder.isTypeSupported(options.mimeType)) {

console.log(options.mimeType + ' is not Supported');

options = {mimeType: 'video/webm'};

if (!MediaRecorder.isTypeSupported(options.mimeType)) {

console.log(options.mimeType + ' is not Supported');

options = {mimeType: ''};

}

}

}

显示是支持的:

support options={mimeType: “video/webm;codecs=vp9”}

改为:// mediaRecorder.start();

mediaRecorder.start(100);

结果好像就可以收到数据了:

且点击停止,可以去获取到文件了?recordedChunks=(105) [Blob(653), Blob(689), Blob(780), Blob(780), Blob(780), Blob(780), Blob(788), Blob(777), Blob(780), Blob(780), Blob(780), Blob(780), Blob(854), Blob(731), Blob(769), Blob(780), Blob(783), Blob(783), Blob(783), Blob(868), Blob(817), Blob(793), Blob(797), Blob(787), Blob(783), Blob(789), Blob(768), Blob(761), Blob(812), Blob(809), Blob(771), Blob(797), Blob(789), Blob(791), Blob(787), Blob(787), Blob(787), Blob(787), Blob(787), Blob(769), Blob(720), Blob(838), Blob(821), Blob(787), Blob(787), Blob(776), Blob(792), Blob(759), Blob(692), Blob(786), Blob(785), Blob(780), Blob(780), Blob(780), Blob(804), Blob(833), Blob(850), Blob(787), Blob(787), Blob(787), Blob(787), Blob(787), Blob(787), Blob(787), Blob(772), Blob(720), Blob(844), Blob(812), Blob(784), Blob(749), Blob(753), Blob(790), Blob(746), Blob(900), Blob(782), Blob(693), Blob(755), Blob(800), Blob(879), Blob(795), Blob(672), Blob(785), Blob(785), Blob(780), Blob(780), Blob(780), Blob(780), Blob(780), Blob(780), Blob(810), Blob(791), Blob(753), Blob(854), Blob(773), Blob(831), Blob(817), Blob(787), Blob(787), Blob(787), Blob(772), …]

main.js:208 blobFile="blob:null/f24084d6-8674-4b1e-b7f7-70081c69c022"

main.js:212 curDate=Wed May 16 2018 18:26:42 GMT+0800 (CST)

main.js:214 curDatetimeStr="20180516_182642"

main.js:216 speakAudioFilename="20180516_182642.wav"

至此,好像是:

给mediaRecorder的start添加一个毫秒的时间,好像dataavailable就能执行到了

去查查start参数

MediaRecorder js api

“MediaRecorder.start()

Begins recording media; this method can optionally be passed a timeslice argument with a value in milliseconds. If this is specified, the media will be captured in separate chunks of that duration, rather than the default behavior of recording the media in a single large chunk.”

start中可以传入参数,相当于interval,指的是多少毫秒执行一次,捕获一次,

而默认不传则是:录音保存为一个大的chunk数据块

“timeslice Optional

The number of milliseconds to record into each Blob. If this parameter isn’t included, the entire media duration is recorded into a single Blob unless the requestData()method is called to obtain the Blob and trigger the creation of a new Blob into which the media continues to be recorded.”

所以感觉是:

之前其实已经在录音了,但是需要去调用:requestData(),才能获取录音数据?

去下载

后,试试demo

期间看到:

的codes:# audio codecs

audio/webm

audio/webm;codecs=opus

# video codecs

video/webm

video/webm;codecs=avc1

video/webm;codecs=h264

video/webm;codecs=h264,opus

video/webm;codecs=vp8

video/webm;codecs=vp8,opus

video/webm;codecs=vp9

video/webm;codecs=vp9,opus

video/webm;codecs=h264,vp9,opus

video/webm;codecs=vp8,vp9,opus

video/x-matroska

video/x-matroska;codecs=avc1

而我此处参考别人代码用的是:const options = {mimeType: 'video/webm;codecs=vp9’};

.getUserMedia({ audio: true, video: false })

感觉是:

只是申请audio,没有video,但是编码却设置的是video的

好像搞错了啊。

改为audio:const options = {mimeType: 'audio/webm'};

结果:

现象依旧:

ondataavailable没用,但是如果start设置了timeslice后,又能收到数据

试了试demo的

是可以录音的

研究了代码,只有recorder去stop时,才会调用data-available

那也去试试官网说的:

“MediaRecorder.requestData()

Requests a Blob containing the saved data received thus far (or since the last time requestData() was called. After calling this method, recording continues, but in a new Blob.”

调用requestData,看看是否可以获得一次性的录音数据

看看是否能执行到dataavailable

代码:        $( "#stopSpeak" ).on( "click", function() {

console.log("#stopSpeak clicked");

shouldStop = true;

console.log("shouldStop=%s", shouldStop);

mediaRecorder.requestData();

});

效果:

的确是的:#stopSpeak clicked

main.js:203 shouldStop=true

main.js:185 dataavailable: e.data.size=45916, e.data=Blob(45916) {size: 45916, type: "audio/webm"}

main.js:189 recordedChunks=[Blob(45916)]

main.js:195 stopped=true

main.js:185 dataavailable: e.data.size=0, e.data=Blob(0) {size: 0, type: "audio/webm"}

main.js:212 blobFile="blob:null/4347021b-a90f-4d12-9d60-56f47db33ac0"

main.js:216 curDate=Thu May 17 2018 14:17:06 GMT+0800 (CST)

main.js:218 curDatetimeStr="20180517_141706"

main.js:220

不过还是继续参考人家的demo的写法// Stopping the recorder will eventually trigger the `dataavailable` event and we can complete the recording process

recorder.stop();

写的很清楚了,就是我上面的猜测

MediaRecorder的stop,才会让dataavailable收到数据

然后用代码:    function testMediaRecorder(mediaStream){

console.log("testMediaRecorder: mediaStream=%o", mediaStream);

// const options = {mimeType: 'video/webm;codecs=vp9'};

const options = {mimeType: 'audio/webm'};

if (MediaRecorder.isTypeSupported(options.mimeType)) {

console.log("support options=%o", options);

} else {

console.log(options.mimeType + ' is not Supported');

// options = {mimeType: 'video/webm;codecs=vp8'};

// if (!MediaRecorder.isTypeSupported(options.mimeType)) {

//   console.log(options.mimeType + ' is not Supported');

//   options = {mimeType: 'video/webm'};

//   if (!MediaRecorder.isTypeSupported(options.mimeType)) {

//     console.log(options.mimeType + ' is not Supported');

//     options = {mimeType: ''};

//   }

// }

}

// const recordedChunks = [];

const mediaRecorder = new MediaRecorder(mediaStream, options);

console.log("mediaRecorder=%o", mediaRecorder);

mediaRecorder.addEventListener('dataavailable', function(e) {

// mediaRecorder.ondataavailable = function(e) {

console.log("dataavailable: e.data.size=%d, e.data=%o", e.data.size, e.data);

// if (e.data.size > 0) {

//     recordedChunks.push(e.data);

//     console.log("recordedChunks=%o", recordedChunks);

// }

// if (shouldStop === true && stopped === false) {

//     mediaRecorder.stop();

//     stopped = true;

//     console.log("stopped=%s", stopped);

// }

var inputAudio = document.getElementById('inputAudio');

// var inputAudio = $("#inputAudio");

console.log("inputAudio=o", inputAudio);

// e.data contains a blob representing the recording

var recordedBlob = e.data;

console.log("recordedBlob=o", recordedBlob);

// try {

//     inputAudio.srcObject = recordedBlob;

//     console.log("inputAudio.srcObject=%o", inputAudio.srcObject);

// } catch (error) {

//     console.log("try set input audio srcObject error=%o", error);

//inputAudio.src = window.URL.createObjectURL(recordedBlob);

inputAudio.src = URL.createObjectURL(recordedBlob);

console.log("inputAudio.src=%o", inputAudio.src);

// }

inputAudio.load();

inputAudio.play();

});

// };

$( "#stopSpeak" ).on( "click", function() {

console.log("#stopSpeak clicked");

// shouldStop = true;

// console.log("shouldStop=%s", shouldStop);

// mediaRecorder.requestData();

mediaRecorder.stop();

});

// mediaRecorder.addEventListener('stop', function() {

//     console.log("mediaRecorder stoped");

//     // downloadLink.href = URL.createObjectURL(new Blob(recordedChunks));

//     // downloadLink.download = 'acetest.wav';

//     var blobFile = URL.createObjectURL(new Blob(recordedChunks));

//     console.log("blobFile=%o", blobFile);

//     $("#downloadSpeakAudio").attr("href", speakAudioFilename);

//     var curDate = new Date();

//     console.log("curDate=%o", curDate);

//     var curDatetimeStr = curDate.Format("yyyyMMdd_HHmmss");

//     console.log("curDatetimeStr=%o", curDatetimeStr);

//     var speakAudioFilename = curDatetimeStr + ".wav"

//     console.log("speakAudioFilename=%o", speakAudioFilename);

//     $("#downloadSpeakAudio").attr("download", speakAudioFilename);

// });

console.log("before start: mediaRecorder.state=%s", mediaRecorder.state);

mediaRecorder.start();

// mediaRecorder.start(100);

console.log("after  start: mediaRecorder.state=%s", mediaRecorder.state);

}

是可以获得录音数据并点击播放的:

点击结束说话,是可以听到录音的:#stopSpeak clicked

main.js:185 dataavailable: e.data.size=152518, e.data=Blob(152518) {size: 152518, type: "audio/webm"}

main.js:200 inputAudio=o <audio id="inputAudio" src="blob:null/563bce79-455c-48cd-8bf4-caff59d41e07"></audio>

main.js:203 recordedBlob=o Blob(152518) {size: 152518, type: "audio/webm"}

main.js:212 inputAudio.src="blob:null/563bce79-455c-48cd-8bf4-caff59d41e07"

【总结】

此处,用代码:

function testMediaRecorder(mediaStream){

console.log("testMediaRecorder: mediaStream=%o", mediaStream);

const options = {mimeType: 'audio/webm'};

if (MediaRecorder.isTypeSupported(options.mimeType)) {

console.log("support options=%o", options);

} else {

console.log(options.mimeType + ' is not Supported');

}

const mediaRecorder = new MediaRecorder(mediaStream, options);

console.log("mediaRecorder=%o", mediaRecorder);

mediaRecorder.addEventListener('dataavailable', function(e) {

console.log("dataavailable: e.data.size=%d, e.data=%o", e.data.size, e.data);

var inputAudio = document.getElementById('inputAudio');

console.log("inputAudio=o", inputAudio);

// e.data contains a blob representing the recording

var recordedBlob = e.data;

console.log("recordedBlob=o", recordedBlob);

inputAudio.src = URL.createObjectURL(recordedBlob);

console.log("inputAudio.src=%o", inputAudio.src);

inputAudio.load();

inputAudio.play();

});

$( "#stopSpeak" ).on( "click", function() {

console.log("#stopSpeak clicked");

mediaRecorder.stop();

});

console.log("before start: mediaRecorder.state=%s", mediaRecorder.state);

mediaRecorder.start();

console.log("after  start: mediaRecorder.state=%s", mediaRecorder.state);

}

是可以获取录音数据的。

然后有几点要说明的:

1.可以把:mediaRecorder.addEventListener('dataavailable', function(e) {

});

写成:mediaRecorder.ondataavailable = function(e) {

...

};

也是一样的。

即:

dataavailable的eventlistener

ondataavailable的event是一样的。

后记:

也解释了:MediaRecorder.ondataavailable = function(event) { ... }

MediaRecorder.addEventListener('dataavailable', function(event) { ... })

2.如果用:mediaRecorder.start(100);

即调用start传递一个100毫秒的timeslice,则每隔100毫秒,都会触发dataavailable的event

-》此时得到的数据则是每100毫秒这段时间的录音的blob数据

3.只是普通的mediaRecorder.start();

的话,则一直都不会触发

dataavailable的event

只有(比如点击一个停止按钮)去调用:mediaRecorder.stop();

才会触发dataavailable

-》此时,得到的是录音的blob(数据文件)

4.另外:如果去(比如点击一个停止按钮)调用:mediaRecorder.requestData();

也是和stop类似效果,也会触发dataavailable的。

html未找到音频文件夹,【已解决】html5中MediaRecorder的dataavailable没有执行获取不到录音数据...相关推荐

  1. 如何在服务器中找到数据库文件夹,如何在服务器中找到数据库文件

    如何在服务器中找到数据库文件 内容精选 换一换 本手册基于华为云关系型数据库实践所编写,用于指导您完成相关设置,购买更符合业务的数据库实例. 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用 ...

  2. 如何在服务器中找到数据库文件夹,如何在服务器中找到数据库文件路径

    如何在服务器中找到数据库文件路径 内容精选 换一换 可以根据应用备份将资源的数据恢复到备份时刻的状态.需要恢复的资源的状态为"在线".不建议对正在运行的应用程序的文件进行恢复,建议 ...

  3. cmd进入文件夹/操作+解决路径中的空格问题

    目录 1 怎样回到C盘的根目录? 2 怎么回到上一级? 3 怎么一键跳转文件夹 4 当文件夹名中出现了空格怎么跳转? 报错!!!​编辑 解决方法: 5 怎么进入其他盘的根目录? 6 怎么打印该文件夹中 ...

  4. 西门子安装未找到ssf文件_三菱、西门子软件安装常见出错解决方法「技成周报40期」...

    问题:在安装GX WORKS2软件时能够安装成功,但是一打开软件,就出现存储器空间或桌面堆栈不足的错误,应该怎么解决? 解决办法: 1:先在控制面板的添加删除程序中,卸载三菱编程软件及仿真软件:2:再 ...

  5. DevOps进阶(十)Jenkins组包时解决无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...

    在删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试.这类无法关闭删除文件夹的情况,如下图所示. 解决这个的关键是 ...

  6. 安装Wincc Flexible 2008 SP4提示“未找到SSF文件”的解决办法

    安装Wincc Flexible 2008 SP4提示"未找到SSF文件"的解决办法 WINCC FLEXIBLE 2008 SP3链接地址 Wincc flexible 2008 ...

  7. linux没有jre文件夹,linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法...

    linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法 出现这个问题可能有以下几种原因: 1.对该文件没有执行的权限. 2.我们的机器是64位的,而下载的jdk是32位的. 我就是后一 ...

  8. WinXP启动时自动打开上次关机时未关闭的文件夹

    不能自动打开上次关机时未关闭的文件夹解决方法: 首先运行注册表, 解决方法: 打开[\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersi ...

  9. 西门子安装未找到ssf文件_西门子300软件安装出错处理方法

    1.西门子300 smart软件安装时,出现未找到SSF文件的错误,应该怎么解决? 图片1.png (32.81 KB, 下载次数: 180) 2017-6-16 10:38 上传 解决方法: 对于西 ...

  10. 为什么从此电脑访问不了ftp_ftp无法访问此文件夹怎么解决_ftp文件夹错误无法访问此文件夹如何处理-win7之家...

    在电脑中,FTP即是TCP/IP协议组中的协议之一,被用于互联网双向传输,控制文件下载空间在服务器复制文件从本地计算机或本地上传文件复制到服务器上的空间,有些用户在电脑上想要打开ftp文件夹时却出现了 ...

最新文章

  1. 列表导航栏实例(02)——精美电子商务网站赏析
  2. Java编程基础-变量
  3. R语言观察日志(part18)--.C和.Call
  4. 中医移动医疗_中医之极简移动医疗
  5. 2016年光伏电站交易和融资的十大猜想
  6. 高通骁龙cpu排行_骁龙系列处理器性能分析,你的手机是什么处理器?
  7. php熊掌号怎么设置json-ld,织梦DEDECMS熊掌号JSON LD结构化数据代码分享
  8. Best Efforts 1PC 跨库事务
  9. 关联分析(一)--Apriori算法
  10. 深度模型 loss为nan解决方案详解
  11. Java毕设项目直播购物平台(java+VUE+Mybatis+Maven+Mysql)
  12. java生成生日贺卡代码_【5号课堂】scratch制作电子生日贺卡
  13. 大数据可视化常用的方式有哪些
  14. 《富爸爸,穷爸爸》书摘一
  15. 彻底删除win7无线临时网络
  16. 塑料壳上下扣合的卡扣设计_读书笔记-塑胶外壳卡扣设计
  17. 被迫选择了到了外包公司
  18. 如何使用word模板生成word文档(文本,图片)
  19. 如何监控Nginx(看完这篇就会了)
  20. Android 网络编程之HTTPS详解

热门文章

  1. Java中父子类引用的理解
  2. 深度学习在图像分类中的应用
  3. 也来对比一下segmentfault、开源中国、简书
  4. PSVR透露下一步计划,不做内容改做声控
  5. 拥2180亿美元收入 苹果成全球最大IT企业
  6. java 代码解压7z(带密码)转载请注明出处,谢谢
  7. Zookeeper节点监听结合Spring
  8. mysql   show global variables
  9. 分享Silverlight/WPF/Windows Phone一周学习导读(4月18日-4月23日)
  10. .NET基础知识(一)