直播平臺搭建高比特率音頻格式兼容性較差

問題描述:
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) {
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章