高比特率音频格式兼容性较差

问题描述:
mtk的项目播放高比特率的音频杂音,这个问题的本质是播放IEEE的float型32位pcm数据有噪音。
根本原因分析:
mtk原始组件无法处理32位浮点数据,因此需要在提取器上进行。
解决方案:
在提取器上将32位浮点数据更改为16位数据,然后发送mtk原始组件,也就是在wavextractor里面把32位的数据转换成16位的数据,然后再去交给解码库解码。
代码实现:

diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 911c19f..85ec7d8 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -8740,6 +8740,7 @@
int32_t pcmType = 1;
int32_t channelAssignment = 0;
int32_t numericalType = 0;
+ int32_t pcmFormat = 1;

OMX_AUDIO_PARAM_RAWTYPE def;
InitOMXParams(&def);
@@ -8761,6 +8762,11 @@
def.nChannelAssignment = channelAssignment;
}

+ if (msg->findInt32("pcm-format", &pcmFormat)) {
+ def.nPcmFormat = pcmFormat;
+ ALOGV("pcmFormat is %d", pcmFormat);
+ }
+
msg->findInt32("endian", &endian);
msg->findInt32("pcm-type", &pcmType);
msg->findInt32("numerical-type", &numericalType);
diff --git a/media/libstagefright/WAVExtractor.cpp b/media/libstagefright/WAVExtractor.cpp
index ba2ebbe..7ae4e22 100644
--- a/media/libstagefright/WAVExtractor.cpp
+++ b/media/libstagefright/WAVExtractor.cpp
@@ -504,7 +504,20 @@
buffer->set_range(0, n);

#if defined(MTK_AOSP_ENHANCEMENT) && defined(MTK_AUDIO_RAW_SUPPORT)
- ALOGV("======PCM Data pass MTK PCM Component !======");
+ if (mWaveFormat == WAVE_FORMAT_PCM) {
+ ALOGV("PCM Data pass PCM Component !");
+ }
+ else if (mWaveFormat == WAVE_FORMAT_IEEE_FLOAT) {
+ //ALOGD("hxl mWaveFormat = %d", mWaveFormat);
+ if (mBitsPerSample == 32) {
+ // Convert 32-bit float samples to 16-bit signed in place
+ const size_t numSamples = n / 4;
+
+ memcpy_to_i16_from_float((int16_t *)buffer->data(), (const float *)buffer->data(), numSamples);
+ buffer->set_range(0, 2 * numSamples);
+ }
+ mMeta->setInt32(kKeyPcmFormat, mWaveFormat);
+ }
#else
// TODO: add capability to return data as float PCM instead of 16 bit PCM.
if (mWaveFormat == WAVE_FORMAT_PCM) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值