是否有一个很好的方法可以在Java中获得体面,可靠的数字采样声音播放?
我的请求列表非常简短:
拥有以下内容会很高兴,但实际上我可以没有它:
我已经尝试了臭名昭着的Java Sound API,但发现它完全不可靠,似乎无法满足我的最小愿望清单.我得到的问题:
在使用ALSA dmix(OpenJDK 6)的Linux上,在初始化Java Sound API时让任何其他应用程序使用音频只会使Java应用程序中的所有声音消失而不会出现任何错误/警告.
在Linux(OpenJDK 6)上,列出MixerInfos并尝试Clip使用其中任何一个获取对象时,在尝试加载wav文件时会引发以下异常:
java.lang.IllegalArgumentException: Line unsupported: interface Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Run Code Online (Sandbox Code Playgroud)
因此,AudioSystem.getClip(anySortOfMixer)似乎根本不起作用.只有AudioSystem.getClip()作品.
使用不同的采样率/位/格式加载文件Clip失败LineUnavailableException.似乎第一次调用clip.open将声音系统设置为特定声音选项,在调用后加载具有略微不同采样率的文件(例如,第一个是44100,第二个是48000)
在Linux(OpenJDK 6)上初始化几个不同的Clips并尝试播放它们只会使最后加载Clip声音 - 没有给出错误/警告,但只有play在最后Clip加载时才使用任何声音 - 所有其他声音都是静音的:
Clip loadSound(String name) {
URL url = this.getClass().getResource("/" + name + ".wav");
Clip …Run Code Online (Sandbox Code Playgroud)我试图使用ALSA从USB音频设备获取输入并将其作为一系列signed short值写入磁盘.我最终得到的是看似有效数据的块,其中散布着大块的零.我猜我的缓冲区设置不正确,并没有正确使用内存映射.
我在尝试什么:
- 采样率:8K(由设备强制)
- 缓冲区大小:2048
- 期间大小:512
- 一个频道
该设备似乎正确打开并接受各种参数.经过一些设置后,循环运行如下:
snd_pcm_avail_update
snd_pcm_mmap_begin
memcpy data from mmap buffer to array of short
snd_pcm_mmap_commit
Run Code Online (Sandbox Code Playgroud)
memcpy是指向short数组的指针,并以每次传递返回的帧数递增.
在此记录几秒钟后,我将其关闭并将后续缓冲区写入磁盘,作为每行的单个短值.我期待的是在1200和2300 Hz之间变化的PCM数据中的第二个或两个.我得到的是一些有很多零的数据.
我想知道的是:我对缓冲和期间理性的价值观是什么?有没有人成功使用ALSA的内存映射输出?
编辑:一些代码
const snd_pcm_channel_area_t *areas;
snd_pcm_uframes_t offset, frames, size;
short* pCID = (short*)malloc( 50000 * sizeof( short ));
short* ppCID = pCID;
while( size > 0 )
{
frames = size;
snd_pcm_mmap_begin (device, &areas, &offset, &frames);
short* pd = (short*)areas[0].addr;
memcpy( ppCID, (pd + (offset*sizeof(short))), frames * sizeof( short ));
ppCID += frames;
snd_pcm_mmap_commit(device, offset, …Run Code Online (Sandbox Code Playgroud) 我在Virtualbox上安装了Android,我使用从http://www.android-x86.org/download下载的Android x86 我选择了2.3版本的eeepc版本(android-x86-2.3-RC1-eeepc.iso).
问题是声音不起作用,我在Virtualbox设置中尝试了所有3个选项.我目前的设置:
Host driver: Windows DirectSound
Controller: ICH AC97
Run Code Online (Sandbox Code Playgroud)
我为音频控制器设置尝试的选择:
Intel HD Audio
ICH AC97
SoundBlaster 16
Run Code Online (Sandbox Code Playgroud)
我目前正在运行Windows 7,我的音频驱动程序是默认的Windows驱动程序.
我搜索并发现有相同问题的人,但我无法理解任何事情,因为我不是高级Linux用户,有些解决方案谈论ALSA驱动程序,但我找不到如何安装和使用它.
也可以来自我选择的安装.iso文件?我的电脑是Acer Travelmate 2480.
更新 在检查Android x86网站时,我发现我们应该使用SoundBlaster 16而不是ICH AC97.
我也尝试了alsa_ctl init终端内的命令(ALT + F1),我得到了这个:
Unkown hardware: "Dummy" ""Dummy Mixer" "" "" ""
Hardware is initialized using a guess method
Run Code Online (Sandbox Code Playgroud)
我查了它的版本是1.0.23
在最新的Android版本中,该AOSP版本通常附带tinyALSA和tinyCompress.在这个问题中,Simon提到所有Nexus设备都应该支持tinyALSA.
我的问题是为什么android没有集成libasound哪个具有音频子系统所需的所有功能tinyALSA?是否主要是由于source.android.com网站中指出的许可问题?
我使用buildroot进行自定义分发,使用ARMv7处理器的硬流程.一切正常,除了....
# arecord -D hw:0,0 -fdat -d 5 test.wav
Run Code Online (Sandbox Code Playgroud)
这会产生多个文件.成千上万的人.
-rw-r--r-- 1 root root 958508 Jan 1 00:19 test-01.wav
-rw-r--r-- 1 root root 44 Jan 1 00:19 test-02.wav
-rw-r--r-- 1 root root 44 Jan 1 00:19 test-03.wav
-rw-r--r-- 1 root root 44 Jan 1 00:19 test-04.wav
-rw-r--r-- 1 root root 44 Jan 1 00:19 test-05.wav
-rw-r--r-- 1 root root 44 Jan 1 00:19 test-06.wav
-rw-r--r-- 1 root root 44 Jan 1 00:19 test-07.wav
-rw-r--r-- 1 root root 44 Jan 1 …Run Code Online (Sandbox Code Playgroud) 尝试学习ALSA音频层,最终为Raspberry Pi平台编写ALSA设备驱动程序.从简单开始,我将来自ALSA项目站点和其他在线资源的各种样本粘在一起做最简单的事情:读取WAV文件并在默认声音设备上播放.我不能让这个简单的C样本工作.
我正在使用libsndfile来做所有的WAV文件读取/头部解码.我验证了我读入缓冲区的样本是正确的(验证了程序读取的第一个400K样本,对应于将样本值转储到文本文件的sndfile-to-text应用程序).所以我知道我的缓冲区包含正确的数据,问题必须是我将其传递给ALSA API的方式.
在运行时,它只在正确的通道中产生声音,并且扭曲/泥泞 - 几乎无法识别.顺便说一句,"aplay"应用程序完美地播放相同的WAV文件并报告该文件是16位带符号LE,44100Hz,立体声,它与我的应用程序报告的内容相匹配.在Raspberry Pi上运行它.
我在这里将C程序剥离到最小值以节省空间,但我验证了所有API调用的正确返回码.为什么这个简单的ALSA应用程序没有产生正确的声音?
#include <alsa/asoundlib.h>
#include <stdio.h>
#include <sndfile.h>
#define PCM_DEVICE "default"
int main(int argc, char **argv) {
snd_pcm_t *pcm_handle;
snd_pcm_hw_params_t *params;
snd_pcm_uframes_t frames;
int dir, pcmrc;
char *infilename = "/home/pi/shortsample.wav";
int* buf = NULL;
int readcount;
SF_INFO sfinfo;
SNDFILE *infile = NULL;
infile = sf_open(infilename, SFM_READ, &sfinfo);
fprintf(stderr,"Channels: %d\n", sfinfo.channels);
fprintf(stderr,"Sample rate: %d\n", sfinfo.samplerate);
fprintf(stderr,"Sections: %d\n", sfinfo.sections);
fprintf(stderr,"Format: %d\n", sfinfo.format);
/* Open the PCM device in playback mode */
snd_pcm_open(&pcm_handle, PCM_DEVICE, SND_PCM_STREAM_PLAYBACK, 0); …Run Code Online (Sandbox Code Playgroud) 我有2个Raspberry Pis,其中1个将UDP帧的音频数据传输到另一个Raspberry Pi.收到的UDP数据包各为160字节.传输的Raspberry Pi正在发送8KHz 8位单声道样本.接收Raspberry Pi使用带有QUDPSocket的Qt 5.4.0并尝试使用ALSA播放接收的数据.代码如下.每当字节到达接收Raspberry Pi时触发"readyRead"信号,缓冲区就会写入ALSA.我在接收Pi上的耳机插孔中发出了非常低声和毛躁的声音 - 但它是可识别的.所以它工作但听起来很糟糕.
谢谢你的任何建议.
UdpReceiver::UdpReceiver(QObject *parent) : QObject(parent)
{
// Debug
qDebug() << "Setting up a UDP Socket...";
// Create a socket
m_Socket = new QUdpSocket(this);
// Bind to the 2616 port
bool didBind = m_Socket->bind(QHostAddress::Any, 0x2616);
if ( !didBind ) {
qDebug() << "Error - could not bind to UDP Port!";
}
else {
qDebug() << "Success binding to port 0x2616!";
}
// Get notified that data is incoming to …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ALSA库在SoC上实现音频捕获.我已经预编译libasound.so.2.0.0了一个asoundlib.h与其他标题一起.
我现在有
int returnCode;
snd_pcm_t *pcm_Handle;
char *pcm_device_name = "hw:0,0";
returnCode = snd_pcm_open(&pcm_Handle, pcm_device_name, SND_PCM_STREAM_CAPTURE, 0);
Run Code Online (Sandbox Code Playgroud)
返回snd_strerror(returnCode)的No such file or directory
这是否表明捕获设备未正确安装(例如驱动程序或其他东西)?
我怎样才能找出错误/缺失的内容?
我可以列出是否安装了任何alsa可访问的声音设备?
更新:
我发现了如何通过以下方式扫描设备:以编程方式在Linux上查找可用的声卡
snd_card_next找到一个单一的cardNum : 0,但我仍然不能上snd_ctl_open(&cardHandle, "hw:0", 0)和snd_pcm_open(&pcm_Handle, "hw:0,0", SND_PCM_STREAM_CAPTURE, 0)带No such file or directory.这是否表明声音设备没有正确安装?
更新::
我在http://www.tldp.org/HOWTO/Alsa-sound-4.html上找到了更多信息
"4.6准备设备驱动程序目录中有一个脚本,它将在您的/ dev目录中安装ALSA-sound-devices.从驱动程序目录中键入./snddevices.现在应该有一个/ dev/snd子目录(测试它是否在那里.如果你不熟悉甚至"ls"命令,请考虑先阅读其他HOWTO.你应该有一些基本的Linux知识来安装这些驱动程序.)现在你已经准备好插入驱动程序,所以请转到下一段."
我记得我运行了一个随SoC alsa版本提供的snddevices脚本,但我不确定它是否成功或是否只是没有显示错误.但链接说我之后必须安装驱动程序?不幸的是我明天才能测试.
更新:
来自CL.和http://www.tldp.org/HOWTO/Alsa-sound-6.html我测试了以下内容:
dev/snd/具有以下条目:
crw-rw---- 1 root audio 116, 0 Mar 11 04:44 controlC0 …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些帮助来配置 Raspberry Pi 上的音频,因为到目前为止我所有的谷歌搜索工作都没有成功!
我的设置:
到目前为止,我已经设法将 ALSA 配置为默认情况下通过 USB 网络摄像头捕获并通过 3.5 毫米插孔播放。例如,以下工作正常:
# Capture from Webcam
arecord test.wav
# Playback through 3.5mm jack
aplay test.wav
Run Code Online (Sandbox Code Playgroud)
默认情况下,它以 8 位、8KHz、单声道捕获音频。但是,我希望默认捕获过程使用 16 位、16KHz、单声道设置,这就是我遇到的问题。
这是我的工作~/.asoundrc文件:
pcm.!default {
type asym
playback.pcm {
type hw
card 1
device 0
}
capture.pcm {
type plug
slave {
pcm {
type hw
card 0
device 0
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
而我的/etc/modprobe.d/alsa-base.conf:
options snd_usb_audio …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法将文件中的音频数据输入麦克风,因此当第三方应用程序(例如arecord或Chromium的"按语音搜索"功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据代替.
这是我的场景:我编写的应用程序从麦克风录制音频数据(使用ALSA)并将其保存到文件(audioFile0.raw).在未来的某个未知时间点,一些未知的第三方应用程序(例如,我没有开发的东西,所以我没有开发控制权,例如Chromium网络浏览器的"语音搜索"功能)将使用麦克风来获取音频数据.我希望第三方应用程序收集的音频数据来自audioFile.raw而不是实际的麦克风本身.
我在想是否可以将默认音频输入设备更改为音频文件,或者可能是命名管道并执行类似操作cat audioFile0.raw > mypipe(因为我不知道其他应用程序何时会尝试从麦克风读取).也许有一种更简单的方法可以做到这一点?
我希望我提供了足够的细节和清晰度.如果不清楚,请告诉我.
编辑: 所以我想通过在我的主目录中创建以下.asoundrc文件来制作虚拟麦克风:
pcm.!virtmic {
type file
slave.pcm "hw:0,0"
file /dev/null
infile "/home/charles/audioFiles/audioFile0.raw"
}
pcm.!default {
type hw
card 0
}
ctl.!default {
type hw
card 0
}
Run Code Online (Sandbox Code Playgroud)
然后调用arecord test.raw -c 1 -f S16_LE -r 16000 -t raw -D virtmic命令行,我能够记录音频数据是在audioFile0.raw来test.raw.
我现在的目标是用我的虚拟麦克风替换默认设备,这样任何访问麦克风的应用程序都将读取音频数据,audioFile0.raw而不是实际的麦克风本身.所以我编辑了我的.asoundrc文件,如下所示:
pcm.!virtmic {
type file
slave.pcm "hw:0,0"
file /dev/null
infile "/home/charles/audioFiles/audioFile0.raw"
}
pcm.!default {
type asym
playback.pcm {
type hw
card …Run Code Online (Sandbox Code Playgroud) alsa ×10
audio ×7
linux ×4
android ×2
c++ ×2
raspberry-pi ×2
android-x86 ×1
buildroot ×1
capture ×1
java ×1
javasound ×1
libalsa ×1
lwjgl ×1
microphone ×1
openal ×1
qt ×1
raspbian ×1
usb ×1
virtualbox ×1
windows ×1