我正在运行大量带有 ROS 的 docker 容器,用于控制机器人。其中一个容器必须通过sound_play包播放一些音频文件。但是它返回错误
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
Run Code Online (Sandbox Code Playgroud)
我能够aplay从容器内部读取音频 (.wav) 文件,我的声卡肯定被识别,我还尝试在特权模式下运行容器。我也尝试jackd在容器中单独安装并启动一个jack服务器,但得到错误
Cannot lock down 82274202 byte memory area (Cannot allocate memory).
Bus error (core dumped)
Run Code Online (Sandbox Code Playgroud)
我对问题的理解是否正确?如果是这样,我怎样才能让 jack 服务器在容器内启动?
尝试使用Rust(文档)中的JACK-AUDIO-CONNECTION-KIT ,我遇到了调用问题
jack_client_t* jack_client_open ( const char * client_name,
jack_options_t options,
jack_status_t * status,
... )
Run Code Online (Sandbox Code Playgroud)
在Rust我用
#[link(name = "jack")]
extern "C" {
pub fn jack_client_open(name: *const libc::c_char,
options: JackOptions,
status: &JackStatus)
-> *mut JackClientT;
}
Run Code Online (Sandbox Code Playgroud)
(完整代码)
当我使用name带有四个字符时,它可以工作,例如
let name = CString::new("yass").unwrap().as_ptr();
Run Code Online (Sandbox Code Playgroud)
但如果我使用5个或更多字符,它就不起作用.在上面链接的JACK文档中,它表示名称最多可以是int jack_client_name_size()字符长,在我的情况下是64.为什么会这样?
我和杰克一起玩,我注意到默认音频类型JACK_DEFAULT_AUDIO_TYPE设置为"32位浮点单声道音频".
我有点困惑:IEEE定义32位C浮点范围大约从3.4E-38到3.4E + 38,我想知道jack_default_audio_sample_t该音频类型可以容纳的最大和最小"未失真"幅度是多少.例如,如果某些DSP算法给出了[0,1]范围内的样本,我怎样才能正确地在它们和Jack的格式之间进行转换?
有人知道如何使用插件编译器使用Android Annotations吗?
在这里我的app/build.gradle和这里我的项目build.gradle
使用此配置,我在构建项目时出现此错误消息:
Error:Could not get unknown property 'classpath' for task ':app:transformJackWithJackForDebug' of type com.android.build.gradle.internal.pipeline.TransformTask.
Run Code Online (Sandbox Code Playgroud) android gradle annotation-processing jack android-annotations
重要的是我的场景是开发一个可访问性应用程序而不是任何类型的恶意窃听,而在这个场景中还有各种研究和开发隐含场景,所有这些都应该从能够通过多个读取麦克风音频流中受益匪浅同时运行不相关的进程,例如记录工具和/或我自己的代码的不同版本。
我正在使用高级 python API 读取麦克风输入流,如下所示:
import sounddevice
audio_stream = sounddevice.InputStream(
device=self.microphone_device,
channels=max(self.channels),
samplerate=self.audio_props['sample_rate'],
blocksize=int(self.audio_props['frame_elements_size']),
callback=self.audio_callback)
Run Code Online (Sandbox Code Playgroud)
我想了解是否可以(在 linux 上)将麦克风音频流同时读取到另一个程序,例如 Google Meet / Zoom 读取它。即有效地共享音频流。
与前面提到的 python 包装器一样,当视频通话正在进行时启动上述代码时,它只会无法打开流,这不足为奇:
Expression 'paInvalidSampleRate' failed in
'src/hostapi/alsa/pa_linux_alsa.c', line: 2043
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )'
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2716
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )'
failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2837
Run Code Online (Sandbox Code Playgroud)
诚然,我还不是很精通 ALSA 术语和一般的 linux 上的声音堆栈。
我的问题是,这可以直接使用 ALSA 库 API 来完成,还是通过其他声音堆栈或声音系统配置来完成?或者,如果所有其他方法都不起作用,通过代理程序/驱动程序能够向多个消费者公开音频缓冲区,而不会导致音频流延迟明显下降?
我使用插孔在电脑中的多个声卡之间路由音频。为了录制音频,我使用了一个非常方便的 FFmpeg 命令,它创建了一个可写的插孔客户端:
ffmpeg -f jack -i <client_name> -strict -2 -y <output_file_name>。到目前为止,这效果很好。
问题从这里开始:
我还有一个 nginx docker,它记录我的数据并使其可用于流式传输。当尝试在 docker 中使用相同的命令时,我收到以下错误:"Unable to register as a JACK client"。
我开始查看FFmpeg代码,发现FFmpeg命令调用了jack_client_openjack API中的命令,失败了。
从 docker 内部的 FFmpeg 请求到主机上运行的 jackd 服务器之间的连接似乎存在某种问题。
有没有一种简单的方法可以在两个[暴露端口]之间创建连接?
(我看到了一些像netjack2这样的解决方案,但在创建更复杂的服务器客户端架构之前,我想找到一个更优雅的解决方案)。
谢谢您的帮助!