merekam audio dari pemutar audio berbasis web menggunakan perangkat loop ALSA

9

Saya mencoba menyimpan pesan voicemail dari ponsel Verizon Fios dengan kualitas terbaik. Pesan voicemail tersedia online , tetapi hanya untuk bermain (pemutar berbasis Java), tidak ada penyimpanan. Secara resmi, tidak ada cara yang didukung bagaimana cara menyimpan pesan suara digital asli sebagai file dari layanan Fios Digital Voice (tidak ada layanan berbayar, tidak ada apa pun, tidak ada alasan mengapa).

Satu-satunya ide saya adalah merekam data digital dari pemain saat dalam perjalanan ke kartu suara. Saya mencoba konfigurasi Linux ALSA dengan perangkat loop.

# cat /etc/asound.conf

# default device
pcm.!default {
    type plug
    slave.pcm "loop"
}

# output device
pcm.loopout {
    type dmix
    ipc_key 328211
    slave.pcm "hw:Loopback,0,0"
}

# input device
pcm.loopin {
    type dsnoop
    ipc_key 686592
    slave.pcm "hw:Loopback,1,0"
}

# duplex plug device
pcm.loop {
    type plug
    slave {
      pcm {
         type asym
         playback.pcm "loopout"
         capture.pcm "loopin"
      }
    }
}

Ini sepertinya berfungsi dan merekam audio, misalnya ketika memainkan sesuatu di Youtube, output audio masuk ke perangkat loop (output audio default) dan saya dapat menangkapnya (tidak yakin bagaimana cara kerjanya, saya menguji 44.1kHz dan 48 Khz. )

arecord -f cd -D loop | aplay -f cd -D hw:0,0
arecord -f dat -D loop | aplay -f dat -D hw:0,0

Tetapi ketika saya mencoba untuk menangkap keluaran audio player Verizon Java, itu kacau dan panjangnya sepertinya tidak cocok. Saya menduga itu mungkin mono pada 8 kHz dan saya mencoba berbagai hal, mengubah frekuensi dan format, tetapi tidak ada yang membantu.

Apakah Anda tahu apa yang salah di sini dan bagaimana cara merekam pesan? Apakah masalah dalam konfigurasi ALSA? Atau mungkin masalah kernel? (Saya menggunakan 3.4.88). Setiap ide akan sangat disambut.

Martin Vegter
sumber
Mengapa Anda menggunakan alsa, dan bukan pulsa? Bahkan jika Anda ingin bekerja di bawah level browser, itu adalah opsi yang lebih baik untuk Anda.
Evan Carroll
@ Evan Carroll - jadi bagaimana saya memecahkan masalah saya menggunakan pulsa?
Martin Vegter
Vegeter: temukan jawaban saya di bawah ini. Saya sangat menyarankan untuk mengevaluasi kembali pendekatan Anda.
Evan Carroll

Jawaban:

5

Pertanyaan yang menarik, dahulu kala saya memikirkan tentang perekaman sederhana audio digital dan video, mungkin melalui beberapa driver audio dan video virtual, tetapi tidak pernah sampai di sana.

Saya menggunakan file konfigurasi Anda dan memiliki masalah yang sama persis seperti yang Anda jelaskan. (Saya menghapus driver kompatibilitas OSS dari ALSA untuk memastikan, menguji kernel yang berbeda - tampaknya tidak masalah, dan menggunakan Debian Wheezy)

$ alsaplayer -d front audio.mp3

$ mplayer -vo null -ao alsa:device=front video.mp4
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

$ mplayer -ao alsa:device=front audio.mp3
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

semua perintah di atas berfungsi OK untuk speaker

$ arecord -f cd -D loop | aplay -f cd -D front
Recording WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

sekarang merekam dari lingkaran dan memutar ke depan

$ alsaplayer audio.mp3
$ alsaplayer -d loop audio.mp3

$ mplayer -vo null video.mp4
$ mplayer -vo null -ao alsa:device=loop video.mp4
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)

$ mplayer -ao alsa:device=loop audio.mp3
AO: [alsa] 48000Hz 2ch floatle (4 bytes per sample)

semua mengirim audio ke loop dan memutar ke speaker OK

