Tôi đang phát âm thanh trong ứng dụng bình của mình từ máy khách đến máy chủ, nhưng âm thanh nhận được có chất lượng rất thấp.Tại sao điều này làm giảm chất lượng âm thanh?
Trên client, tôi preprocess bộ đệm âm thanh như sau:
this.node.onaudioprocess = function(e){
var buf = e.inputBuffer.getChannelData(0);
var out = new Int16Array(buf.length);
for (var i = 0; i < buf.length; i++){
var s = Math.max(-1, Math.min(1, buf[i]));
out[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;
}
socket.emit('audio event',{data: out})
return;
}
Về phía server, tôi nhận được âm thanh như sau:
audio_file = open('tempfile.raw', 'w')
@socketio.on('audio event')
def audio_message(message):
dat = [v[1] for v in sorted(message['data'].iteritems())]
n = len(dat)
byteval = struct.pack('<'+str(n)+'h',*dat)
audio_file.write(byteval)
Nhưng âm thanh dẫn âm thanh kim loại, bị gián đoạn và ồn ào. Đây là cách các dạng sóng kết quả trông:
đâu trong mã của tôi là chất lượng âm thanh bị mất? Làm cách nào để phát trực tuyến âm thanh mà không bị mất chất lượng?
Loại chuyển đổi nào xảy ra trong buf.buffer? Điều đó có chuyển đổi float32array thành một bộ đệm nhị phân không? – user2212461
Không, thuộc tính 'buffer' trả về cấu trúc nhị phân cơ bản của mảng, không có bất kỳ chuyển đổi nào. Xem tài liệu về các mảng được nhập JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays. – Miguel