当前位置: 首页 > 知识库问答 >
问题:

PCM Web音频Api Javascript-我正在得到失真的声音

孟成化
2023-03-14

我正在通过电线接收一个交错的16位PCM样本。每个样本都有签名

我把它读作Int16bit数组,让我们调用这个all_data。因此每个数组条目都是一个16位的样本。

因为它是交错的,所以我将它提取成2个通道,R-L-R-L,最后得到2个(16位)数组,大小是ALL_DATA数组的一半。

之后,我查看每个示例,并将其规范化为Float32Array,因为这是web audio API所使用的。

var NormalizedSample=(sample>0)?样本/32768:样本/-32768;

这样做对吗。

我听到了扭曲的声音。你能看出是怎么回事。所以从字面上看,如果你听的是古典吉他,听起来就像是有失真的电吉他。

为了参数起见,我把示例代码放了下来,但这段代码处理

单声道,使示例更简单,所以我们也不必交错

var startTime = 0;
     var fileReader = new FileReader();
     fileReader.onload = function (e) {
                        var data = new DataView(e.target.result);

                    var audio = new Int16Array(data.byteLength / Int16Array.BYTES_PER_ELEMENT);
                    var len = audio.length;
                    for (var jj = 0; jj < len; ++jj) {
                        audio[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true);
                    }

                    var right = new Float32Array(audio.length);

                    var channleCounter = 0;
                    for (var i = 0; i < audio.length; ) {
                        var normalizedRight = (audio[i] > 0) ? audio[i] / 32768 : audio[i] / -32768;

                        i = i + 1;
                        right[channleCounter] = normalizedRight;

                        channleCounter++;
                    }






                    var source = audioContext.createBufferSource();


                    var audioBuffer = audioContext.createBuffer(1, right.length, 44100);
                    audioBuffer.getChannelData(0).set(right);


                    source.buffer = audioBuffer;


                    source.connect(audioContext.destination);

                    source.noteOn(startTime);
                    startTime += audioBuffer.duration;

                };

任何可能导致声音失真的建议都将有所帮助。我写了pcm数据之前,我把它在服务器端发送到一个文件是好的,声音是完美的。

共有1个答案

平嘉熙
2023-03-14

而不是说

var normalizedSample= (sample > 0) ? sample / 32768 : sample / -32768;

试试看

var normalizedSample= sample / 32768;

当前编写的计算将以类似于全波整流器的方式反转波形的负部分(样本始终为正数)。

 类似资料:
  • 我不得不插入一个预先存在的软件,管理ASIO音频流,一个简单的VST主机。尽管缺少一些留档,我还是设法做到了,但是一旦我加载插件,我就会得到一个严重失真的音频信号。 我使用的VST工作正常(与其他VST主机一起),所以这可能是我编写的代码中的某种缺陷,但是当我从插件中禁用“进程”时(我的流通过插件,它根本没有得到处理),它会在我发送时返回,没有任何噪音或失真。 我稍微关心的一件事是ASIO驱动程序

  • 我正在用ffmpeg从flac文件制作mp3。这对我来说通常是哼哼。 今晚,由于某种原因,当我使用我一直使用的相同命令时,转换后的音频会失真。_故障排除后,出现“采样率”标志。 我的命令: MP3中的音频然后被一个顶起的增益所扭曲,导致数字剪辑。 我尝试更新ffmpeg,然后问题仍然存在。我尝试过转换各种采样率(44.1k源文件,48k源文件,96k源文件)44.1k和48kmp3,问题仍然存在,

  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。

  • 我有一个arraylist,其中添加了以下数字。 然后我使用下面的代码遍历列表并在打印前求和。 它正在打印出一个值6。有人知道发生了什么吗?或者有人能解释我在这里做错了什么吗?感谢您的时间,如果有什么我可以补充澄清的,请不要犹豫。

  • 我正在使用OpenSL ES播放音频剪辑。在我的代码中,我有 在插入耳机时强制音频通过扬声器。它工作正常,但我无法控制音量。在播放剪辑时按下音量按钮会使音量搜索栏出现并移动,但音量不会改变。播放前调用或似乎没有帮助。更改我的应用程序之外的任何音量(例如在Android设置中)不会影响播放音量。当没有应用路由时,音量控制在耳机和扬声器上都可以正常工作。 我还尝试使用在另一个答案中找到的代码将音频发送

  • 有人能帮我解决这个错误吗?我的应用程序运行正常,但当点击活动按钮,它崩溃,出现此错误logcat。总之,我的. so文件在jniLibs文件夹中。 12-26 12:02:12.393 22612-22612/com.project.voicechangerE/AndroidRuntime: FATAL EXCEPTION:主进程:com.project.voicechanger, PID: 22