我需要使用现有录音来模拟录制音频文件的过程。
我正在运行 ubuntu 8.10,原以为这会很简单,但现在看来却不那么简单。
我的想法是,
$ cat myaudio.wav > /dev/mic
有另一个程序正在监听/等待输入。
编辑:也许我解释得不太清楚,但我想通过将预先录制的声音文件传输到麦克风设备来欺骗麦克风输入。
我可以这样做
$ cat /dev/dsp > myfile.au
捕获原始输入,以及
$ cat myfile.au > /dev/dsp
将录制的输入流式传输到扬声器,所以我有点困惑,为什么我不能用麦克风/录音功能做类似的事情?我对 Linux 上的低级声音几乎一无所知,但这似乎是不可能的,这很奇怪。
答案1
将设备节点替换为其他节点
移开设备节点,或者重新编译声音库以打开其他东西。这样,您就可以放入自己的 fifo 或伪造的环回声音驱动程序等。
答案2
感谢大家的回复。这真是一次很好的学习经历。特别是我了解到 Linux 仍然有一些棘手的地方,而声音设置(也许是最大的)就是其中之一。
将麦克风输入 cat 到文件(或套接字)中非常容易,直观地将文件 cat 到麦克风读取的任何内容中也应该同样简单 - 这样从麦克风读取的任何内容都可以读取所述声音文件。然而,不幸的是,事实并非如此。
因此,我最终修改了监听程序,以便它可以监听套接字而不是原始麦克风输入。然后我编写了一个简单的 perl 客户端,将麦克风输入重定向到套接字,
#!/usr/bin/perl -w
use strict;
use warnings;
use IO::Socket;
my $dspdev = '/dev/dsp';
my $port = 8000;
my $host = "127.0.0.1";
my $sock = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => $port,
Type => SOCK_STREAM,
Proto => "tcp",
) || die "Couldn't open socket: $!\n";
open(DSP, "<", $dspdev)||die "can't open $dspdev: $!\n";
while( 1 ) {
my $rbuf = "";
sysread(DSP, $rbuf, 4096);
syswrite($sock, $rbuf);
}
目前,这就是我所需要的一切,但似乎需要付出的努力比应有的要多一些。我想出了一个解决方案,但实际上我还没有回答我最初的问题,所以我将这个问题留待以后再回答。
编辑:决定关闭它,因为它似乎没有引起更多关注。
答案3
PulseAudio 将允许您执行此操作,前提是您的录音工具也使用 PulseAudio。我确信 ALSA 可以配置为使用不同的音频源。我猜答案实际上取决于您用于录音的应用程序以及它们使用的堆栈。
答案4
录下你自己演奏的内容
检查是否无法将录音源设置为输出,然后播放它。我认为这是声卡的常见功能,但你必须说服硬件来执行此操作。