Android 音频系统播放延迟时间获取(latency)

1.系统AudioManager类里面有一个隐藏接口:

可以用反射获取到系统播放硬件延迟

            AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
            Method m = am.getClass().getMethod("getOutputLatency", int.class);
            int latencyMs = (Integer) m.invoke(am, AudioManager.STREAM_MUSIC);

2.系统AudioTrack类里面也有一个隐藏接口:

           
            if (SDK_INT >= 18) {
                  Method getLatencyMethod =android.media.AudioTrack.class.getMethod("getLatency", (Class < ? > []) null);

                  int audioLatencyMs = (int) ((Integer) getLatencyMethod.invoke(audioTrack, (Object[]) null));

            }

这个延迟是AudioTrack buffer延迟+系统播放硬件延迟,详解如下:

AudioTrack延迟底层分析:

uint32_t AudioTrack::latency() const
{
    return mLatency;
}

AudioTrack::createTrack函数中对mLatency进行了赋值:

 mLatency = afLatency + (1000*mCblk->frameCount) / sampleRate;

其中afLatency是硬件的延迟。
(1000*mCblk->frameCount) / sampleRate,这一坨,是根据AudioTrack中的audio_track_cblk_t的buffer,计算AudioTrack buffer导致的延迟,也可以在Java层获取到buffer大小,去计算延迟时间。

afLatency就是AudioManager里面的getOutputLatency,证据如下 :和getOutputLatency底层实现一致。

    uint32_t afLatency;
    if (AudioSystem::getOutputLatency(&afLatency, streamType) != NO_ERROR) {
        return NO_INIT;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio中使用AAudio播放音频需要进行以下配置和步骤: 1. 首先,确保你的项目已经使用了最新的Android SDK和NDK版本。 2. 在你的项目的build.gradle文件中,添加以下依赖项: ``` implementation 'androidx.media:media:1.3.0' ``` 3. 在你的代码中,创建一个AAudio流对象并进行初始化: ``` AudioAttributes audioAttributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build(); AudioFormat audioFormat = new AudioFormat.Builder() .setSampleRate(44100) .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO) .build(); int bufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT); AAudioStream aaudioStream = new AAudioStream.Builder() .setAudioFormat(audioFormat) .setBufferSizeInFrames(bufferSize) .setPerformanceMode(AAudioStream.PERFORMANCE_MODE_LOW_LATENCY) .setSharingMode(AAudioStream.SHARING_MODE_SHARED) .setDirection(AAudioStream.DIRECTION_OUTPUT) .build(); ``` 4. 创建一个音频缓冲区,并将音频数据写入AAudio流: ``` byte\[\] audioData = // 从文件或其他来源获取音频数据 int result = aaudioStream.write(audioData, 0, audioData.length, 0); ``` 5. 播放音频数据: ``` aaudioStream.requestStart(); ``` 这样就可以使用AAudioAndroid Studio中播放音频了。请注意,以上代码只是一个简单的示例,你可能需要根据你的具体需求进行适当的修改和调整。同时,还可以考虑使用oboe库来封装AAudio和OpenSL ES,以便在不同版本的Android设备上实现最佳的音频性能。 #### 引用[.reference_title] - *1* *2* [Android-Native开发系列之利用AAudio播放音频](https://blog.csdn.net/qq_34902522/article/details/128893756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android端使用AAduio实现高性能音频](https://blog.csdn.net/u011686167/article/details/122830491)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值