问题重现
在前面的内容中(点这里看前篇),已经实现了利用srs的dvr功能进行服务器端的录制,但会产生一个问题:录制的文件不一定是1080P,而且分辨率会不断发生变化,刚开始分辨率和码流较小,然后会变大,一段时间后又会变小,而且在分辨切换的过程中,会有将近1s的黑屏,而且会无规律的画面静止,如此反复。这是不符合项目目标的,必须要着手解决这个问题。
产生原因
由于采用了webrtc推流的方式,而这种方式传输视频数据,是没有办法自己定义和管理码流、分辨率的,因为协议本身会依据带宽质量动态调节。srs dvr自身只负责对输入的流录制,并不会与推流方进行协议协商,所以出现了上面的现象。
解决思路
既然srs dvr不理想,那只有自己动手了。
- 从navigator.mediaDevices.getUserMedia获取stream;
- 创建一个MediaRecorder
- 在MediaRecorder的ondataavailable回调中,可以获取到blob;
- 将blob通过websocket发送到blazor server;
- blazor server中,接收blob,通过FileStream保存在文件里;
- 客户端停止录像,断开websocket,服务器关闭FileStream对象,完成录像。
关键代码
js部分
startPush();
var mediaRecorder;
var ws;
function stopRec() {
mediaRecorder.stop();
ws.close();
ws = null;
}
async function startPush() {
var constraints = {
audio: true,
video: {
width: {
min: 1280, ideal: 1920, max: 1920 },
height: {
min: 720,