- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
总而言之,我的问题是:是否可以同时解码和播放 15 条有损压缩的音轨,且延迟低于 50 毫秒且没有卡顿现象?
我正在用纯 C 为我正在创建的游戏编写一个声音库。我希望同时播放多达 15 条音轨且延迟时间小于 50 毫秒。
截至目前,该库能够播放原始 PCM 文件(48000Hz 打包的 16 位样本),并且可以轻松地以 45 毫秒的延迟同时播放 15 种声音,而不会卡顿,并且 CPU 使用率最低。这是在我相对较旧的 Intel Q9300 + SSD 机器上。
尽管原始音频文件很大,但我扩充了我的库以支持使用 opusfile (https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/index.html) 播放 OPUS 文件。我希望我仍然能够同时播放 15 种声音,而音频文件不会占用 200MB 以上的空间。我错了——我一次只能播放 3 或 4 首 OPUS 轨道,然后才能听到卡顿和其他缓冲区不足的症状。与原始 PCM 播放相比,CPU 使用率也大幅增加。
我还尝试使用 vorbisfile ( http://www.xiph.org/vorbis/doc/vorbisfile/ ) 包括 VORBIS 支持。我认为也许即时解码 VORBIS 不会占用大量 CPU。 VORBIS 比 OPUS 好一点——我可以一次播放 5 或 6 个声音,然后才能听到卡顿(我想 VORBIS 确实更容易解码)——但这仍然远不及播放原始 PCM 文件。
在深入研究低级 libvorbis/libopus API 并研究其他音频压缩格式之前,同时解码和播放 15 条有损压缩音轨且延迟低于 50 毫秒和在中低端台式机上不卡顿?
如果有帮助,我的声音库目前大约每 15 毫秒调用一个函数,它基本上执行以下操作(为清楚起见,省略了错误处理和后处理):
void onBufferUpdateNeeded(int numSounds, struct Sound *sounds,
uint16_t *bufferToUpdate, int numSamplesNeeded, uint16_t *tmpBuffer) {
int i, j;
memset(bufferToUpdate, 0, numSamplesNeeded * sizeof(uint16_t));
for (i = 0; i < numSounds; ++i) {
/* Seek to the specified sample number in the already-opened
file handle. The implementation of this depends on the file
type (vorbis, opus, raw PCM). */
seekToSample(sounds[i].fileHandle, sounds[i].currentSample);
/* Read numSamplesNeeded samples from the file handle into
tmpBuffer. */
readSamples(tmpBuffer, sounds[i].fileHandle, numSamplesNeeded);
/* Add the samples into the buffer. */
for (j = 0; j < numSamplesNeeded; ++j) {
bufferToUpdate[j] += tmpBuffer[j];
}
}
}
在此先感谢您的帮助!
最佳答案
听起来您已经知道自己问题的答案:否。通常,对于此类问题(尤其是与性能相关的查询),我唯一的建议是尝试并找到如果可能的话。但是您已经收集了这些数据。
的确,感知/有损音频编解码器往往需要大量计算才能解码。听起来您想避免原始 PCM 的存储开销。在这种情况下,如果您可以安全地假设您将为您的应用程序保留足够的内存,您可以提前解码音频流,或使用一些缓存机制来处理内存限制。也许这可以卸载到不同的线程(因为你的问题中提到的 Q9300 CPU 是双核的)。
否则,您将需要寻找计算要求较低的压缩器。您可能对 FLAC 感兴趣, 由与 Vorbis 和 Opus 相同的组织赞助。它是无损的,因此它不会像有损算法那样压缩得很好,但它的解码速度应该快得多。
如果仍然不合适,请浏览 this big list of ~150 audio codecs直到找到符合您标准的产品。由于您控制客户端软件,因此您有很多选择(与流式传输到 Web 浏览器相比)。
关于c - 以 <50 毫秒的延迟一次播放 15 个音轨?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31992428/
我做了一个项目,使用两个不同的textview进行触摸来播放两个音频。 这是一个文本 View 的简单代码 tv.setOnTouchListener(new OnTouchListener() {
我正在使用 pygame 模块在 python 中操作声音文件。它在交互式 python session 中工作正常,但相同的代码在 bash 中不会产生任何结果: 交互式Python $ sudo
请注意它只能是 JavaScript。请参阅下面我当前的 HTML。我需要像当前代码一样在页面之间旋转。但是,我需要能够在页面之间暂停/播放。
我有一个带有一堆音频链接的html。我正在尝试使所有音频链接都在单击时播放/暂停,并且尝试了here解决方案。这正是我所追求的,只是我现在不得不修改此功能以应用于代码中的所有音频链接(因为我不能为每个
在尝试进入我的代码中的下一个文件之前,我尝试随机播放.wav文件数毫秒。最好的方法是什么? 我目前有以下代码: #!/usr/bin/env python from random import ran
我有2个回调函数,一个播放音频,另一个停止音频。 function Play_Callback(hObject, eventdata, handles) global path; global pla
我有一个电台应用程序,并与carplay集成。在Carplay仪表板中,我仅看到专辑封面图像和停止按钮。我想在仪表板上显示播放/暂停和跳过按钮。如果您对该站有任何了解,可以帮我吗? 最佳答案 您需要使
我正在使用 ffmpeg 创建一个非常基本的视频播放器。库,我有所有的解码和重新编码,但我坚持音频视频同步。 我的问题是,电影有音频和视频流混合(交织),音频和视频以“突发”(多个音频包,然后是并列的
我不知道我在做什么错 $(document).ready(function() { var playing = false; var audioElement = document.
我正在尝试通过(input:file)Elem加载本地音频文件,当我将其作为对象传递给音频构造函数Audio()时,它不会加载/播放。 文件对象参数和方法: lastModified: 1586969
在 Qt 中创建播放/暂停按钮的最佳方法是什么?我应该创建一个操作并在单击时更改其图标,还是应该创建两个操作然后以某种方式在单击时隐藏一个操作?如何使用一个快捷键来激活这两个操作? (播放时暂停,暂停
我正在用 Python 和 SQLite 构建一个预订系统。 我有一个 Staff.db 和 Play.db (一对多关系)。这个想法是这样的:剧院的唯一工作人员可以通过指定开始日期和时间来选择何时添
我有一个服务于 AAC+ (HE v2) 的 Icecast 服务器。我在我的网页中使用 JPlayer 来播放内容。在没有 Flash Player 的 Chromium 中,它工作得很好。 对于支
当我运行我的方法时,我收到一个MediaException。我使用 playSound("src/assets/timeup.mp3"); 调用该方法。 private void playSound(
我有一项正在播放播客的服务。我希望该服务检测用户何时按下暂停或从他们的 BT radio 播放,以便我可以停止和启动它。对于我的生活,我无法弄清楚要向我的监听器添加什么过滤器(当我按下 BT 按钮时,
我对 Java 不是很在行,在研究网站上的音乐循环的简单播放/暂停按钮后,我得到了这段代码。它可以很好地离线测试,但在上传到 FTP 服务器后,它不会在任何浏览器中播放音频,我得到 SyntaxErr
我有一个使用 flickity carousel library 创建的视频轮播, 见过 here on codepen .我想要发生的是,当用户滑动轮播时,所选幻灯片停止播放,然后占据所选中间位置的
这是一个 JSFiddle: http://jsfiddle.net/8LczkwLz/19/ HTML: JS: var flashcardAudio = documen
我的问题是我无法将歌曲标题文本保持在 line-height: 800px;当用户播放或暂停播放器时。我设法在 :hover 上做到了。这似乎是一件非常棘手的事情,这真的是我第一次遇到 CSS 如此困
我还没有找到与我的完全一样的帖子,所以这就是问题所在。我正在制作一个 mp3 播放器,播放/暂停是两个单独的按钮。这是我的代码。 prevButton = document.getElementByI
我是一名优秀的程序员,十分优秀!