Jitsi,getDisplayMedia() 不捕获参与者的声音

如何解决Jitsi,getDisplayMedia() 不捕获参与者的声音

我从 getdisplaymedia 获取屏幕视频和系统声音流,从 getusermedia 获取麦克风流,并使用 MediaRecorder 录制这些流。麦克风和屏幕录制都很好,所有系统声音都会出现,但jitsi参与者的声音没有录制。这是我的代码:

函数 openShareScreen() {

navigator.mediaDevices.getDisplayMedia({
    video: { displaySurface: "browser" },audio: true
}).then((desktopStream) => {
  
    let screenAudioTrack = desktopStream.getAudioTracks()[0];
    if (screenAudioTrack === undefined) {
        confirmSwalMessageConfirmOnly("Ses Paylaşımı Yapılmadı!","Görüşme kaydı için lütfen görüntü ve ses paylaşımına izin veriniz!","warning",openShareScreen);
        //recording = false;
        desktopStream.getTracks()
            .forEach(track => track.stop())
        return null;
    }

    var finalStream = new MediaStream();

    navigator.mediaDevices.getUserMedia({
        video: false,audio: true
    }).then((voiceStream) => {

        //Kamera ve mikrofon izin kontrolü yapılıyor
        navigator.permissions.query(
            { name: 'camera' },{ name: 'microphone' }
        ).then(function (permissionStatus) {

            // granted,denied,prompt
            if (permissionStatus.state !== 'granted') {
                confirmSwalMessageConfirmOnly("Mikrofon/Kamera izni verilmedi!","Görüşme kaydı için internet tarayıcınıza mikrofon ve kameraya erişim izni veriniz!",openShareScreen);
                //recording = false;
                desktopStream.getTracks().forEach(track => track.stop())
                voiceStream.getTracks().forEach(track => track.stop());
                return null;

            }
        })

        // important: we must convert multiple audio tracks into single audio track
        var mixedAudioStream = getMixedAudioStreamXYZ([voiceStream,desktopStream]) || microphone;

        mixedAudioStream.getAudioTracks().forEach(function (audioTrack) {
            finalStream.addTrack(audioTrack);
        });

        desktopStream.getVideoTracks().forEach(function (videoTrack) {
            finalStream.addTrack(videoTrack);
        });

        //Verilen time out interval süresinde kaydı başla
        var timeOutStopRecorder;
        recordLoop();

        function recordLoop() {
            
            recorder = new MediaRecorder(finalStream,{ mimeType: 'video/webm',videoBitsPerSecond: glbVideoBitsPerSecond });

            recorder.ondataavailable = e => {

                if (e.data && e.data.size > 0) {
                    recordingData = [];
                    recordingData.push(e.data);

                }
            };

            recorder.onstop = () => {
                saveRecordDone = false;
                clearTimeout(timeOutStopRecorder);
                var blob = new Blob(recordingData,{ type: 'video/webm' })
                console.log("Kayıt Diske Yazıldı:" + getDateTimeNow());
                SaveRecord(blob);
                recordLoop();
            };
            console.log("Kayıt Başladı:" + getDateTimeNow());
            recorder.start();
            timeOutStopRecorder = setTimeout(() => {
                console.log("Kayıt Durdu:" + getDateTimeNow());
                recorder.stop();
            },60000);
        }

        //recorder = RecordRTC(finalStream,{
        //    type: 'video',//    mimeType: "video/webm;codecs=vp8,opus",//    videoBitsPerSecond: glbVideoBitsPerSecond
        //});

        //recorder.startRecording();
        //recording = true;
        finalStream.getVideoTracks()[0].addEventListener('ended',() => {
            //stopRecordingAndSave();
            recorder.stop();
            confirmSwalMessageConfirmOnly("Paylaşım durduruldu!",openShareScreen);
            //recording = false;
        });
    }).catch(err => {
        console.warn(err);
        confirmSwalMessageConfirmOnly("Mikrofon/Kamera izni verilmedi!",openShareScreen);
        //recording = false;
    });
}).catch(err => {
    confirmSwalMessageConfirmOnly("Uyarı!",openShareScreen);
    //recording = false;
});

}

函数 getMixedAudioStreamXYZ(arrayOfAudioStreams) {

var audioContext = new AudioContext();

var audioSources = [];

var gainNode = audioContext.createGain();
gainNode.connect(audioContext.destination);
gainNode.gain.value = 0; // don't hear self

var audioTracksLength = 0;
arrayOfAudioStreams.forEach(function (stream) {
    if (!stream.getAudioTracks().length) {
        return;
    }

    audioTracksLength++;

    var audioSource = audioContext.createMediaStreamSource(stream);
    audioSource.connect(gainNode);
    audioSources.push(audioSource);
});

if (!audioTracksLength) {
    return;
}

audioDestination = audioContext.createMediaStreamDestination();
audioSources.forEach(function (audioSource) {
    audioSource.connect(audioDestination);
});
return audioDestination.stream;

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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-