ALSA:以低延迟直接捕获回放音频的正确方法是什么?

问题描述

目标

在第一个 USB 声卡上录制音频,
同时在第二个声卡上以低延迟播放此音频。

平台:树莓派

行为

我尝试了很多方法(见下文),但我无法让它发挥作用。搜索 alsaloop 给出的结果很少或过时。什么是现代方法来做到这一点?为什么不能使用 libsamplerate 进行重采样?

方法

arecord -f dat -t raw -D hw:1,0 --buffer-size=256 | aplay -f dat -t raw -D hw:2,0 --buffer-size=256

一般情况下有效,但是:
当然,捕获率和播放率并非 100% 相同,因此一段时间后,延迟会增加

方法 2

alsaloop -C hw:2,0 -P hw:3,0

这会立即崩溃并显示 Bus error。 用gdb运行,​​显示这是libsamplerate在某处引起的,所以我尝试了另一种同步方法

方法 3

alsaloop -C hw:2,0 -S 1 -vvv

不会崩溃,但似乎建立了一个样本队列(延迟增加了很多),然后以噼啪声重置:

playback hw:3,0/capture hw:2,0 sync type: SIMPLE
New pitch for playback hw:3,0: 1.00000000 (min/max samples = 0/0)
underrun for playback hw:3,0
  last write before 3.9310ms,queued 8.1458ms/0.0000ms -> missing -4.2148ms
  expected 10.0000ms,processing 0.0860ms,max missing 0.0000ms
  last wake 3.3700ms,last check 3.3700ms,avail_min 5.9167ms
  max buf 40.0000ms,pfilled 0.0000ms,cfilled 1.0000ms
  job started before 0.0590ms
underrun for playback hw:3,0
  last write before 5.8360ms,queued 5.0000ms/2.0000ms -> missing 0.8360ms
  expected 10.0000ms,processing 1.2470ms,max missing 0.8360ms
  last wake 7.0660ms,last check 7.0660ms,cfilled 3.0000ms
  job started before 0.0640ms
New pitch for playback hw:3,0: 1.00001042 (min/max samples = 0/365)
New pitch for playback hw:3,0: 1.00002083 (min/max samples = 0/522)
New pitch for playback hw:3,0: 1.00003125 (min/max samples = 0/681)
New pitch for playback hw:3,0: 1.00004167 (min/max samples = 0/837)
New pitch for playback hw:3,0: 1.00005208 (min/max samples = 0/995)
New pitch for playback hw:3,0: 1.00006250 (min/max samples = 0/1152)
New pitch for playback hw:3,0: 1.00007292 (min/max samples = 0/1309)
New pitch for playback hw:3,0: 1.00008333 (min/max samples = 0/1466)
New pitch for playback hw:3,0: 1.00009375 (min/max samples = 0/1623)
New pitch for playback hw:3,0: 1.00010417 (min/max samples = 0/1920)
New pitch for playback hw:3,0: 1.00011458 (min/max samples = 0/2182)
New pitch for playback hw:3,0: 1.00012500 (min/max samples = 0/2493)
New pitch for playback hw:3,0: 1.00013542 (min/max samples = 0/2849)
[...]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...