【Android笔记】dump audio数据定位音频问题

【Android笔记】dump audio数据定位音频问题

【Android笔记】dump audio数据定位音频问题

最新推荐文章于 2025-07-08 14:56:03 发布

原创

最新推荐文章于 2025-07-08 14:56:03 发布

·

1w 阅读

·

6

·

38

·

CC 4.0 BY-SA版权

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

文章标签:

#android

#audio

Android开发

专栏收录该内容

2 篇文章

订阅专栏

本文通过分析一个实际案例,介绍了如何排查Android设备作为被动蓝牙时出现的音频破音问题,并最终定位到蓝牙丢帧的原因。

android产品开发过程中,经常会遇到一些音频问题,比如杂音、破音。这个时候需要快速定位问题点。

这里介绍一个遇到的案例,简单描述下问题的定位过程。

环境:

ubuntu 16.04 + android (amlogic ARM)

问题:

android产品作为被动蓝牙(类似蓝牙音箱),电脑蓝牙链接后播放1KHZ的正弦波音频,出现破音。android本地播放该音频,无破音。

分析:

首先需要确定硬件还是软件的问题,因为涉及硬件的问题可能会block改版和生产,所以非常急迫。这里硬件涉及codec、功放、喇叭。因为破音非常大的可能性是音频截止了。所以分析音频是最直接有效的方法。

首先音频源文件是标准的1KHZ正弦波,扫频也不没发现错误点,一个锅先扔了。然后音频通过蓝牙传给了android,那我们抓一下第一手的数据,就是在audio的HAL层dump出数据。美妙的是,amlogic、高通等的代码都有现成的,放开调试就可以生成想要的文件信息。

/hardware/amlogic/audio/audio_hw.c

static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,

size_t bytes)

{

int ret = 0;

size_t oldBytes = bytes;

struct aml_stream_out *out = (struct aml_stream_out *)stream;

struct aml_audio_device *adev = out->dev;

size_t frame_size = audio_stream_out_frame_size(stream);

size_t in_frames = bytes / frame_size;

size_t out_frames;

bool force_input_standby = false;

int16_t *in_buffer = (int16_t *)buffer;

struct aml_stream_in *in;

char output_buffer_bytes[RESAMPLER_BUFFER_SIZE + 128];

uint ouput_len;

char *data, *data_dst;

volatile char *data_src;

uint i, total_len;

int codec_type = 0;

int samesource_flag = 0;

uint32_t latency_frames = 0;

int need_mix = 0;

short *mix_buf = NULL;

unsigned char enable_dump = getprop_bool("media.audiohal.outdump");

…………

…………

…………

#if 1

if (enable_dump && out->hw_sync_mode == 0) {

FILE *fp1 = fopen("/data/tmp/i2s_audio_out.pcm", "a+");

if (fp1) {

int flen = fwrite((char *)buffer, 1, bytes, fp1);

fclose(fp1);

}

}

#endif

…………

…………

}

很明显,out_write函数中,只要打开enable_dump就会把音频dump到/data/tmp/i2s_audio_out.pcm中。

enable_dump是由“media.audiohal.outdump”控制,getprop你会发现这个应该是空的。只需要setprop media.audiohal.outdump 1 就可开始抓音频。

抓下音频,adb pull导入到电脑中,用万能的audacity进行分析:

这里可以看到,音频并没有破音,而且丢帧了。通过频谱分析看异常频点会更加清晰。

可以发现,这样的丢帧还是比较多的。

所以这里可以排除硬件的问题了,问题定位到蓝牙丢帧上。

蓝牙的丢帧,可以继续跟踪它的overrun和underrun,后续文章会有详细过程。

猜你喜欢

Windows10专业版如何创建新用户(完整教程)
易经看面相:10大福相,德重于相
365审核要多久

易经看面相:10大福相,德重于相

09-05 9406
365审核要多久

"显卡笔记本显卡"

07-21 6693
张雪峰最建议女生报考十大热门专业(就业前景好)
小谢尔顿 第一季 (2018)    Full online with English subtitle for free – iQIYI
段暄(Duanxuan)个人资料简介
365审核要多久

段暄(Duanxuan)个人资料简介

07-09 4593