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

从 Safari 上的服务器获取后,音频文件的大小始终为常数

如何解决从 Safari 上的服务器获取后,音频文件的大小始终为常数

我正在编写用于录制音频的服务。录制后,我将其发送到 API,当用户单击“播放”按钮时,我从 API 获取该音频文件并播放它。但出于某种原因,如果我在 Safari 中录制该音频,在保存 API 并获取它后,它只会播放整个音频的 1 秒,因为它的大小始终是常数 - 8683。在 Chrome 中一切正常。

还要补充一点,录完后,可以成功播放。只有在保存记录后才会出现问题。

这是我的录音服务:

export class VoiceRecorder {
    public recording: boolean = false;

    private stream: MediaStream;
    // @ts-ignore
    private mediaRecorder: MediaRecorder;
    // @ts-ignore
    private audioChunks: BlobPart[] = [];

    public start(): Observable<void> {
        this.recording = true;
        this.audioChunks = [];
        return new Observable(observer => {
            navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
                this.stream = stream
                // @ts-ignore
                this.mediaRecorder = new MediaRecorder(this.stream);
                // @ts-ignore
                this.mediaRecorder.addEventListener("dataavailable",(event: BlobEvent) => {
                    this.audioChunks.push(event.data);
                });
                this.mediaRecorder.start();
                observer.next();
                observer.complete();
            },(error: DOMException) => {
                this.recording = false;
                observer.error(error.message);
                observer.complete();
            });
        });
    }

    public stop(): Observable<IVoiceFile> {
        if (this.mediaRecorder.state === 'inactive') {
            return of(null);
        }
        return new Observable<IVoiceFile>(observer => {
            this.mediaRecorder.addEventListener("stop",() => {
                const audioBlob = new Blob(this.audioChunks,{ type: 'audio/mpeg' });
                const audioUrl = URL.createObjectURL(audioBlob);
                const audio = new Audio(audioUrl);
                this.stream.getTracks().forEach(track => track.stop());
                observer.next({ audioBlob,audioUrl });
                this.mediaRecorder = null;
                this.stream = null;
                this.recording = false;
                observer.complete();
            });
            this.mediaRecorder.stop();
        });
    }
}

我已经尝试更改音频格式(audio/ogg、audio/weba、audio/webm、audio/mp3、audio/aac、audio/acc),但没有成功。

有什么想法吗?

解决方法

在我看来,您的 dataavailable 处理程序的调用频率不够高。

尝试在 .start() 中使用时间间隔,就像这样。每 500 毫秒 500 次请求调用。

 this.mediaRecorder.start(500);

并确保您的 dataavaiable 处理程序被重复调用。它可能不会每半秒被调用一次,但应该多次调用。

然后,调用 this

this.mediaRecorder.requestData();

就在您停止录制之前,确保您获得最后一块录制的数据。

话虽如此,Safari 对媒体内容的实现落后于 Chrome。

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