问题标签 [jack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
114 浏览

architecture - 效果处理器:关于软件架构、编程语言选择、​​API 的思考

我目前正在做一个项目,其中一个主要元素是一个可以实时进行信号处理的软件。

基本思想/概念如下。音频数据从 (USB) 音频接口(以 96 kHz,24 位运行)连续捕获。然后通过“处理链”(如“虚拟效果链”)运行,其中每个元素都可以对数据执行任意处理。数据从一个元素传递到下一个元素,直到它到达接收器。流入接收器的数据被发送回音频接口进行输出。

信号链由实现某种“处理”方法的“对象”组成,该方法适用于 1920 个样本(20 毫秒)大小的数据块(尽管可能会更改此数字)。

“伪代码”中的基本思想。

第一个原型已经在 Python 中实现,它使用 ALSA API 进行音频 I/O。三个单独的线程被启动。

第一个是不断从 ALSA 读取数据(这是一个阻塞操作)并将数据放入队列中,然后继续读取下一个块。(ALSA 要求我至少每 20 毫秒“读取(...)”一次,所以我需要一个非常轻量级的线程,它只做读取和存储数据,所以我可以满足我的时间限制。)

第二个从这个队列的输入中读取样本,将它们通过信号链,最后进入另一个队列进行输出。

第三个线程从这个输出队列中读取(这是一个阻塞操作)并将这些块写到 ALSA。

我在这里基本上有两个“数字”变量,一个是块大小,另一个是我什至开始处理之前“预先发布”到输出队列的块数,这给了我一些时间来“提供更多样本” " 没有输出缓冲区欠载。此外,我可以决定在单独的线程或单独的进程中执行这些操作。

经过一些认真的调试(包括使用信号发生器和示波器!),我终于让这种方法运行起来了。最大的问题是 ALSA API 中的一个错误,即“period_size”,它被指定为“读/写的帧数”,看起来实际上是读取的帧数,但字节数书面。当我为输入和输出都指定 1920(96 kHz 采样率下 20 毫秒的音频)时,我只得到 1/4 的输出,然后是 3/4 的静音,然后是 1/4 的输出。当我为输入和输出都指定 1920 * 4 = 7680 时,我收到一个错误,即设备的缓冲区不够大,无法读取这么多帧。当我为输入指定 1920 并为输出指定 7680 时,它工作得很好(而且我的队列也不会“溢出”)。

解决了这个问题后,我还有一个严重的问题,那就是:延迟!

我基本上开始整个项目是为了创建自己的效果,所以我希望这个软件可以作为舞台/现场使用的效果单元。我已经读过,当两个事件相隔不到 30 毫秒时,例如,两个频闪灯相隔 30 毫秒发射,人脑不再能分辨出哪个是第一个,哪个是第二个。因此,30 毫秒或更短的延迟基本上会被视为“即时”。这是事件“合并”并被视为“一个”的阈值。如果延迟那么低,您将无法分辨哪个事件是第一个,例如,吉他手无法分辨是他敲击琴弦然后声音来自 PA,还是声音来自 PA 然后他敲击字符串,所以它基本上感觉就像“零延迟”,因此就像一个真正的放大器。

现在我目前得出的延迟是……嗯……我还没有机会精确测量它们,但它大约是十分之一秒,比如 200 或 300 毫秒。太过分了!我为 I/O 尝试了单独的线程和进程(因为在 Python 中,由于“全局解释器锁”,你永远不知道线程是否真的会更快)并且进程明显变慢,这是可以预料的,因为与进程间通信相关的开销以及两个 I/O 进程不执行任何“密集”操作的事实。他们只是等待阻塞操作并执行快速 I/O。

作为另一句话,我想说我希望我的应用程序托管一个 Web 服务器(当然在一个单独的线程甚至进程中),以允许用户配置信号路径并调整效果“设备”中的参数一种直观的方式。

所以很明显我需要降低延迟!我现在有几条路要走。

  1. 我的第一个想法是用JACK代替ALSA,据说是“低延迟”。缺点是我无法控制 ADC/DAC 的确切电平(JACK 总是使用浮点数,无论硬件做什么,浮点数都已经缩放到 [-1.0, 1.0])和过采样率(就我而言知道,JACK “规定”了一个采样率——我不能再选择了——使用 ALSA,我可以选择一个我想要使用的采样率,如果硬件偏离该采样率,它会透明地对我进行上采样/下采样),即阻塞我/O(我发现一个非常好的范例)被回调机制取代,而且时间限制可能更难满足。(我不能用 JACK 自己“缓冲”。它总是需要在一定时间内完成处理。)另外,一般来说,JACK API 似乎比 ALSA API 更复杂。我可能可以用 JACK 替换 ALSA,但我不确定我能“赢”多少,因为 ALSA 已经是一个非常“低级”的 API,而且 JACK 是在此基础上构建的,但可能以一种非常特定的方式使用来保持延迟低。老实说,我不确定到底有多少延迟是由于 ALSA 和“低于”以及有多少是由于“更高层”。

  2. 我目前使用一种解释的、垃圾收集的语言。这对实时要求不利。但是有什么替代方案?好吧,当考虑实时应用程序时,当然会想到 C,但它也有严重的缺点。

2.1 - 我希望软件具有基于 Web 的 UI。在 Python 中创建 Web 服务器很简单。Python 标准库中有一个类。用 C 语言创建 Web 服务器是一件痛苦的事情。C 中基本上没有任何东西可以做“web”。我必须从头开始,只基于套接字 API。祝你好运!:-(

2.2 - Python 支持数字。它具有 numpy 和 scipy,因此具有矢量数据类型、矩阵乘法、快速傅立叶变换、快速卷积、插值(样条等)。这对于手头的问题非常有用。在 C 中,我失去了所有这些,这意味着我要么必须在没有的情况下完成工作,这不太可能,要么我必须在 C 中自己重新创建所有这些,这既费时又出错-易于。

2.3 - Python 对多处理和多线程具有“高级”支持。我可以通过同步队列在进程和线程之间进行通信,以“线程池/复制的工作人员”风格的方式实现我的解决方案,这是解决手头问题的一个非常有用的范例。在 C 语言中,我将不得不求助于 POSIX 线程和低级同步原语,如 mutice。(“互斥体”的复数形式是正确的吗?就像在“Unix”->“Unices”中一样?)同样,这既费时又容易出错。

关于使用哪种语言有什么建议吗?我熟悉的语言包括 Python、C-Sharp、Java、C、Go、一点点C++(我从不需要那种语言——要么是低级的,然后我使用 C,要么是高级的,然后我使用垃圾收集、解释器或字节码编译的语言),以及一些 Web 技术(尤其是带有 AJAX 的 JavaScript 等,这在 UI 方面会很有用)。

所有这些都必须在 Linux 发行版下运行,最好使用尽可能少的依赖项/库。因此,“标准”库优于“外来”库。平台独立性,尤其是在 Windows 下运行的能力,是一个加分项,但不是严格的要求。

我同意 UI 以不同的语言实现(想到 Web 服务器)而不是实际处理(如果需要实时处理,可能“必须用 C 语言完成”?),不过这带来了很多额外的复杂性,因为两者都将在单独的进程中运行并通过例如 Unix 域套接字进行通信,这需要所有数据来回传递以表示为字节流(因为这都是套接字传输),因此需要设计一种进程间通信协议,并在这一层进行大量解析。有没有机会避免这种巨大的开销并用一种语言来完成?

还有其他想法吗?具体来说,从 ALSA 到 JACK 我会有所收获吗?还有其他我还没有考虑过的替代方案,可能更适合这项任务吗?

非常感谢您的时间!

0 投票
2 回答
2109 浏览

linux - PortAudio 不可靠:表达式“...”失败

我目前正在试验实时信号处理,所以我去尝试了 PortAudio(来自 C)。

我的电脑上有两个音频接口,板载声音(Intel HD Audio)和一个 USB 音频接口。两者通常在 Linux 上的 ALSA 下都能正常工作。我还尝试了 Linux 上 JACK 下的 USB 音频接口,这也很完美。

我所做的:

我的代码只是初始化 PortAudio,打开并启动一个流(一个通道,paInt32样本格式,defaultLowInputLatency/ defaultLowOutputLatency,尽管我尝试更改为paFloat32or defaultHighInputLatency/ defaultHighOutputLatency,但没有任何改进)。

sizeof(int32_t) * frameCount每次调用回调时,它都会将字节memcpy从输入复制到输出缓冲区,然后返回paContinue。它在回调中什么也不做。没有内存分配,没有系统调用,没有任何东西可以阻塞。它只是输出它读取的内容。代码很简单,但我仍然无法运行它。

memcpy用循环将frameCount类型的元素从输入复制到输出缓冲区替换int32_t并没有改变任何东西。

我试过的:

使用 PortAudio 尝试了以下场景。

  1. 通过 USB 音频接口输入和输出,PortAudio 上的回调机制,ALSA 后端。
  2. 通过 USB 音频接口输入和输出,在具有 1024 个样本缓冲区大小的 PortAudio 上阻塞 I/O,ALSA 后端。
  3. 通过 USB 音频接口输入,通过板载声音输出,PortAudio 上的回调机制,ALSA 后端。
  4. 通过 USB 音频接口输入,通过板载声音输出,在具有 1024 个样本缓冲区大小的 PortAudio 上阻塞 I/O,ALSA 后端。
  5. 通过 USB 音频接口输入和输出,PortAudio 上的回调机制,JACK 后端。
  6. 通过 USB 音频接口输入和输出,在具有 1024 个样本缓冲区大小的 PortAudio 上阻塞 I/O,JACK 后端。

我遇到的问题:

结果如下。(数字代表上述场景。)

  1. 设备无输出。
  2. 设备输出不稳定(中断)。一直有很多缓冲区不足。
  3. 设备无输出。
  4. 设备的输出不可靠。有时有效,有时无效。(无需更改任何内容,只需多次运行可执行文件。)当它工作时,延迟开始时很低,但随着时间的推移会增加并且变得非常明显。
  5. 设备无输出。
  6. 设备无输出。

在每次尝试之间,如果 ALSA 仍然响应,它会被测试(有时它会完全“锁定”,因此没有应用程序可以再输出声音)并重新启动系统以防 ALSA 被“锁定”,然后继续测试。

更多详细信息,在跟踪问题时可能很有用:

在根本没有输出的情况下,我在使用 ALSA 作为后端时收到以下错误消息。

使用 JACK 作为后端时,我收到以下错误消息。

此外,无论我使用什么方法,我总是会收到这些警告。

在使用 ALSA 时,我还会收到一两个关于欠载的投诉。

我调用的 PortAudio 函数(按此顺序Pa_Initialize, Pa_OpenStream, Pa_StartStream, Pa_StopStream, Pa_CloseStream, Pa_Terminate, )都返回paNoError.

PortAudio 附带的paex_read_write_wire.c(阻塞 I/O)示例通常可以访问设备,但也会遇到很多欠载(例如我的测试用例 2)。

在任何一种情况下,都没有什么有趣的东西出现在dmesg. (刚刚检查过,因为 ALSA 有一个内核级组件。)

我的问题:

任何人都知道这里有什么问题以及我该如何解决?或者至少,我怎么能把它缩小一点?

0 投票
1 回答
293 浏览

ffmpeg - 如何在 MAC OS 上使用带有 Jack Audio Connection Kit 的 Wowza 媒体服务器作为输入?

我需要从混音软件 StudioOne 中直播多个 RTSP 流。为此,我使用 Jack Audio Connection Kit 作为连接器。我已经尝试过将 IceCast 与 Darkice 一起使用,但延迟时间长达 6 秒以上,这对我正在从事的项目不起作用。这就是为什么我使用的是执行 RTSP 流而不是 HTTP 的 Wowza 媒体服务器。

这就是我卡住的地方,因为我需要某种方法在 MAC OS 机器上将流从 Jack Audio 获取到 Wowza。我尝试过使用 FFMpeg,但 FFMpeg 没有在其 OSX 版本上从 Jack Audio 获取输入的功能。我可以尝试将我的整个设置移植到 Ubuntu 上,但混音软件 StudioOne 在 Ubuntu 上不可用。我可以尝试使用 Wine 将 StudioOne 移植到 Linux,但我不确定将实时混音器用作端口是否是个好主意,尤其是在涉及延迟时。

有没有其他方法可以从我的 MAC 上的 Jack Audio 获取输入到 Wowza 媒体服务器?

0 投票
0 回答
247 浏览

audio - Ubuntu 14.04 中的 Jack2 内部音频路由

我正在尝试在 Ubuntu 14.04 中完成以下任务。

我已经安装了 SIP 客户端 Linphone,并希望将其音频连接到在浏览器(例如 Firefox)中运行的 Adob​​e Connect。所以我需要的是双向沟通,这样:

Linphone 音频输出 --> Adob​​e Connect 音频输入

Adobe Connect 音频输出 --> Linphone 音频输入

我知道 Jack2 ( http://jackaudio.org/ ) 应该能够在不同的应用程序之间路由音频。我想我在这里要做的就是配置它,使来自 Firefox 的所有音频都路由到 Linphone 的输入,而来自 Linphone 的所有音频都路由到 Firefox 的输入。

我用 QjackCtl 成功安装了 Jack2,但我无法配置它。当转到“连接-> 音频”时,我希望能够在各种正在运行的应用程序之间进行选择,以便重新路由音频。相反,我能做的只是将麦克风的输入连接到我的任何一个扬声器。

在这里遵循的正确工作流程是什么?我是否必须配置一些虚拟麦克风/扬声器才能使其工作?如果是这样,怎么做?

任何帮助将不胜感激。

0 投票
1 回答
1827 浏览

audio - 无法让 JACK 音频/网络插孔通过 LAN 工作

我正在尝试在 2 个树莓派之间传输低延迟音频。gstreamer 和 ffmpeg 都对我造成了 2 秒以上的延迟。

我在本地玩过 Jack Audio,在单个 pi 上似乎很有希望。我可以在本地将麦克风输入路由到扬声器,这几乎是瞬时的。

但是,我一直无法使用 Netjack 在设备之间进行路由。

我从这里提取的大多数启动选项http://wiki.linuxaudio.org/wiki/raspberrypi#using_jack。老实说,我真的不知道他们在做什么。

客户端 jackd 输出显示如下消息

服务器 jack_netsource 输出看起来像

服务器jackd输出看起来像

我相信-dnetone标志表明使用 Netjack2。Netjack 1,我已经尝试使用该-dnet标志导致Not Connected来自 jack_netsource 的一条消息,并且:

从客户端jackd。

0 投票
1 回答
1155 浏览

android - 如何在 android studio 中添加 *.jack?

在android M中,android支持jack,我编译了这个库,它是3d.jack而不是3d.jar。

我的问题是如何添加 3d.jack 作为库来构建我的应用程序,它依赖于 3d 库。

如果库是 3d.jar,我知道如何添加库。但是我尝试使用相同的方法,将 3d.jack 复制到 libs 文件夹中,然后更改为 *.jack,它不起作用。

所以有人知道怎么做吗?

0 投票
0 回答
239 浏览

linux - 使用脉冲音频共享音频流

我有一个应用程序读取和写入音频到 USB 音频接口(FreeSWITCH 的 mod_portaudio)。

我需要能够在另一个应用程序中监视此音频,但设备已锁定。据我了解,pulseaudio 应该为我做这件事。(我也试过杰克,但都没有成功!)。

所以我安装了pulseaudio,果然FreeSWITCH现在只能看到pulse,看不到USB接口。

我缺少哪些步骤,或者我现在需要做什么?我已经尝试创建一个虚拟接收器和源,认为它应该出现在 FreeSWITCH 上,然后我应该能够以某种方式映射它,但我无处可去!实现这一目标的最佳方法是什么?

0 投票
1 回答
1633 浏览

audio - 在处理中获取多个音频输入

我目前正在编写一个需要访问多个音频输入的处理草图,但处理只允许访问默认线路。我尝试直接从 Java 混音器(在处理中访问)获取线路,但我仍然只得到信号从我机器上当前设置为默认值的那一行开始。

我已经开始研究通过 OSC 从 SuperCollider 发送声音,正如这里推荐的那样。但是,由于我对 SuperCollider 非常陌生,并且他们的文档和支持更侧重于生成声音而不是访问输入,因此我的下一步可能是按照此处的建议与 Beads 和 Jack 一起玩。

有没有人有 (1) 其他建议,或 (2) 从 SuperCollider 或 Beads/Jack 获取多个输入到处理的具体示例?

先感谢您!

编辑:声音将用于为自定义音乐可视化提供动力(想想 iTunes 可视化器,但更具体的是歌曲)。我们可以处理多个 mp3;现在我需要的是能够从每个麦克风中获取一个 float[] 缓冲区。希望有 9 个不同的麦克风,但如果更可行的话,我们会选择 4 个。

对于硬件,此时,我们只使用麦克风和 XLR 转 USB 电缆。(考虑过前置放大器,但到目前为止这已经足够了。)我目前在 Windows 上,但我认为我们最终会切换到 Mac。

这是我对 Beads 的尝试(它适用于笔记本电脑,因为我先做一个,但耳机缓冲区全为 0;如果我切换它们并首先放置耳机,耳机缓冲区将是正确的,但笔记本电脑将包含所有 0):

我添加 Jack 的尝试包含这一行:

但我得到了错误:

当我在 Jack 中时,我看不到我的麦克风(这对我来说似乎是一个巨大的危险信号,尽管我对 Jack 完全陌生)。这个 AudioContext 是否应该在 Jack 中显示为输入?反之亦然——先在那儿找到我的麦克风,然后从 Jack 那里拿到它到 Processing?

(请原谅我的经验不足,再次感谢您!我对 Jack 的了解不足让我想知道是否应该重新访问 SuperCollider...)

0 投票
1 回答
2291 浏览

audio - Docker:JACK 服务器未运行

我正在运行大量带有 ROS 的 docker 容器,用于控制机器人。其中一个容器必须通过sound_play包播放一些音频文件。但是它返回错误

我能够aplay从容器内获取音频(.wav)文件,我的声卡肯定被识别,我也尝试过在特权模式下运行容器。我也尝试jackd在容器中单独安装并启动千斤顶服务器,但出现错误

我对问题的理解是否正确?如果是这样,我怎样才能让杰克服务器在容器内启动?

0 投票
1 回答
83 浏览

rust - 长度超过 4 个字符的 Jack 音频客户端名称会中断客户端

尝试使用 Rust(文档)中的 JACK-AUDIO-CONNECTION-KIT,我遇到了调用问题

在 Rust 中我使用

完整代码

当我使用name带有四个字符的 a 时,它可以工作,例如

但如果我使用 5 个或更多字符,它就不起作用。在上面链接的 JACK 文档中,它说名称最多可以是int jack_client_name_size()字符长,在我的例子中是 64。为什么会这样?