使用ALSA在仅播放声卡上捕获播放

时间:2012-10-20 00:18:47

标签: linux audio audio-recording alsa

我的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设备,现在我有了环回设备。然后我找到了工作.asoundrc(见下文),但是当我使用ffmpeg捕获屏幕+声音时,声音比视频更好,一些很好的同步问题。所以使用这个.asoundrc(下面)我可以使用hw:0,0(环回设备,hw:0,0 - play,hw:0,1 - capture)捕获我发送到“默认”的内容。我也可以通过我的外部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
    }
}

1 个答案:

答案 0 :(得分:1)

可以创建将回放数据重新路由回捕获设备的回送设备:
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
    ]
}