laravel 只有第一次迭代是MediaRecorder DataAvailable侦听器中的有效WebM文件

ubby3x7f  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(43)

因此,我正在开发一个音频记录器,用于浏览器使用Open AI whisper转录文本。然而,只有MediaRecorder dataavailable的第一次迭代被保存为有效的.webm文件,然后它们被保存为二进制文件。我也尝试硬编码.webm,并记录打印为audio/webm的blob.type。
我正在使用mediarecorder时间片选项每15秒创建一个新文件:mediaRecorder.start(15000);
有人能告诉我这里可能出了什么问题吗?
当前代码:
前端代码:

window.handleSuccess = function (stream) {
    const options = {mimeType: 'audio/webm;codecs=opus'};
    const recordedChunks = [];
    const mediaRecorder = new MediaRecorder(stream, options);

    mediaRecorder.addEventListener('dataavailable', function (e) {

        const reader = new FileReader();
        reader.readAsArrayBuffer(e.data);
        reader.onloadend = function () {
            const blob = new Blob([new Uint8Array(reader.result)], { type: 'audio/webm' });

            recordedChunks.push(blob);

            // post data to server
            const formData = new FormData();
            formData.append('audio', blob, 'filename.webm');
            formData.append('audio_mime', blob.type);
            formData.append('meeting_id', meetingId);
            fetch('/api/audio', {
                method: 'POST',
                body: formData,
                accept: 'application/json',
            }).then((response) => {
                console.log(response);
            }).catch((error) => {
                console.error(error);
            });

        };
    });

字符串
Laravel后端代码

public function uploadAudio(Request $request): JsonResponse
    {
        $mime = $request->input('audio_mime');
        $extensionMap = [
            'audio/webm' => 'webm',
        ];
        $extension = $extensionMap[$mime] ?? 'webm';
        $audioName = time() . '.' . $extension;

        $request->audio->move(storage_path('audio'), $audioName);

        Audio::create([
            'audio_file' => $audioName,
            'meeting_id' => $request->get('meeting_id'),
        ]);

        return response()->json([
            'message' => 'Audio uploaded successfully',
            'audio' => $audioName,
        ], 201);
    }

cgyqldqp

cgyqldqp1#

只有当您将所有块合并组合在一起时,MediaRecorder生成的文件才需要是有效文件。单个块不必是有效文件。
在WebM的情况下,第一个块似乎是一个有效的文件,因为WebM支持附加额外的音频。换句话说,第一个块是一个有效的文件。第一个和第二个块组合也是一个有效的文件。但是第二个块本身不是一个有效的文件。
如果你想继续使用WebM,你可以手动解析第一个块来提取头,然后将头附加到后面的每个块中,使其成为一个有效的文件。
如果你不介意较大的文件大小,你也可以用一个额外的库将音频录制为PCM。这使得添加标题变得更容易。
下面是它如何与extendable-media-recorder一起工作的例子:

const uploadWav = (blob) => {
  // your upload logic ...
  console.log(blob.size, blob.type);
};

const mediaRecorder = new MediaRecorder(mediaStream, {
  mimeType: 'audio/wav',
});

let header;

mediaRecorder.addEventListener('dataavailable', async ({ data }) => {
  if (header === undefined) {
    header = (await data.arrayBuffer()).slice(0, 44);

    uploadWav(data);
  } else {
    const content = await data.arrayBuffer();

    uploadWav(new Blob([header, content], { type: data.type }));
  }
});
mediaRecorder.start(15000);

字符串
这里有一个简单的演示项目的链接:https://stackblitz.com/edit/js-h48mqc?file=index.js

相关问题