web-dev-qa-db-ja.com

.asoundrcファイルに仮想デバイスを作成する

純粋なALSAを使用して、サウンドカードの内部オーディオを録音する仮想デバイスを作成しようとしています。何度も検索したところ、探しているものに非常に近い.asoundrcファイル_が見つかりました。

pcm.mycard {
    type hw
    card 0
}

ctl.mycard {
    type hw
    card 0
}

pcm.myconvert {
    type plug
    slave {
        pcm "myrecord"
        format S16_LE
    }
}

pcm.myrecord {
    type file
    format "raw"
    slave.pcm "mycard"
    file "| oggenc -Q -q6 -r -B %b -C %c -R %r -o /tmp/record-$(date +%%Y-%%m-%%d_%%H%%M%%S).ogg -"
}

pcm.!default{
   type asym
   playback.pcm "myconvert"
   capture.pcm "mycard"
}

この構成により、コンピューターで再生されるすべてのオーディオを含むoggファイルを記録できます。次に、構成のpcm.myrecordの部分を変更して、音声を、たとえばarecordでキャプチャできる仮想カードに「ストリーミング」できるようにします。誰かがこれを手伝ってくれるとうれしいです。

私はこれを試しました: 再生されるすべてを記録できる仮想ALSAデバイスをどのように作成しますか? しかし、それは私にとってはうまくいきませんでした。以下は、arecord -Lからの出力です。

muammar@zarathustra /tmp 
  % arecord -L                                                                                                                                         !10015
null
    Discard all samples (playback) or generate zero samples (capture)
default:CARD=PCH
    HDA Intel PCH, CS4208 Analog
    Default Audio Device
sysdefault:CARD=PCH
    HDA Intel PCH, CS4208 Analog
    Default Audio Device
front:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Front speakers
dmix:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct sample mixing device
dsnoop:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct sample snooping device
hw:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Direct hardware device without any conversions
plughw:CARD=PCH,DEV=0
    HDA Intel PCH, CS4208 Analog
    Hardware device with all software conversions
default:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
sysdefault:CARD=Loopback
    Loopback, Loopback PCM
    Default Audio Device
front:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Front speakers
surround21:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
dmix:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct sample mixing device
dmix:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct sample mixing device
dsnoop:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct sample snooping device
dsnoop:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct sample snooping device
hw:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Direct hardware device without any conversions
hw:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Direct hardware device without any conversions
plughw:CARD=Loopback,DEV=0
    Loopback, Loopback PCM
    Hardware device with all software conversions
plughw:CARD=Loopback,DEV=1
    Loopback, Loopback PCM
    Hardware device with all software conversions

ありがとう。

  1. https://bbs.archlinux.org/viewtopic.php?id=1678
9
muammar

私はこの問題を次のように解決しました:

まず、snd-aloopモジュールをロードします。

Sudo modprobe snd-aloop

これにより、Loopbackという新しいデバイスが作成されます。

± % cat /proc/asound/cards                                                                                                                             !10017

 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xc1814000 irq 60
 1 [HDMI           ]: HDA-Intel - HDA Intel HDMI
                      HDA Intel HDMI at 0xc1810000 irq 61
 2 [Loopback       ]: Loopback - Loopback
                      Loopback 1

上記の情報から、2つのhwデバイスを作成する必要があります。

  1. hw:0,0(PCHは私のメインサウンドカードです)。
  2. hw:2,1Loopback仮想デバイス)。

通常、hwデバイスの形式はhw:X,Yです。私たちの目的のために、メインカードのYは常に0であるようですが、Loopbackの場合、Y1と等しくなります。

このすべてを機能させるために、次の~/.asoundrcファイルが必要です。

pcm.!default {
  type asym
  playback.pcm "LoopAndReal"
  #capture.pcm "looprec"
  capture.pcm "hw:X1,Y1"
}

pcm.looprec {
    type hw
    card "Loopback"
    device 1
    subdevice 0
}


pcm.LoopAndReal {
  type plug
  slave.pcm mdev
  route_policy "duplicate"
}


pcm.mdev {
  type multi
  slaves.a.pcm pcm.MixReale
  slaves.a.channels 2
  slaves.b.pcm pcm.MixLoopback
  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.MixReale {
  type dmix
  ipc_key 1024
  slave {
    pcm "hw:X1,Y1"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

pcm.MixLoopback {
  type dmix
  ipc_key 1025
  slave {
    pcm "hw:Loopback,0,0"
    rate 48000
    #rate 44100
    periods 128
    period_time 0
    period_size 1024 # must be power of 2
    buffer_size 8192
  }
}

hw:X1,Y1をメインカードの値で変更します(私の場合はhw:0,0)。

コンピューターで何かを再生して、この構成が機能することをテストできます。聞けば大丈夫です。次に、コンピューターで何かを再生し、ffmpegを使用してこの仮想デバイスから記録します。

ffmpeg -f alsa -i hw:X2,Y2 -c:a libmp3lame -b:a 256k -vn capture.mp3

hw:X2,Y2Loopbackデバイスに置き換える必要があります。この場合はhw:2,1です。

arecordの使用もうまくいくと思います。

11
muammar

私は指示に従いましたが、1つの例外を除いて期待どおりに動作します。Chromeとしてアプリケーションが別のループバックインターフェイスへのアクセスを取得した後でサウンドカードにアクセスすると失敗します。たとえば、最初にループバックで録音を開始します。

arecord -f cd -Dhw:Loopback,1,0 sample1.wav

次に、ブラウザーを開き(新しいプロセスを開始することが重要です)、次にビデオを開きます。このような手順を実行すると、2つの結果が考えられます(何に依存しているかはわかりません)。最初のシナリオ:音声が聞こえず、arecordは何も録音しません。 2番目のシナリオ:ビデオを再生することもできず、ブラウザーがサウンドデバイスにアクセスできないことを通知するメッセージが表示されます。

最初にブラウザーを開いてビデオを再生してから録画を開始すると、常に期待どおりの結果が得られます。音声が聞こえ(サウンドカードのルーティングへのルーティング)、データがファイルに保存されます(ループバックのルーティングへのルーティングも同様)。

@muammarそのような問題も経験しましたか?

0
Adam Stepniak