$ mplayer audio.mp3
AO: [alsa] 48000Hz 2ch floatle (4 bytes per sample)

tapi di sini suara rusak - sangat menyimpang !!! Hanya bermain ke perangkat default. Pemutaran yang ditentukan melalui loop berhasil!

Setelah mencoba berbagai perubahan, saya menguji modifikasi asound.conf ini

pcm.!default {
    type plug
    slave.pcm "loopout"
}

Itu memecahkan masalah! Ketika perangkat default adalah loopout, ia berfungsi. Mencobaarecord -f cd -D loopin | aplay -f cd -D front tidak berpengaruh apa-apa. Tidak yakin bagaimana loop bekerja tetapi ini mampu menangkap audio. Atau bug di ALSA? Apakah Anda menggunakan Debian? Apakah itu berhasil untuk Anda?

Catatan untuk saran lain untuk menyelesaikan masalah:

Untuk membuang aliran jaringan: Saya berasumsi jika aplikasi tidak ingin Anda menyimpan data, transfer akan dienkripsi (https ???). Jika pemain tidak memeriksa sertifikat server, bagaimana cara Anda mengambil data? Apa metode cepat & mudah favorit Anda bagaimana menjadi manusia di tengah dan menangkap arus?

Pulseaudio: Bagaimana cara menjalankannya di Debian Wheezy? Wiki mengatakan itu berfungsi. Itu tidak.

/etc/init.d/pulseaudio start
[warn] PulseAudio configured for per-user sessions ... (warning).

Bagaimana cara saya memecahkan masalah apa yang sedang terjadi? (Alat, diag?)

Jack: Saya tidak menemukan petunjuk sederhana cara menginstal Jack. Sepertinya cukup rumit. Apakah itu menganggap Pulseaudio berjalan? Dokumentasinya membingungkan. Apakah Anda memiliki tautan untuk quickstart yang bagus (cara menginstal dan menguji untuk memastikan itu berfungsi?)

Apakah Anda berasumsi bahwa sebagian besar aplikasi audio (seperti Fios Voicemail Java player) akan dapat diputar ke Pulseaudio atau Jack dan tidak mengirim audio ke ALSA?

Robert Hayek
sumber
Bagus sekali! setelah mengubah file konfigurasi, sekarang saya dapat merekam dari fios. Terima kasih banyak.
Martin Vegter
4

Apakah Anda ingat untuk "modprobe snd-aloop"? Saya sudah mencobanya dan berfungsi untuk saya dengan asound.conf Anda di youtube, pandora, tunein, vonage, dan pemutar java ini . Bisa jadi sesuatu yang spesifik untuk Fios, tapi saya tidak punya Fios untuk diuji. Dapatkah Anda menemukan situs lain yang tersedia untuk umum yang juga menyebabkan masalah?

Juga, coba merekam ke file, lalu memutarnya:

arecord -f cd -D loop > recording.wav
aplay -f cd -D hw:0,0 recording.wav
gogator
sumber
4

Ide terbaik

Pertama, membaca pertanyaan Anda, saya tidak akan melakukannya seperti ini. Saya akan mengintip jaringan dan mencoba menangkap aliran. Mungkin di tempat yang cukup dapat diprediksi yang dapat dihapus dengan panggilan sederhanatshark . Tapi itu pertanyaan lain.

Peningkatan atas ALSA

Meskipun metode Anda adalah pendekatan yang valid, saya tidak akan menggunakan ALSA. ALSA adalah lapisan abstraksi perangkat keras. Saya akan menggunakan daemon suara yang hampir di mana-mana PulseAudio. Itu lebih masuk akal. Buat null-sink.

$ pactl load-module module-null-sink sink_name=MySink

Perintah itu akan mengembalikan Anda module id. Itu tidak ada gunanya bagi kita.

Sekarang tinggal atur variabel lingkungan PULSE_SINK. (sink_name dalam contoh di atas adalah "MySink")

export PULSE_SINK=MySink;

Atau, jalankan program dengan PULSE_SINK=MySinkdan wastafel nol itu akan menangkap aliran.

Setiap kali Anda ingin melakukan streaming ke file, jalankan:

