WaveOut API 对当前播放的缓冲区大小是否有一些内部限制?我的意思是,如果我提供一个非常小的缓冲区,它会以某种方式影响扬声器播放的声音吗?当我用小缓冲区生成和播放正弦波时,我遇到了非常奇怪的噪音。类似峰值或“BUMP”的东西。
我编写了一个可以实时生成窦声音信号的程序。可变参数是频率和音量。项目要求最大延迟为 50 毫秒。因此,该程序必须能够实时产生可手动调节音频信号频率的正弦信号。
我使用 Windows WaveOut API、C# 和 P/invoke 来访问 API。
当声音缓冲区大小为 1000 毫秒时,一切正常。如果我根据延迟要求将缓冲区最小化到 50 毫秒,那么对于某些频率,我会在每个缓冲区末尾遇到噪音或“BUMP”。我不明白生成的声音是否格式错误(我检查过但没有),或者音频芯片发生了什么问题,或者初始化和播放过程中出现了一些延迟。
当我将生成的音频保存到 .wav 文件时,一切都很完美。
这意味着我的代码中一定存在一些错误,或者音频子系统对发送给它的缓冲区块有限制。
对于那些不知道 WaveOut 必须首先初始化,然后必须为每个缓冲区准备音频标头,其中包含需要播放的字节数以及指向包含需要播放的音频的内存的指针。成为玩家。
更新
以下组合出现噪声:44100 采样率、16 位、2 通道、50 ms 缓冲区,并生成 201Hz、202Hz、203Hz、204Hz、205Hz ... 219Hz、220Hz、240 Hz 的正弦音频信号,正常
为什么会相差20,我不知道。
我是 C++ 新手,正在通过 Andrew Koenig 和 Barbara E. Moo 的 Accelerated C++ 进行学习。
我无法理解 C++ 中缓冲区的概念,正如书中所说:“大多数系统都会花费大量时间将字符写入输出设备,无论要写入多少个字符。为了避免响应写入的开销对于每个输出请求,库使用缓冲区来累积要写入的字符,并仅在必要时通过将其内容写入输出设备来刷新缓冲区。通过这样做,它可以将多个输出操作合并为单个写入”。
为什么大多数系统需要花费大量时间将字符写入输出设备?这个缓冲区是什么?为什么我们需要它?为什么我们需要刷新缓冲区?
我正在使用继承自 QTextEdit 的 PyQt QTextBrowser 小部件。我将文本附加到它作为日志信息显示的一部分。记录可能会持续数周。
保存文本的缓冲区的深度是多少?以另一种方式问,我可以附加多少文本并且仍然让用户能够使用滚动条滚动回?
这个设置可以配置吗?它最终可以使用我系统的所有内存吗?
谢谢。
我在一个空目录中按如下方式启动 Vim。
vim -u NONE foo.txt
Run Code Online (Sandbox Code Playgroud)
然后我在 Vim 中输入以下命令。
:set ts=40
Run Code Online (Sandbox Code Playgroud)
现在,如果我按 Tab,光标确实会移动到第 41 列。
现在我在 Vim 中输入以下命令。
:e! bar.txt
Run Code Online (Sandbox Code Playgroud)
现在,如果我按 Tab 键并且光标再次移动到第 41 列。这让我很惊讶。我期待光标移动到第 9 列。
事实上,:help 'ts显示如下。
*'tabstop'* *'ts'*
'tabstop' 'ts' number (default 8)
local to buffer
Number of spaces that a <Tab> in the file counts for. Also see
|:retab| command, and 'softtabstop' option.
Run Code Online (Sandbox Code Playgroud)
帮助说ts选项是local to buffer. 为什么我ts=40在一个缓冲区中设置的选项会应用于另一个新缓冲区?
我目前有一个类型为“image/jpeg”的 blob,我需要将其转换为 base64 字符串。我所有的代码都在一个使用 Nodejs 的独立 javascript 文件中,并且没有与任何 html 文件连接。我研究过的将 blob 转换为 base64 的每种方法都涉及使用 FileReader 类,该类要求 javascript 位于 html 中,因此这是不可能的。我发现的唯一其他解决方法是使用这行代码将 blob 转换为缓冲区,然后转换为 base64。
base64 = new Buffer( blob, 'binary').toString('base64');Run Code Online (Sandbox Code Playgroud)
但这只会返回错误:第一个参数必须是字符串、Buffer、ArrayBuffer、Array 或类似数组的对象。
我很难过……有什么建议吗?
我已经按照本教程https://webauthn.guide/#registration
我正在使用 yubico nfc 密钥,我几乎设法注册了安全密钥。我从服务器发送一个随机字节挑战来注册密钥和其他数据。
当我注册密钥时,我设法解码了 clientDataJson 和身份验证响应以检索大量信息。但是,我不知道如何处理 credentialId 和 authData 缓冲区,我尝试对它们进行解码、解密,但我总是得到一些奇怪的数据,而没有任何看起来像 credentialId 或公钥的东西。
这是我到目前为止得到的代码
var createCredentialDefaultArgs = {
publicKey: {
// Relying Party (a.k.a. - Service):
rp: {
name: 'Dummy'
},
// User:
user: {
id: new Uint8Array(16),
name: 'John Doe',
displayName: 'Mr Doe'
},
pubKeyCredParams: [{
type: "public-key",
alg: -7
}],
attestation: "direct",
timeout: 60000,
challenge: new Uint8Array(/* stuff*/).buffer
}
};
$('[data-register-webauthn]')
.on('click', function () {
// register / create a new credential
navigator.credentials.create(createCredentialDefaultArgs)
.then((cred) => { …Run Code Online (Sandbox Code Playgroud) 我有一个通过网络发送并作为缓冲区到达我的服务器的字符串。它已格式化为我自己的自定义协议(理论上尚未实现)。我想将前 n 个字节用于标识协议的字符串。
我已经做好了:
data.toString('utf8');
Run Code Online (Sandbox Code Playgroud)
在整个缓冲区上,但这只是给了我整个数据包作为一个字符串,这不是我想要实现的。
收到消息后,如何将字节的子集转换为字符串?
提前致谢
假设我有一个缓冲区:
let b = Buffer.from('');
Run Code Online (Sandbox Code Playgroud)
我怎样才能附加到b?是创建新缓冲区的唯一方法吗?
b = Buffer.concat([b, z]);
Run Code Online (Sandbox Code Playgroud)
在同一主题上,有没有办法创建动态大小的缓冲区,还是应该改用 Array?
我Uint8List从适用于 Android 和 iOS 的记录器插件中获取。每当我在麦克风的流订阅中获取数据时,我都想将数据写入本地可播放音频文件中。有什么可能的方法来写入数据吗?
目前,我正在存储数据,如
recordedFile.writeAsBytesSync(recordedData, flush: true);
Run Code Online (Sandbox Code Playgroud)
它正在将数据写入文件,但无法从文件存储中播放。但是,如果我读取同一个文件并将它的字节提供给插件,它也会播放相同的缓冲区。
缓冲区实际上如何优化读/写过程?
每次我们读取一个字节时,我们都会访问该文件。我读到缓冲区减少了访问文件的次数。问题是如何?。在图片的缓冲部分,当我们从文件加载字节到缓冲区时,我们就像在图片的未缓冲部分一样访问文件,那么优化在哪里?
我的意思是......每次读取一个字节时,缓冲区都必须访问文件,所以即使缓冲区中的数据读取速度更快,这也不会提高读取过程中的性能。我错过了什么?