【问题标题】:Capture playback on play-only sound card with ALSA使用 ALSA 在仅播放声卡上捕获回放
【发布时间】:2012-10-20 00:18:46
【问题描述】:

我的 hw:1,0 是仅用于播放的外部 USB 卡。如果记录应用程序尝试打开 hw:1,0 进行捕获,则无法捕获发送到 hw:1,0 的样本。 alsamixer 没有为 hw:1,0 提供任何“[Capture]”选项 - 在“[Playback]”选项卡上只有一个音量控制。

是否可以创建一些虚拟“xxx”设备来接受来自播放应用程序的流并通过 2 个流(副本)将其发送出去 - 第一个流到真正的“hw:1,0”(到我的耳机)和第二个到另一个提供捕获能力的虚拟设备“zzz”,将流馈送到可以打开“zzz”进行捕获的应用程序?

更新

我在内核中添加了 ALSA 环回设备,现在我有了环回设备。然后我发现工作 .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
    }
}

【问题讨论】:

    标签: linux audio audio-recording alsa


    【解决方案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
        ]
    }
    

    【讨论】:

    • ALSA lib conf.c:1686:(snd_config_load1) toplevel:4:9:Unexpected char ALSA lib conf.c:3406:(config_file_open) /home/xx/ .asoundrc 可能是旧的或损坏的:考虑删除或修复它
    • 糟糕,plug 后面有一个多余的大括号。
    • 谢谢!现在我正在努力解决 ffmpeg 中的同步问题 :)
    • ALSA 很难 :) 它可以工作,但与视频非常不同步。这也取决于您开始录制和播放应用程序的顺序。您必须从开始播放应用程序开始,然后开始录制应用程序。反之亦然。
    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 2021-09-06
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多