录制中rampVolume参数溢出的问题
来源:互联网 发布:java stg环境 编辑:程序博客网 时间:2024/05/19 12:26
在录音的过程中发现在最前面的1s中总是会有“噗”的一声的噪音。一直在跟踪查找,发现是Android源码中有一处溢出造成的。stagefright中的AudioSource的void rampVolume(int32_t startFrame, int32_t rampDurationFrames, uint8_t *data, size_t bytes);函数(raise the volume from mute to the actual level linearly)。在AudioSource的read()函数将从AudioRecord读入的数据经过计算
int32_t autoRampDurationFrames =
(kAutoRampDurationUs * mSampleRate + 500000LL) / 1000000LL;
int32_t autoRampStartFrames =
(kAutoRampStartUs * mSampleRate + 500000LL) / 1000000LL;
int32_t nFrames = mNumFramesReceived - autoRampStartFrames;
rampVolume(nFrames, autoRampDurationFrames,
(uint8_t *) buffer->data(), buffer->range_length());
其中nFrames和autoRampDurationFrames的计算存在溢出,kAutoRampDurationUs和kAutoRampDurationUs都是int64_t类型的值,计算结果直接强制转换为int32_t类型。于是修改后的代码为
int64_t autoRamp = kAutoRampDurationUs;
autoRamp *= mSampleRate;
int32_t autoRampDurationFrames = (autoRamp +500000LL) / 1000000LL;
autoRamp = kAutoRampStartUs;
autoRamp *= mSampleRate;
int32_t autoRampStartFrames =
(autoRamp + 500000LL) / 1000000LL;
int32_t nFrames = mNumFramesReceived - autoRampStartFrames;
rampVolume(nFrames, autoRampDurationFrames,
(uint8_t *) buffer->data(), buffer->range_length());
这样就解决了rampVolume函数处理的nFrames帧的数据出现爆音的问题。
举一反三,播放器的文件大小限制的问题也是由于溢出的问题引起的,文件大小使用int32_t类型的地方限制了大小只能支持到2G,因此需要将这些地方修改int64_t使得文件大小能够支持到fat32的存储文件的最大值4G。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 录制中rampVolume参数溢出的问题
- 录制中rampVolume参数溢出的问题
- LR录制中出现的问题
- Jmeter录制复杂页面脚本时Jvm崩溃或者栈溢出问题的解决
- QTP录制的问题
- QTP录制的问题
- eclipse中内存溢出的问题
- Myeclipse使用中内存溢出的问题
- Myeclipse使用中内存溢出的问题
- Myeclipse使用中内存溢出的问题
- PHP中json_decode的整型溢出问题
- 小心编程中整数溢出的问题
- PHP中json_decode的整型溢出问题
- PHP中内存溢出的问题
- QTP录制过程中关于浏览器设定的问题
- loadrunner录制邮件系统中遇到的一些问题
- 脚本录制和参数化时的问题及技巧——上传附件
- 开始录制&&遇到的问题
- Mysql 误Drop表后数据恢复成功
- 在WINDOWS环境下编译CoolReader for Android
- JavaScript可否多线程? 深入理解JavaScript定时机制
- 实时linux下的PCI驱动开发(上)
- WEB开发工具集锦
- 录制中rampVolume参数溢出的问题
- vc中使用动态链接库小结
- notepad++用处
- S3C6410第一章 存储器、地址映射与芯片启动简介
- 笔记之数据结构之非线性结构
- OGCer V1.2 发布
- 黑马程序员-java银行业务
- 【EasyMan】 MIPI CSI学习(一): 概念为王,先学会“忽悠人
- HFile详解