我想修改Android OS(AOSP的官方图片),为正常的电话回放声音添加预处理功能.
我已经为app音频播放实现了这种过滤(通过修改HAL和audioflinger).
我只针对特定设备(Nexus 5X).另外,我只需要过滤播放 - 我不关心录制(上行链路).
更新#1:
为了说清楚 - 我可以修改特定于Qualcomm的驱动程序,或者在Nexus 5X上运行的任何部分,并且可以帮助我修改通话中的播放.
更新#2:
我正在尝试创建一个Java层应用程序,将手机播放实时路由到音乐流.
我已经成功地安装它作为系统的应用程序,获得权限初始化AudioRecord用AudioSource.VOICE_DOWNLINK.但是,录音会给出空白样本; 它不记录语音通话.
这是我的工作线程中的代码:
// Start recording
int recBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_DOWNLINK, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBufferSize);
// Start playback
int playBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, playBufferSize, AudioTrack.MODE_STREAM);
mRecord.startRecording();;
mTrack.play();
int bufSize = 1024;
short[] buffer = new short[bufSize];
int res;
while (!interrupted())
{
// Pull recording buffers …Run Code Online (Sandbox Code Playgroud) 我编写了一个用于测试目的的小型Java应用程序,它可以在ubuntu 12.04上从混音器中捕获声音.
代码工作正常,我可以从所有应用程序捕获声音,除了在Wine下运行的任何东西.
每当我启动我的程序时,在启动Wine之后,呼叫targetDataLine.read()将永远阻止
当Wine没有在后台运行时,它会0在没有输入时正确输出,或者如果有输入则读取字节数,如预期的那样.
如果我在启动Wine之前启动我的程序,那么声音驱动程序将无法在wine中使用.
我尝试过使用Alsa提供的混音器以及默认设备,结果相同.
我可以想象葡萄酒会以某种方式锁定Alsa(无论出于何种原因),但为什么一个简单的调用会TargetDataLine.read()导致Wine中的声音失败?
mixerInfo[0]在我的系统btw上是默认的,并且应用程序当然总是使用oracle的最新JRE(7)在Wine之外运行.
private void readSound ()
{
byte tempBuffer[] = new byte[10000];
int cnt = 0;
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
System.out.println("Available mixers:");
for (int p = 0; p < mixerInfo.length; p++)
System.out.println(mixerInfo[p].getName());
format = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, format);
Mixer mixer = AudioSystem.getMixer(mixerInfo[0]);
try
{
targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
targetDataLine.open(format);
}
catch(Exception e)
{
e.printStackTrace();
}
targetDataLine.start();
while (true)
{
i++;
cnt = targetDataLine.read(tempBuffer, …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用可用于使用android 2.3进行本机音频的OpenSL ES库,但看起来头文件和规范的600页pdf是唯一可用的文档.
我应该在哪里寻找示例,教程或功能的简要概述?
几个月前,在Android ICS(4.0)中,我开发了一个安卓内核模块,它拦截了"pcmC0D0p"模块以获取所有系统音频.
我的目标是通过AirPlay将所有音频(或至少播放的音乐)流式传输到远程扬声器.
内核模块工作,但有几个问题(内核版本,root权限等),所以我停止了这个.
现在,我们有Android 4.1和4.2,我有了新的希望!
谁知道如何在Android中捕获音频?
我有以下想法:
通过蓝牙连接 到同一部手机,设置路由到BT并抓住"另一端"的音频:这不应该工作
使用像以前那样的内核模块拦截音频:硬核,让它工作但不适用
JACK音频连接套件:遗憾的是Android使用"tinyALSA"而不是"ALSA".TinyALSA不支持任何像JACK这样的过滤器(但这带来了内核模块的想法)
使用PulseAudio代替AudioFlinger,但这也不适用
编辑(忘了他们):
我从tinyALSA(Android上的ALSA )编译了"tinymix"(ALSA-mixer的婴儿版)并试图将音频输出到麦克风输入 - 但没有成功(对我来说不可理解).这也需要生根:不适用
我测试了OpenSL ES,但我不是C-crack,它的结尾是"我可以录制麦克风,但没有更多"(也许我错了?)
我刚刚找到了ROUTE_TYPE_LIVE_AUDIO:
支持实时音频路由的设备将允许将媒体音频流路由到支持的目的地.这可能包括设备本身的内置扬声器或音频插孔,A2DP设备等.
一旦启动,此路由对应用程序是透明的.媒体流上播放的所有音频都将路由到所选目的地.
也许这有助于任何方式?
我的想法已经不多了但是想"破解这个坚果",也许有人可以帮助我?
编辑:
我是C和内核编码的新手(但我成功地创建了一个交叉编译的音频拦截模块) - 但是在用户空间(JAVA)发送PCM数据的时候,它是不是可以用来监听,C层?)到内核空间(tinyALSA,内核模块),没有黑客攻击和生根?
我试图使用AudioRecord与AudioSource.VOICE_DOWNLINK在Nexus 5X的Android 7.1(我自己的构建从AOSP).
我已经超过了权限阶段 - 将我的APK移动到特权应用程序,AudioRecord在Android源代码中进行了调整以停止抛出有关此源的异常.
现在我在通话期间得到空录音缓冲区.
我知道有很多通话录音应用程序,它们可以在其他设备上运行.我也看到某些应用程序可以对已植根的N5执行某些操作并使其正常工作.
我希望在Nexus 5X上实现同样的目标 - 任何调整对我来说都可以,包括更改Android版本,修改Qualcomm驱动程序,设备配置文件等等 - 基本上可以在自定义ROM中实现.
我已经尝试过使用平台代码 - 硬件/ qcom/audio/hal/voice.c,特别是功能voice_check_and_set_incall_rec_usecase,但到目前为止还没有意义.
还检查了device/lge/bullhead/mixer_paths.xml,发现有一个与呼叫记录相关的部分:
<!-- Incall Recording -->
<ctl name="MultiMedia1 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia1 Mixer VOC_REC_DL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
<!-- Incall Recording End -->
Run Code Online (Sandbox Code Playgroud)
但我也无法理解它或它是如何得到帮助的.
android alsa android-mediarecorder android-audiorecord android-rom
这个问题的灵感来自于您是否可以在docker容器中运行GUI应用程序?.
基本的想法是运行带有音频和ui的应用程序(vlc,firefox,skype,...)
我正在使用pulseaudio搜索docker容器,但我发现所有使用pulseaudio流在tcp上的容器.(应用程序的安全沙箱)
在我的情况下,我会优先从容器内的应用程序直接播放音频到我的主机pulseaudio.(没有ssh隧道和臃肿的docker图像)
Pulseaudio因为我的qt app正在使用它;)
我正在使用PyAudio来录制麦克风的输入.
由于音频录制对我来说很好,我应该尝试简单地抑制其错误消息吗?还是有办法解决它们?
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
Cannot connect to server socket err = No such file or …Run Code Online (Sandbox Code Playgroud) 有没有人为Android构建OpenAL,或者在系统上找到它的共享库?对于任何类型的游戏来说,这似乎是一个显而易见的需求,但它没有任何资源.似乎Android java声音库无法根据我所知道的进行音高变化,因此似乎需要OpenAL.我知道OpenAL Soft可以构建在ALSA之上,但我不确定是否有人这样做,我相信这需要一个月的时间.
如果在没有OpenAL的Android上进行声音操作的某个地方有一个很好的指导,那也没关系.这只是OpenAL的是那种对游戏厂商的一个标准,它会是不错的端口我千行到这个系统,我有点觉得是NDK之前,我荣登网站到它的点看,发现里面几乎没有系统上的共享库访问.
谢谢..我希望我能在不成为Java专家的情况下实际移植.到目前为止真的不喜欢NDK!
我一直在寻找一个简单的C代码示例来设置ALSA混音器的主音量,但是对于这个所谓的常见操作却找不到任何简单的东西.
我对ALSA完全不熟悉,所以制作我自己的最小例子需要时间.如果有人能提供,我会很高兴.
你如何通过命令行或API(Python优先)以编程方式在Ubuntu上更改Gnome中的卷?
我发现类似问题的唯一答案amixer,似乎对Ubuntu 12.04没有影响.运行:
amixer set Headphone 10-
Run Code Online (Sandbox Code Playgroud)
说明:
Simple mixer control 'Headphone',0
Capabilities: pvolume pswitch penum
Playback channels: Front Left - Front Right
Limits: Playback 0 - 115
Mono:
Front Left: Playback 0 [57%] [-57.50dB] [on]
Front Right: Playback 0 [57%] [-57.50dB] [on]
Run Code Online (Sandbox Code Playgroud)
每次运行时x%都会发生变化.不幸的是,它对实际音量没有影响.最终它表示0%,但音量仍然处于爆炸状态.
另一个缺点是我必须指定确切的有源输出设备,如果有多个设备,我可能不知道.例如,如果我有"Master"和"Headphone",我该如何确定哪一个是有源设备?