【Android笔记】dump audio数据定位音频问题
来源:互联网 发布:python 接收上传图片 编辑:程序博客网 时间:2024/06/05 23:44
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,后续文章会有详细过程。
阅读全文
0 0
- 【Android笔记】dump audio数据定位音频问题
- [Audio] Android音频数据传输
- DUMP文件定位问题
- DUMP文件定位问题
- 【Android Audio】Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据
- Android Audio System 之一 Audio (1) AudioTrack如何与AudioFlinger交换音频数据
- Android 音频焦点(Audio Focus)
- Android Audio 音频输出设备切换
- Android 音频焦点(Audio Focus)
- Android 音频焦点(Audio Focus)
- Android Audio 音频输出设备切换
- Android 音频焦点(Audio Focus)
- Android--Audio播放:竞争Audio之Audio Focus 音频焦点
- Android音频数据抓取(杂音pop音定位必备)
- unity3D学习之音频数据的采集要点-audio菜鸟笔记6
- stream audio on android 音频流 android
- Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据
- Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据
- 单链表的插入,查找,删除
- rpm&&yum
- 把本地项目推送到github的命令
- 解决IDEA乱码问题
- JVM垃圾回收机制
- 【Android笔记】dump audio数据定位音频问题
- 808B
- Angular2-Bootstrap的继承
- SSL certificate problem: self signed certificate
- SDNU 1147 Pythagoras's Revenge 【技巧暴力】
- 大数据竞赛平台——Kaggle 入门篇
- 一些问题的解决
- 《算法》-3.3平衡查找树(1)
- 算法系列——Balanced Binary Tree