如何发现不再调用 MediaRecorder.ondataavailble 的问题?

如何解决如何发现不再调用 MediaRecorder.ondataavailble 的问题?

我正在使用 navigator.mediaDevices.getUserMedia() 捕获用户的音频和视频,然后使用 MediaRecorder 及其 ondataavailable 在本地存储该视频和音频 blob,以便稍后上传。

现在我正在处理一个问题,即由于某种原因 ondataavailable 在录制过程中停止被调用。我不知道为什么,我也没有收到任何出错的警报。首先,有人知道为什么会发生这种情况以及如何捕获错误吗?

其次,我试图重现。通过做这样的事情。

navigator.mediaDevices.getUserMedia({ audio: true,video: true })
  .then(function(camera) {
          local_media_stream = camera;
          camera.getVideoTracks()[0].onended = function() { console.log("VIDEO ENDED") }
          camera.getAudioTracks()[0].onended = function() { console.log("Audio ENDED") }
          camera.onended = function() { console.log("--- ENDED") }
          camera.onremovetrack = (event) => { console.log(`${event.track.kind} track removed`); };
  }).catch(function(error) {
        alert('Unable to capture your camera. Please check logs.' + error);
        console.error(error);
  });

并用

录制流
recorder = new MediaRecorder(local_media_stream,{
    mimeType: encoding_options,audioBitsPerSecond: 128000,videoBitsPerSecond: bits_per_second,});
recorder.ondataavailable = function(e) {
    save_blob(e.data,blob_index)
    blob_index++;
}
recorder.onstop = function(e) {
    console.log("recorder stopped");
    console.log(e)
}
recorder.onerror = function(error) {
    console.log("recorder error");
    alert(error)
    throw error;
}
recorder.onstart = function() {
    console.log('started');
};
recorder.onpause = function() {
    console.log('paused');
};
recorder.onresume = function() {
    console.log('resumed');
};
recorder.start(15000)

然后我尝试手动终止流以希望通过执行来重现发生的任何问题

local_media_stream.getVideoTracks()[0].stop()

现在不再调用 ondataavailable,但没有调用任何已结束的事件。录音仍在进行,local_media_stream 仍处于活动状态。

如果我也关闭音频

local_media_stream.getAudioTracks()[0].stop()

现在 local_media_stream 未处于活动状态,但仍然没有调用任何事件,告诉我流停止并且记录器仍在运行,但从未调用 ondatavailable

我能做什么?我想知道本地流正在成功录制,如果没有收到警报,我至少可以通知用户录制不再保存。

解决方法

MediaRecorder 有一个 recorder.stop() method。我没有看到您在示例代码中调用它。尝试调用它。

当您在媒体流的轨道上调用 track[n].stop() 时,您告诉他们停止向 MediaRecorder 提供数据。因此,不出所料,MediaRecorder 停止生成其编码输出流。

如果您在 Google Chrome 上运行,您也可以尝试比 recorder.start(15000) 更短的时间片。或者使用 recorder.requestData() 强制传递您的 dataavailable 事件。

,

停止两个轨道应该停止你的录音机,这对我来说在 FF 和 Chrome 中都是如此:https://jsfiddle.net/gpt51d6y/

但您的用户不太可能自己调用​​ stop()
问题很可能不在 MediaRecorder 中,而在 MediaStream 的轨道中。
一个所有轨道都被静音的 MediaRecorder 不会发出新的 dataavailable 事件,因为从它的角度来看,仍有可能发生的事情,轨道可能随时取消静音。

以具有硬件一键通功能的麦克风为例,每次用户释放此类按钮时,该麦克风的音轨都会静音,但是 MediaRecorder,即使它赢了在此期间不记录任何内容,仍然必须增加其内部计时,以便“间隙”不会“粘在”最终媒体中。然而,由于它没有传递给它的图形,它也不会发出新的 dataavailable 事件,它只会调整下一个将被发出的块中的时间戳。

对于您尝试查找问题出处的情况,您可以尝试侦听 MediaRecorder 的 error event,它在某些情况下可能会触发。

但您也绝对应该向其流的每个轨道添加事件,并且不要忘记 mute event

recorder.stream.getTracks().forEach( (track) => {
  track.onmute = track.onended = console.warn;
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-