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

Mar*_*ter 9 alsa audio recording

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

我唯一的想法是在通往声卡的途中记录来自播放器的数字数据。我尝试了带有循环设备的 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"
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎正在工作并记录音频,例如在 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
Run Code Online (Sandbox Code Playgroud)

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

您知道这里出了什么问题以及如何记录消息吗?是ALSA配置的问题吗?或者可能是内核问题?(我使用的是 3.4.88)。任何想法都会非常受欢迎。

Rob*_*yek 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)
Run Code Online (Sandbox Code Playgroud)

以上命令都可以正常播放到扬声器

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ 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)
Run Code Online (Sandbox Code Playgroud)

所有发送音频循环并播放到扬声器 OK

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

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

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

pcm.!default {
    type plug
    slave.pcm "loopout"
}
Run Code Online (Sandbox Code Playgroud)

它解决了问题!当默认设备为环出时,它可以工作。尝试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).
Run Code Online (Sandbox Code Playgroud)

如何解决发生的问题?(工具,诊断?)

Jack:我没有找到任何关于如何安装 Jack 的简单说明。看起来相当复杂。它是否假设 Pulseaudio 正在运行?文档令人困惑。你有一个很好的快速入门链接(如何安装和测试以确保它正常工作?)

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