美文网首页
PCM音频数据调整音量

PCM音频数据调整音量

作者: ibingewin | 来源:发表于2018-01-30 17:21 被阅读887次

PCM调整音量

最近接到一个客诉,说是摄像头的音量比较小,需要手机端增强音频信号,经查找研究,解决方案就是:对于PCM数据,乘以一个放大系数,并对放大后的数据进行溢出处理。

对于16位,单声道的音频,采样点幅值为2^15-1-2^15,即32767-32768,当乘以放大倍数后,需要对超出此范围的数据进行溢出处理,但是如果一个音频帧中溢出数据过多,就会造成音频失真,故要合理的动态的选择放大倍数。

流程如下:

  • 获取一个音频帧中的最大值max和最小值min
  • 根据获取到的最大值和最小值分别计算出在不失真的情况下,允许的放大倍数maxfactorminfactor,取其最小值为允许的最大放大倍数allowfactor
  • 根据给定的经验系数factor,选择合适的系数,对PCM数据放大即可

源码如下:

- (void)raiseVolume:(unsigned char *)buffer length:(UInt32)length factor:(int)factor{
    signed short MIN = -0x8000;
    signed short MAX = 0x7FFF;
    signed short low = 0, high = 0, data = 0, maxData = 0, minData = 0;
    //获取一个音频帧中的最大值`max`和最小值`min`
    for (int i = 0; i < length; i+=2) {
        low = buffer[i];
        high = buffer[i+1];
        data = low+(high<<8);
        maxData = maxData > data ? maxData : data;
        minData = minData < data ? minData : data;
    }
  //根据获取到的最大值和最小值分别计算出在不失真的情况下,允许的放大倍数`maxfactor`和`minfactor`
    signed short maxfactor =  maxData != 0 ? MAX/maxData : 1;
    signed short minfactor =  minData != 0 ? MIN/minData : 1;
    if (minfactor == 1 || maxfactor == 1) {
        return;
    }
    //取其最小值为允许的放大倍数`allowfactor`
    signed short allowfactor = MIN(maxfactor, minfactor);
    //根据经验系数`factor`,选择合适的系数
    factor = factor > allowfactor ? allowfactor : factor;
    if (factor <= 1) {
        return;
    }
    //对PCM数据放大
    signed long newData = 0;
    for (int i = 0; i < length; i+=2) {
        low = buffer[i];
        high = buffer[i+1];
        data = low+(high<<8);
        newData = data*factor;
        //边界值溢出处理
        if (newData < MIN) {
            newData = MIN;
        }else if (newData > MAX) {
            newData = MAX;
        }
        data = newData&0xffff;
        buffer[i] = data&0x00ff;
        buffer[i+1] = (data&0xff00)>>8;
    }
}

相关文章

  • PCM音频数据调整音量

    PCM调整音量 最近接到一个客诉,说是摄像头的音量比较小,需要手机端增强音频信号,经查找研究,解决方案就是:对于P...

  • 调整PCM语音数据的音量

    通过编程实现调整PCM的音量,具体做法是乘上一个固定的数,但是要考虑数据的溢出问题,代码如下: 调整完后效果可以使...

  • Android音视频开发-入门(二)

    目标任务 使用AudioRecord 采集PCM数据 使用AudioTrack API播放PCM音频 将Pcm数据...

  • swift 音频编码

    音频编码: 原始音频数据(PCM)---------------(编码)------------------ 压...

  • 视音频数据处理入门:PCM音频采样数据处理

    本文分别介绍如下几个PCM音频采样数据处理函数:分离PCM16LE双声道音频采样数据的左声道和右声道将PCM16L...

  • ffmpeg 音频转码

    转码一般流程 获取音频数据(AAC,MP3等) 解码(获取音频原始采样数据pcm) 编码(对pcm进行编码) 使用...

  • 【Android】pcm音频数据调节音量大小

    1.前言 最近项目里面有段音频流需要代码控制音量大小,之前是直接推到服务器端用于语音识别的,由于多设备同时在运行,...

  • Android 端音频变声方案

    音频变声实质上是通过调整 PCM 数据的音调、节拍等属性,实现听感上的变化。如果是 mp3、aac 等压缩音频,则...

  • 音视频入门-音频基础(一)

    音频处理流程 直播客户端的处理流程 音频数据的流转PCM:采集数据的格式就是PCM数据(模拟信号转换成数字信号) ...

  • 音视频开发 - pcm、yuv、rgb数据存储

    pcm数据流存储到.pcm音频文件 yuv数据流存储到.yuv视频文件 rgb数据存储为图片

网友评论

      本文标题:PCM音频数据调整音量

      本文链接:https://www.haomeiwen.com/subject/uevczxtx.html