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

在 Python 中连接 MediaRecorder API 块

如何解决在 Python 中连接 MediaRecorder API 块

我正在尝试录制我们的客户网络摄像头(使用 MediaRecorder API),使用 django-channels 将 ondataavailable 块发送到我的 django 后端,并在录制结束时,在后端重新组装所有块。

我在组装部分挣扎。我所拥有的只是一个 1 秒(或更短时间)内的 webm 文件。如果我使用 ffmpeg 转换它,我有一个完整大小的 mp4,但有很多损坏的帧(视频的某些部分冻结)。

我不知道我做错了什么,我怀疑在上传块的过程中发生了损坏。

这是我的前端代码

interface CArgs {
    first: number;
    second: number;
}

interface IArgs {
    second: number;
}

class C {
    z(args: CArgs) {
        args.first.toString();
    }
}

interface I {
    z(args: IArgs): void;
}

const args = {
    second: 2
};

const c1: I = new C();
c1.z(args);

这是我接收数据的python代码

 navigator.mediaDevices.getUserMedia({video: true })
                    .then(videoStream => {
                            const options = {
                                mimeType: 'video/webm;codecs=vp9',facingMode: 'user',videoBitsPerSecond: 200000,// 0.2 Mbit/sec.
                                frameRate: {ideal: 30,max: 30}
                            };
                            this.videoRecorder = new MediaRecorder(videoStream,options);
                            this.videoRecorder.video = this.videoElmt;
                            this.videoStream = videoStream;

                            this.videoRecorder.ondataavailable = (event) => {
                                if (event.data.size > 0) {
                                    this.uploadChunk(event.data);
                                }
                            };
                        }
                    }).catch( (err) => {
                        console.log(err);
                    } );
            }

/* ... */

uploadChunk(chunk) {
    if (chunk && chunk.size > 0) {
        chunk.arrayBuffer().then( data => {
            let reusableByteLength = data.byteLength;
            if (reusableByteLength % 2 !== 0) {
                data = data.slice(0,reusableByteLength - 1);
            }
            let data64 = this.arrayBufferToBase64(data);
            let payload = { "data": data64,"type": "upload_chunk",source: 'VIDEO' };
            this.realtimeService.send(this.id,payload);
            } );
        }
    }

当我收到录音的结尾时:

data = base64.b64decode(event['data'])
self.video_chunks.append(data)

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