标签: opensl

控制强制扬声器音频的音量

我正在使用OpenSL ES播放音频片段.在我的代码中我有

    audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.setSpeakerphoneOn(true);
Run Code Online (Sandbox Code Playgroud)

在插入耳机时强制音频通过扬声器.它工作正常,但我无法控制音量.播放剪辑时按音量按钮可使音量搜索栏出现并移动,但音量不会改变.打电话setVolumeControlStream(AudioManager.STREAM_VOICE_CALL)或打电话setVolumeControlStream(AudioManager.STREAM_MUSIC)之前似乎没有帮助.更改我的应用程序之外的任何卷(例如,在Android设置中)不会影响播放音量.未应用路由时,音量控制在耳机和扬声器上均可正常工作.

我也尝试使用我在另一个答案中找到的代码将音频路由到扬声器

    Class audioSystemClass = Class.forName("android.media.AudioSystem");
    Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
    // First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go back to the default
    // behavior, use FORCE_NONE (0).
    setForceUse.invoke(null, 1, 1);
Run Code Online (Sandbox Code Playgroud)

但它不能在我的Android 4.3 Nexus 4上运行.无论如何,我需要最兼容的方式.

有任何想法吗?谢谢.

android speaker opensl android-audiomanager

6
推荐指数
1
解决办法
7348
查看次数

链接Android上的更新库

我为Android开发了一个应用程序和一个本机库.本机库使用openSL ES进行音频处理.

在我的Android.mk文件中,我有以下声明:

LOCAL_LDLIBS := -lOpenSLES
Run Code Online (Sandbox Code Playgroud)

所以我猜这意味着应用程序将在设备上加载/执行应用程序时从设备的system/lib文件夹中动态链接openSLES库?

我面临的问题是设备上的库是错误的,我有3个更新的库,其中包含错误修复.如果可能,如何确保我的本机库使用我拥有的3个库:

Libwilhelm.so
libOpenMAXAL.so
libOpenSLES.so
Run Code Online (Sandbox Code Playgroud)

我只是更换

LOCAL_LDLIBS := -lOpenSLES
Run Code Online (Sandbox Code Playgroud)

LOCAL_SHARED_LIBRARIES := -lOpenSLES -lOpenMAXAL -lwilhelm
Run Code Online (Sandbox Code Playgroud)

android android-ndk opensl

6
推荐指数
1
解决办法
499
查看次数

OpenSL中的RecorderObject未实现在Android上设置卷或配置的接口

我试图获得Android上的SLDeviceVolumeItf界面,RecorderObject但我得到了错误:SL_RESULT_FEATURE_UNSUPPORTED.

我读到OpenSL ES的Android实现不支持AudioRecorder.真的吗?

如果是,是否有解决方法?我有一个VOIP应用程序,由于麦克风增益非常高,因此无法很好地应用于Galaxy Nexus.

我也试图SL_IID_ANDROIDCONFIGURATION设置streamType到新的VOICE_COMMUNINCATION音频源,但我再次得到错误12(不支持).

   // create audio recorder
const SLInterfaceID id[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION };
const SLboolean    req[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };

result = (*engine)->CreateAudioRecorder(engine, &recorderObject, &audioSrc,  &audioSnk, 2, id, req);
if (SL_RESULT_SUCCESS != result) {
    return false;
}

SLAndroidConfigurationItf recorderConfig;   
result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDCONFIGURATION, &recorderConfig);
if(result != SL_RESULT_SUCCESS) {
    error("failed to get SL_IID_ANDROIDCONFIGURATION interface. e == %d", result);
}
Run Code Online (Sandbox Code Playgroud)

recorderObject已创建,但我无法获取SL_IID_ANDROIDCONFIGURATION界面.我在Galaxy …

android opensl

5
推荐指数
1
解决办法
2519
查看次数

Android OpenSL ES AAC解码器

是否有任何示例源代码如何使用Android OpenSL ES AAC解码器代码将AAC帧解码为PCM?我需要将存储在内存缓冲区中的AAC帧(带或不带ADTS标头)解码为PCM.

android aac android-ndk opensl

5
推荐指数
0
解决办法
774
查看次数

在Android中使用动画精确同步循环音频

问题: 有没有办法使用AudioTrack和setLoopPoints()来配置基于每毫秒样本/帧精度的循环?

编辑:我知道大多数Android设备拥有的处理能力无法预期完美的准确性.但是,我希望平均循环时间接近速度的"真实"间隔(以毫秒为单位),因为这是我基于"动画"的方式,它也应该与速度同步(动画是一个重绘的SurfaceView)一段线在节奏间隔期间的坐标).

详细信息: 我正在尝试使用带有setLoopPoints的AudioTrack来创建准确的节拍器.为此,我使用两个wav文件(Tick和Tock)来填充byte []数组以提供给AudioTrack.考虑一下4/4时间的例子,我将填充一个byte [],一次使用Tick从[0]开始,三次使用Tock(使用arrayCopy())填充[length/4],[length/2]和[3*length/4],并假设wav数据不会相互重叠.

