使用ALSA循环设备从基于Web的音频播放器录制音频


9

我正在尝试以最佳质量保存来自Verizon Fios手机的语音邮件消息。语音邮件消息可在线获得,但仅用于播放(基于Java的播放器),无法保存。正式地,没有支持的方式将原始数字语音消息保存为来自Fios Digital Voice服务的文件(没有付费服务,没有任何东西,没有任何原因)。

我唯一的想法是在通往声卡的过程中记录来自播放器的数字数据。我尝试使用循环设备进行Linux ALSA配置。

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

这似乎可以正常工作并记录音频,例如,当在Youtube上播放某些内容时,音频输出将进入环路设备(默认音频输出),并且我可以捕获它(不确定它的工作原理,我同时测试了44.1kHz和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

但是,当我尝试捕获Verizon Java音频播放器的输出时,显示为乱码,长度似乎不匹配。我怀疑它可能是8 kHz的单声道,我尝试了不同的方法,更改了频率和格式,但没有任何帮助。

您是否知道这里有什么问题以及如何记录消息?ALSA配置是否有问题?还是内核问题?(我正在使用3.4.88)。任何想法都将受到欢迎。


为什么要使用alsa,而不是脉动?即使您想在浏览器级别下工作,这对您来说也是一个更好的选择。
埃文·卡罗尔

@Evan Carroll-那么我该如何使用Pulse解决我的问题?
Martin Vegter 2014年

Vegeter:在下面找到我的答案。我强烈建议您重新评估您的方法。
埃文·卡罗尔

Answers:


5

有趣的问题是,很久以前,我一直在考虑通过一些虚拟音频和视频驱动程序进行数字音频和视频的简单录制,但从未实现过。

我使用了您的配置文件,并且遇到了与您描述的完全相同的问题。(可以肯定的是,我从ALSA中删除了OSS兼容性驱动程序,测试了不同的内核-似乎无关紧要,并使用了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)

上面的命令都可以使扬声器正常播放

$ 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

现在从循环录制并播放到最前面

$ 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)

全部发送音频以循环播放并播放扬声器

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

但是这里的声音坏了-非常失真!!!只是播放默认设备。通过循环指定的播放有效!

在尝试了各种更改之后,我测试了对asound.conf的修改

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

它解决了问题!当默认设备为环出时,它可以工作。尝试arecord -f cd -D loopin | aplay -f cd -D front没有任何效果。不确定循环的工作原理,但这能够捕获音频。还是ALSA中的错误?您正在使用Debian吗?对你起作用吗?

解决此问题的其他建议的注释:

转储网络流:我假设如果应用程序不希望您保存数据,则传输将被加密(https ???)。如果播放器没有检查服务器证书,您如何捕获数据?您最喜欢的一种快速简便的方法是如何成为中间人并捕捉潮流?

Pulseaudio:如何在Debian Wheezy上运行它?维基说它是可行的。它没。

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

如何解决正在发生的事情?(工具,诊断?)

杰克:我没有找到任何简单的说明如何安装杰克。似乎很复杂。是否假设Pulseaudio正在运行?该文档令人困惑。您是否有用于快速入门的链接(如何安装和测试以确保其正常工作?)

您是否认为大多数音频应用程序(例如Fios Voicemail Java播放器)将能够播放Pulseaudio或Jack而不将音频发送到ALSA?


很棒!更改配置文件后,我现在可以从fios进行录制。非常感谢。
Martin Vegter 2014年

4

您还记得“ modprobe snd-aloop”吗?我已经尝试过了,它可以在youtube,pandora,tunein,vonage和此Java播放器上与您的asound.conf一起使用。可能是Fios特有的,但是我没有Fios可以测试。您能否找到另一个导致此问题的公开站点?

另外,尝试记录到文件,然后播放:

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

4

最好的主意

首先,阅读您的问题我不会这样。我会窥探网络并尝试捕获流。它可能在一个相当可预测的地方,可以通过简单调用来编写脚本tshark。不过,这是另一个问题。

对ALSA的改进

虽然您的方法是有效的方法,但我不会使用ALSA。ALSA是硬件抽象层。我会使用在几乎所有PulseAudio处都存在的声音守护程序。这更有意义。创建一个空接收器。

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

该命令将返回您的module id。这对我们没有用。

现在只需设置环境变量PULSE_SINK。(在上面的示例中,sink_name为“ MySink”)

export PULSE_SINK=MySink;

或者,使用启动一个程序,PULSE_SINK=MySink并且该空接收器将捕获流。

每当您要将其流式传输到文件时,只需运行:

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

低比特率作品是录制电话对话的最佳选择。

脚注:

  • 您可能还希望在此之前和之后减少静音。sox为此添加到流。查看man sox,搜寻vad
  • 我们在--downmix-mono立体声流上使用。您可能非常想尝试在第一步中将channels=1参数发送到module-null-sink。电话都是单声道的。

当我尝试使用此解决方案时,记录的输出包含很多结结和遗漏。
H. Rittich

4

在花了一个多小时试图在Debian上徒劳地设置ALSA回送设备之后,最有效,最省时的解决方案是在5分钟内焊接一个实际的设备

认真地,我重新编译了内核以启用ALSA环回,我对/etc/asound.conf和〜/ .asound.rc进行了调整,但没有结果。

环回设备


0

我强烈建议使用JACK。这是JACK Audio Connection Kit的递归首字母缩写。它针对您的实际情况进行了量身定制,将音频从一种软件(在您的情况下为Java回放工具)路由到另一种录音软件。它对于低延迟录制非常有用,我认为这可以帮助您获得所需的质量。

有了它,您可以轻松地将音频从计算机上的任何来源路由到许多不同的录音工具。实际上,有一个非常好的GUI叫做QjackCtl

本页介绍如何将音频从浏览器(Flash和Java工具)路由到Jack。如何完成此操作取决于您的系统。

例如:

修改您的~/.asoundrc~/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"
    }
}

那你应该可以使用

arecord -D pcm.jack <file>

出于其价值,这正是使用JACK 的错误原因。JACK是低延迟。pavucontrol你会做同样的事情QjackCtl,并且你总是可以移动的pacmd move-sink-input
埃文·卡罗尔

1
我真正的好奇心在这里;为什么低延迟是一件坏事?
TheHerk

不是。但是,默认情况下两个发行版使用Jack。提倡某人除了“降低延迟”外,无缘无故地从事实上的选择中更改其声音守护程序是一个很糟糕的答案。
埃文·卡罗尔

你说的好像是很难安装程序操作旁边的PulseAudio就好了pasuspender -- jackd。但是,如果发布者遇到质量问题,尝试如此简单的操作可能会很有价值。同样,QjackCtl使得调整设置变得非常容易,该设置可提供有关延迟和xruns的可见反馈,而这些通常是造成音频乱码的原因
TheHerk

当发布者想知道为什么使用Pulse驱动程序的其他事物由于一个程序正在播放空接收器(在JACK而不是Pulse中)而停止工作时,该怎么办?
埃文·卡罗尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.