Tạo thiết bị ảo trong tệp .asoundrc


9

Tôi đã cố gắng tạo ra một thiết bị ảo để ghi lại âm thanh bên trong của card âm thanh của mình bằng ALSA thuần túy. Sau khi googling rất nhiều, tôi tìm thấy một tập .asoundrctin¹ rất gần với những gì tôi đang tìm kiếm:

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"
}

Cấu hình này giúp ghi lại một oggtập tin với tất cả âm thanh được phát trong máy tính của tôi. Những gì tôi muốn làm bây giờ, là sửa đổi pcm.myrecordmột phần của cấu hình, để âm thanh được "truyền phát" trong một thẻ ảo mà tôi có thể chụp sau này với giả sử , arecord. Tôi sẽ rất vui nếu ai đó có thể giúp tôi với điều này.

Tôi đã thử điều này: Làm cách nào để tạo thiết bị ALSA ảo từ đó tôi có thể ghi lại mọi thứ được phát? nhưng điều đó không làm việc cho tôi. Dưới đây, đầu ra từ 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

Cảm ơn.

  1. https://bbs.archlinux.org/viewtopic.php?id=167830


@CL như tôi đã viết ở trên, tôi đã thử nó và nó không hoạt động. Tuy nhiên, tôi nghĩ rằng tôi đã đi kèm với một giải pháp. Tôi sẽ đăng nó sau khi tôi chắc chắn 100%.
muammar

Câu trả lời:


11

Tôi đã giải quyết vấn đề này như sau:

Đầu tiên, tải snd-aloopmô-đun:

sudo modprobe snd-aloop

Điều này sẽ tạo ra một thiết bị mới gọi là 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

Từ thông tin hiển thị ở trên, chúng tôi phải tạo ra hai hwthiết bị:

  1. hw:0,0 (PCH là card âm thanh chính của tôi).
  2. hw:2,1( LoopbackThiết bị ảo).

Thông thường, hwcác thiết bị có dạng : hw:X,Y. Đối với mục đích của chúng tôi, dường như Yđối với thẻ chính luôn luôn 0trong khi đối với Loopbackchúng tôi có Ybằng nhau 1.

Bây giờ, để làm cho tất cả các công việc này, chúng tôi cần một ~/.asoundrctệp với các mục sau:

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
  }
}

Sửa đổi hw:X1,Y1với các giá trị cho thẻ chính của bạn (trong trường hợp của tôi hw:0,0).

Bạn có thể kiểm tra cấu hình này hoạt động bằng cách phát một cái gì đó trong máy tính của bạn. Nếu bạn nghe nó, vì vậy nó là tốt. Bây giờ, hãy chơi một cái gì đó trong máy tính và ghi lại nó từ thiết bị ảo này bằng ffmpeg:

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

Trường hợp hw:X2,Y2phải được thay thế bởi Loopbackthiết bị, trong trường hợp này hw:2,1.

Tôi cho rằng sử dụng arecordnên làm việc quá.


3
Cám ơn bạn rất nhiều về điều này. Tôi đã cố gắng trong nhiều năm để làm cho điều này hoạt động, và ví dụ của bạn đã làm việc cho tôi như vậy.
Pistos

2
@Pistos Tôi rất vui vì nó có thể giúp đỡ.
muammar

Giống như @Pistos !! Tôi yêu bạn \ o /
Marcelo Teixeira Ruggeri

0

Tôi đã làm theo hướng dẫn và nó hoạt động như mong đợi với một ngoại lệ: khi một ứng dụng làm thẻ âm thanh truy cập Chrome sau khi có được quyền truy cập vào giao diện loopback thì không thành công. Ví dụ nắm tay tôi bắt đầu ghi trên Loopback:

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

Sau đó, tôi mở trình duyệt (Điều quan trọng là bắt đầu quy trình mới) và sau đó mở Video. Có hai kết quả có thể xảy ra sau các bước như vậy (tôi không biết những gì phụ thuộc vào). Kịch bản đầu tiên: Tôi không thể nghe thấy giọng nói và arecord không ghi lại bất cứ điều gì. Kịch bản thứ hai: Tôi thậm chí không thể phát video và có một thông báo cho biết trình duyệt không thể truy cập vào thiết bị âm thanh.

Khi tôi lần đầu tiên mở trình duyệt và phát video và sau đó bắt đầu ghi, tôi luôn nhận được kết quả như mong đợi: Tôi có thể nghe giọng nói (định tuyến đến card âm thanh hoạt động) và dữ liệu được lưu vào tệp (định tuyến đến loopback cũng hoạt động).

@muammar Bạn cũng từng gặp vấn đề như vậy?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.