我的代码所做的粗略示例:

// read each wav file's header into its own ByteBuffer (with LITTLE_ENDIAN order)
// ... then get the size of the audio data
tickDataSize = tickHeaderBuffer.getInt(40); 
tockDataSize = tockHeaderBuffer.getInt(40); 

// allocate space for one loop at the current tempo into a byte[] array (to be given to    AudioTrack) 
// e.g. 22050hz * 2 Bytes (1 per channel) * 2 Bytes (1 per 8 bit PCM sample) = 22050*4 Bytes/second
//      If …
Run Code Online (Sandbox Code Playgroud)

java audio android opensl audiotrack

5
推荐指数
1
解决办法
967
查看次数

具有SL_ANDROID_STREAM_VOICE的Android上的OpenSL ES。麦克风输入极低

我正在使用OpenSL ES和SL_ANDROID_STREAM_VOICE将本机Android应用程序中的音频路由到耳(电话)扬声器,而不是主扬声器。入耳式扬声器的输出效果很好,但是现在音频输入录音非常柔和。在这种情况下,有什么方法可以增强或重新配置麦克风?通过OpenSL ES的SDK或NDK都可以接受。

谢谢!

android volume android-ndk opensl

5
推荐指数
0
解决办法
629
查看次数

AAudio 或 OpenSL

我开始用 C++ 实现我的游戏音频部分,我看到有 2 个音频框架可用 AAudio ( https://developer.android.com/ndk/guides/audio/aaudio/aaudio.html ) 和OpenSL ( https://developer.android.com/ndk/guides/audio/opensl/index.html )。

这两者之间有哪些区别?

c++ audio android opensl

5
推荐指数
2
解决办法
9301
查看次数

如何在Android上使用OpenSL测量音频延迟?

我使用OpenSL在Android上录制和播放音频.您能否告诉我如何测量延迟,以便找到最佳音频配置(缓冲区,采样率).

先感谢您!

android opensl android-audiorecord

4
推荐指数
1
解决办法
2141
查看次数

什么是SLDataLocator_AndroidSimpleBufferQueue(Android 4.3)?

"2"代表以下内容:

SLDataLocator_AndroidSimpleBufferQueue loc_bq   =
{SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
Run Code Online (Sandbox Code Playgroud)

从我读过的,它是缓冲区的数量.

为什么2?为什么不只是1?如果2更好,为什么不是10然后才能让它变得更好?

谢谢

c audio android android-ndk opensl

4
推荐指数
1
解决办法
1852
查看次数

使用opensl es和android ndk实时播放音频

我想要做的是录制一个声音,处理它就像为录制的音频添加一些效果,然后使用opensl尽可能快地重放它.我在网上找到关于做这样的事情的信息很困难,所以我实际上有几个问题.

我已经看过android原生音频样本了,这本书开始使用android ndk,这让我开始使用opensl,但是他们并没有真正帮助我理解录音.

1)首先,要立即回放录制的音频,我是否能够从播放音频的线程中读取缓冲区,同时录制线程正在写入缓冲区?我知道有人可能会对这个想法发疯,因为同时通过两个不同的线程访问内存中的某个对象的想法可能会导致问题,但是如果记录线程确保始终在内存之前写入内存播放音频线程,那可能是对的吗?

2)或者为了实时回放,我将使用具有两个或三个非常小的缓冲区的缓冲区队列,以及每次填充时调用的回调,然后在下一个缓冲区被记录填充时播放该缓冲区音频线程?但我正在阅读,有人说回调并不总是被调用(我发现的最有用的链接是:https://groups.google.com/forum/#!msg/installer -ndk/hLSygQrmcPI/qtwB76JNa_EJ) .此外,这意味着录制的音频和播放的音频之间的时间差将是缓冲区的大小加上回调使记录对象知道使用下一个缓冲区开始记录所花费的时间.我认为录音机停止录音和再开始录音之间会有一个间隙.

3)android记录缓冲区队列也是我理解的问题.我是否必须在android中使用缓冲队列来录制音频?或者是否可以在不使用缓冲队列的情况下直接记录到缓冲区?我遇到了这方面的问题,因为明确的方法SLAndroidSimpleBufferQueueItf实际上似乎不起作用.显然它是一个错误.我似乎无法在已填充数据后记录缓冲区.由于clear方法似乎不起作用,我如何告诉记录器队列中的哪个缓冲区要记录?

我知道这有点问题,我没有说过我尝试过的所有内容,但我希望有人对此有一些经验,并且可以为我和其他有问题的人播放录音使用opensl实时音频.

android android-ndk opensl

3
推荐指数
1
解决办法
6690
查看次数