我的 hw:1,0 是一个只能播放的外部 USB 卡。如果记录应用程序尝试打开 hw:1,0 进行捕获,则它无法捕获发送到 hw:1,0 的样本。 alsamixer 没有为 hw:1,0 提供任何“[Capture]”选项 - 只有“[Playback]”选项卡上的一个音量控制。
是否可以创建一些虚拟的“xxx”设备来接受来自播放应用程序的流并通过 2 个流(副本)将其发送出去 - 第一个到真实的“hw:1,0”(到我的耳机)和第二个到另一个提供捕获能力的虚拟设备“zzz”,将流提供给可以打开“zzz”进行捕获的应用程序?
更新
我在内核中添加了 ALSA Loopback 设备,现在我有了 loopback 设备。然后我发现 .asoundrc 可以工作(见下文),但是当我使用 ffmpeg 捕获屏幕 + 声音时,声音比视频早得多,一些严重的同步问题。因此,通过这个 .asoundrc(如下),我可以使用 hw:0,0(环回设备,hw:0,0 - 播放,hw:0,1 - 捕获)来捕获我发送到“默认”的内容。我也可以通过我的外部 USB hw:2,0 听到这些样本。
ffmpeg 命令:
ffmpeg -f alsa -i hw:0,1 -f x11grab -s 854x480 -r 30 -i :0.0 -vcodec libx264 -vb 4000k /tmp/screen_854x480.avi
.asoundrc:
pcm.!default {
type plug
slave.pcm "mdev"
route_policy "duplicate"
}
pcm.mdev {
type multi
slaves.a.pcm "hw:Loopback,0,0"
slaves.a.channels 2
slaves.b.pcm "dmixer"
slaves.b.channels 2
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave b
bindings.2.channel 0
bindings.3.slave b
bindings.3.channel 1
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:2,0"
period_time 0
period_size 1024
buffer_size 4096
rate 44100
channels 2
format S16_LE
}
}
最佳答案
可以创建将回放数据重新路由回捕获设备的环回设备:
Alsa Loopback Devices for Fun, but not yet profit...
ALSA Loopback for Fun and Profit
也可以使用 multi plugin 创建一个输出到多个设备的虚拟设备.
尝试这样的事情:
pcm.xxx {
type plug # <-- no { here
slave.pcm {
type multi
slaves {
a { channels 2 pcm "hw:1,0" } # the real device
b { channels 2 pcm "hw:5,0" } # the loopback driver
}
bindings {
0 { slave a channel 0 }
1 { slave a channel 1 }
2 { slave b channel 0 }
3 { slave b channel 1 }
}
}
ttable [
[ 1 0 1 0 ] # left -> a.left, b.left
[ 0 1 0 1 ] # right -> a.right, b.right
]
}
关于linux - 使用 ALSA 在只播放声卡上捕获播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984089/