微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何下载使用 getDisplayMedia api 录制的视频?

如何解决如何下载使用 getDisplayMedia api 录制的视频?

问题: 在我的 React 应用程序中,当我将主干设置为视频标签并成功播放时,我使用 navigator.mediaDevices.getdisplayMedia 在应用程序中设置了屏幕录制。但是当我尝试将它保存到本地机器时,它只保存了 0 分钟的视频。

这是我的代码

const VideoCall = ({ match }) => {
    const { params: { campaignPatienId,userId,id,meetingId,videoId } } = match;
    const [mediaR,setMediaR] = useState(null);
    const [recordingStarted,setRecordingStarted] = useState(false)
  
    const handleRecording = async () =>{
        const videoElem = document.querySelector("video");
        var displayMediaOptions = {
            video: {
              cursor: "always"
            },audio: {
                echoCancellation: true,noiseSuppression: true,sampleRate: 44100
            }
          };
          try {
            navigator.mediaDevices.getdisplayMedia(displayMediaOptions).then((strem)=>{
                console.log(strem,"stream")
                videoElem.srcObject = strem;
                setRecordingStarted(true)
                let mediaRecorder = new MediaRecorder(strem);
                
                let chunks = [];
                videoElem.onloadedMetadata= (e) =>{
                    videoElem.play();
                }

                mediaRecorder.ondataavailable = function (ev) {
                    console.log({ev})
                    chunks.push(ev.data)
                }
                mediaRecorder.onstop = (ev) => {
                    // window.clearTimeout(timoutStop);
                    let blob = new Blob(chunks,{ type: "video/mp4" });
                    console.log(blob,"blob")
                    chunks = [];
                    strem.getTracks().forEach(function (track) {
                        track.stop();
                    });
                    var url = URL.createObjectURL(blob);
                    var a = document.createElement('a');
                    document.body.appendChild(a);
                    a.style = 'display: none';
                    a.href = url;
                    a.download = 'test.mp4';
                    a.click();
                    window.URL.revokeObjectURL(url);

                }

                mediaRecorder.start();
                setMediaR(mediaRecorder)
            });
            
          } catch(err) {
            console.error("Error: " + err);
          }
    }


    const stopRecording = async () =>{
      let currentRecorder = mediaR;
      if (currentRecorder.state != "inactive") {
        await currentRecorder.stop();
      }
    }


    return (
        <div className="row" style={{ height: '100%',width: '100%' }}>
            <div className="col-md-12" >
                <div className="row">
                    <div className="colHeader">
                        <h3>Chat with Client</h3>
                        <div class="create-user-button" >
                            <Link
                                to="/mychat">
                                Go to Chat Screen
                                </Link>
                        </div>
                        <div>
                        {recordingStarted ?  <button
                            type="button"
                            onClick={() => stopRecording()}
                            className="btn btn-default scoreOverview"
                        >
                           Download
                        </button>:  <button
                            type="button"
                            onClick={() => handleRecording()}
                            className="btn btn-default scoreOverview"
                        >
                           Record Video Call
                        </button>}
                       
                        </div>
                    </div>
                </div>
                <video id="video" autoplay width="100%"></video>
                
                
            </div>
        </div>
    )
}

export default withRouter(VideoCall)

有人可以帮我解决这个问题吗? .我尝试了很多,但它总是下载 0 分钟的视频。

解决方法

WebRTC (getDisplayMedia) 通常记录为 webm。

我有一个在 record.a.video 运行的示例应用

并在代码中(看起来与您的相似,但对于 mimetype):https://github.com/dougsillars/recordavideo/blob/main/public/index.js#L652

function download() {
    var blob = new Blob(recordedBlobs,{type: 'video/webm'});
    var url = window.URL.createObjectURL(blob);
    var a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    a.download = 'test.webm';
    document.body.appendChild(a);
    a.click();
    setTimeout(function() {
        document.body.removeChild(a);
        window.URL.revokeObjectURL(url);
    },100);
}

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?