parec -v -d MySink.monitor | opusenc --raw --downmix-mono --bitrate 64 - out.opus

Opus bitrate rendah adalah taruhan terbaik untuk merekam percakapan telepon.

Catatan kaki:

  • Anda mungkin juga ingin memangkas keheningan sebelum dan sesudah. Tambahkan soxke aliran untuk itu. Lihat man sox, cari vad.
  • kami gunakan --downmix-monopada aliran stereo. Anda mungkin ingin mencoba mengirimchannels=1 argumen module-null-sinkpada langkah pertama. Semua telepon mono.
Evan Carroll
sumber
Ketika saya mencoba menggunakan solusi ini, output yang direkam berisi banyak gagap dan putus sekolah.
H. Rittich
4

Setelah menghabiskan lebih dari satu jam dengan sia-sia menyiapkan perangkat loopback ALSA pada Debian, solusi yang paling efektif dan paling tidak memakan waktu adalah menyolder perangkat yang sebenarnya dalam 5 menit.

Serius, saya mengkompilasi ulang kernel untuk mengaktifkan loopback ALSA, saya mengubah /etc/asound.conf dan ~ / .asound.rc tanpa hasil.

Perangkat loopback

davide
sumber
0

Saya sangat merekomendasikan menggunakan JACK. Itu adalah singkatan rekursif untuk JACK Audio Connection Kit. Ini disesuaikan untuk apa yang Anda lakukan, merutekan audio dari satu perangkat lunak, dalam kasus Anda alat pemutaran Java, ke perangkat lain, perangkat lunak rekaman. Ini sangat bagus untuk perekaman latensi rendah, yang menurut saya dapat membantu Anda mendapatkan kualitas yang Anda cari.

Dengannya Anda dapat dengan mudah merutekan audio dari sumber apa pun di komputer Anda ke berbagai alat rekaman. Bahkan, ada GUI yang sangat bagus untuk itu disebut QjackCtl .

Halaman ini mencakup cara merutekan audio dari browser (Flash dan mungkin alat Java Anda) ke Jack. Bagaimana ini dilakukan tergantung pada sistem Anda.

Sebagai contoh:

Ubah Anda ~/.asoundrcatau ~/asound.conf:

pcm.rawjack {
    type jack
    playback_ports {
        0 system:playback_1
        1 system:playback_2
    }
    capture_ports {
        0 system:capture_1
        1 system:capture_2
    }
}

pcm.jack {
    type plug
    slave { pcm "rawjack" }
    hint {
    description "JACK Audio Connection Kit"
    }
}

Maka Anda harus dapat menggunakan

arecord -D pcm.jack <file>
TheHerk
sumber
Untuk apa nilainya, ini adalah alasan yang salah untuk menggunakan JACK. JACK adalah latensi rendah. pavucontrolakan melakukan hal yang sama seperti Anda QjackCtl, dan Anda selalu bisa bergerak pacmd move-sink-input.
Evan Carroll
1
Keingintahuan yang tulus pada bagian saya di sini; mengapa latensi rendah adalah hal yang buruk?
TheHerk
Ini bukan. Tapi, ada dua distro yang menggunakan Jack secara default . Menganjurkan seseorang mengubah daemon suara mereka dari apa yang telah menjadi pilihan de facto tanpa alasan selain "latensi rendah" adalah arah jawaban yang agak buruk.
Evan Carroll
Anda membuatnya terdengar seperti sulit untuk menginstal sebuah program yang beroperasi baik-baik saja bersama pulseaudio , pasuspender -- jackd. Namun demikian, jika poster tersebut mengalami masalah kualitas, mungkin ada baiknya mencoba sesuatu yang mudah. Juga, QjackCtl membuatnya sangat mudah untuk menyesuaikan pengaturan yang memberikan umpan balik yang terlihat pada latensi dan xruns, yang umumnya merupakan penyebab dari audio yang kacau .
TheHerk
Dan ketika poster itu bertanya-tanya mengapa hal-hal lain yang menggunakan driver Pulse berhenti bekerja karena satu program diputar ke wastafel nol (di JACK daripada Pulse), lalu apa?
Evan Carroll