使用gstreamer进行低延迟音频捕获

5

我需要在Linux上使用gstreamer进行(几乎)实时音频捕获。我的问题是,我无法将延迟降低到低于约210ms。我尝试了从麦克风到耳机的简单回路:

gst-launch-1.0 pulsesrc ! alsasink
gst-launch-1.0 alsasrc ! alsasink

两者都产生了相同的延迟。 alsasrclatency-time 属性没有起到帮助作用(它只是添加了给定的延迟)。我可以使用...来达到我需要的效果。
pactl load-module module-loopback latency_msec=1

但我无法确定是否可以为gstreamerpulsesrc插件设置设备延迟。我猜想,如果可能的话,应该向stream-properties添加一些内容,但是我不知道应该添加什么(我在这里搜索)以及如何添加。

是否可以为任何gstreamer源设置此设备延迟?如果可以,如何设置?


一些音频库(jack)在安装过程中提供实时选项...你看到这样的选项了吗?它不是默认选项,因为它会将优先级转移到音频处理上,从而损害非音频进程。 - Scott Stensland
1
也许您想在ALSA层面测试延迟,并查看这是否更多是一个ALSA问题,而不是GStreamer的问题?http://www.alsa-project.org/main/index.php/Test_latency.c - mpr
我还看到alsasrc上有一个buffer-time属性,你可能想尝试一下。默认值为200000微秒,这看起来非常像你所看到的延迟时间。 - mpr
2
我相信系统能够实现低延迟工作,因为 pactl 已经可以工作了,而且 alsa 延迟测试程序也报告了大约 2 毫秒的延迟。但是无论是设置 buffer-time(我之前也找到过它),还是 latency-time 的 alsasrc 属性都没有产生预期的效果。(使用低 buffer-time 时,回环声音开始出现故障,而 latency-time 可以增加但不能减少延迟。) - gertom
看起来GStreamer有太多的延迟。我实际上确认了脉冲音频有1毫秒的延迟,但是GStreamer提供的最佳延迟是100毫秒。 - Pazel1374
2个回答

2

使用pulsesink代替alsasink可能会解决问题。请尝试以下步骤:

gst-launch-1.0 -v alsasrc buffer-time=35000 !  pulsesink

0
关于网络零延迟的最接近实现是大约20毫秒。此示例生成与会话描述协议中最大ptime为20的VoIP呼叫相同的RTP流。第一个管道是扬声器,第二个管道是听众。我尚未测试过更低的延迟或到本地sink pad的情况,但该设置确实存在以满足您的需求。

扬声器

gst-launch alsasrc name=mic provide-clock=true actual-buffer-time=20000 do-timestamp=true buffer-time=20000 \
mic. \
! alawenc \
! rtppcmapay max-ptime=20000000 \
! udpsink host=192.168.1.2 port=5000

监听器

gst-launch udpsrc port=5000 caps="application/x-rtp, media=(string)audio, clock-rate=(int)8000, encoding-name=(string)PCMA" \
! rtppcmadepay \
! audio/x-alaw, rate=8000, channels=1 \
! alawdec \
! alsasink buffer-time=80000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接