如何在Web服务器上处理实时媒体分析?

时间:2018-01-17 22:46:58

标签: python streaming webm mediarecorder-api

用例:我正在开发一个网络应用,以帮助学生学习阅读。在阅读网络应用程序上的文本时记录学生。信号通过200ms的段发送到后端,并在学生完成阅读之前进行分析,以便在阅读期间提供实时反馈。服务器将在每次分段分析后发送反馈。

在网络应用中,代码如下所示:

navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
    const mediaRecorder = new MediaRecorder(stream)
    mediaRecorder.start(200)

    mediaRecorder.ondataavailable = event => {
        socket.emit('my_event', Blob([event.data]))
    }
})

在chrome上,生成的媒体类型是webm。 我想知道如何处理后端的数据,这样我就可以在录制结束前用numpy分析媒体。

现在我找不到比以下更好的方法:

from pydub import AudioSegment
def blobToSignal(blob, is_first_sequence):
    webm_header = b'\x1aE...'
    fp = tempfile.NamedTemporaryFile()
    fp.write(blob) if is_first_sequence else fp.write(webm_header + blob)
    fp.seek(0)
    samples = AudioSegment.from_file(fp.name, 'webm').get_array_of_samples()
    fp.close()
    return samples # this is almost a numpy array (analyzable)

我尝试更改前面以返回Float32Array而不是webm:

navigator.mediaDevices.getUserMedia({ audio: true, video: false })
.then(stream => {
    audio_context = new AudioContext()
    var audioInput = audio_context.createMediaStreamSource(stream)
    var recorder = audio_context.createScriptProcessor(8096, 1, 1)
    recorder.onaudioprocess = event => {
        socket.emit(
            'my_event',
            Array.from(event.inputBuffer.getChannelData(0))
        )
    }
    audioInput.connect(recorder)
    recorder.connect(audio_context.destination)

这样后端可以使用原始信号,但这种方法需要太高的带宽(~1Mb / s)。

所以我的问题是:

  • 我在这里做错了吗?
  • 是否有一个Python librairy来解码来自Buffer的webm? (或类似的东西?我对Python不太熟悉......)
  • 你会如何处理这个用例?

感谢您的帮助!

0 个答案:

没有答案