【小程序】PCM音量变化

音频数据可以进行很多处理,音量变化是其中一种。尝试将单声道16位采样精度的wav文件的音量,进行大小变化。

目录

  • 功能要求
  • 程序效果
  • 实现步骤
  • 代码示例

功能要求

将单声道16位采样精度的wav文件的音量,进行大小变化。 最小实现,输入直接在代码中给定。 1.输入: 转换前文件:a.wav 转换后文件:b.wav 音量增大倍数:3

2.wav文件头 使用标准头部结构:

类型

大小

资源交换文件标志

4字节

“RIFF”

文件总大小

4字节

与文件大小相关

WAV文件标志

4字节

“WAVE”

波形文件标志

4字节

“fmt ”

wav格式描述块大小

4字节

18

PCM波形格式种类

2字节

1,表示线性PCM编码

通道数

2字节

1,表示单声道

采样频率

4字节

40000次/秒

波形数据传输速率

4字节

80000字节/秒

每帧大小

2字节

2字节

采样精度

2字节

16

额外描述信息

2字节

空,表示没有额外信息

PCM数据开始标志

4字节

“data”

PCM数据大小

4字节

与数据大小相关

程序效果

https://i-blog.csdnimg.cn/blog_migrate/69e52c1250c5e68329c3537e95f55db7.jpeg

音量大小变为原来的3倍。

实现步骤

https://i-blog.csdnimg.cn/blog_migrate/018b363cb632f6881005381807d67a13.jpeg

wav头直接读取拷贝,PCM数据帧部分,每一帧分别乘以系数3之后,写入转换后文件。

代码示例

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     //wav文件头结构
  7.     struct WavHead
  8.     {
  9.         char RIFFId[4];//资源交换文件标志
  10.         unsigned long int RIFFSize;//从下个地址到文件尾的总字节数
  11.         char RIFFType[4];//WAV文件标志
  12.  
  13.         char formatId[4];//波形格式标志
  14.         char formatSize[4]; //wav格式表述块大小
  15.         short int audioFormat; //格式种类,“1”表示“线性PCM编码”
  16.         short int numChannels; //通道数,“1”表示“单声道”,“2”表示“双声道”
  17.         unsigned long int sampleRate; //采样频率
  18.         unsigned long int byteRate; //波形数据传输速率(每秒平均字节数)
  19.         short int blockAlign; //DATA数据块长度
  20.         short int bitsPerSample; //PCM位宽
  21.  
  22.         short int cbSize; //可选部分,额外的描述信息
  23.         char dataId[4];//PCM音频数据部分开始标志
  24.         unsigned long int dataSize; //PCM音频数据部分大小
  25.     }wavHead;
  26.         
  27.     
    //文件操作用的指针
  28.     FILE *fp_source = NULL;
  29.     FILE *fp_target = NULL;
  30.  
  31.     unsigned int frame_size = 16; //帧大小为16bits,根据实际情况调整
  32.     short int *frame_buffer = NULL; //读取每帧的指针,根据实际情况调整
  33.     int vol = 3; //变化系数,3表示变为原来的3倍
  34.  
  35.     fp_source = fopen("a.wav", "rb"); //以只读方式打开a.wav文件
  36.     fp_target = fopen("c.wav", "wb+"); //以刷新写入方式打开b.wav文件
  37.  
  38.     //打开失败时返回错误
  39.     if ((NULL==fp_source) || (NULL==fp_target))
  40.     {
  41.         printf("open file error.\n");
  42.         return -1;
  43.     }
  44.  
  45.     //读取wav头并写入新文件
  46.     fread(&wavHead, 1, sizeof(wavHead), fp_source);
  47.     fwrite(&wavHead, 1, sizeof(wavHead), fp_target);
  48.  
  49.     //读取每一帧音频数据,并进行系数变化
  50.     frame_buffer = (short int*)malloc(frame_size);
  51.     while (frame_size == fread(frame_buffer, 1, frame_size, fp_source))
  52.     {
  53.         *frame_buffer = *frame_buffer*vol;
  54.         //如果超过了最大值,或小于最小值,直接赋成极值情况
  55.         if (*frame_buffer < -0x8000)
  56.         {
  57.             *frame_buffer = -0x8000;
  58.         }else if (*frame_buffer > 0x7FFF)
  59.         {
  60.             *frame_buffer = 0x7FFF;
  61.         }
  62.  
  63.         fwrite(frame_buffer, 1, frame_size, fp_target);
  64.     }
  65.  
  66.     //释放文件资源,释放动态内存指针
  67.     fclose(fp_source);
  68.     fclose(fp_target);
  69.     free(frame_buffer);
  70.  
  71.     return 0;
  72. }
### 实现安卓手机上有线耳机左右声道单独音量控制 在安卓平台上,AudioTrack 类提供了对音频流的低级访问接口。对于左右声道独立音量控制的需求,在应用程序层面可以通过调整 `mVolume` 数组中的两个浮点数值来实现[^2]。 然而需要注意的是,这种操作方式主要适用于自定义音频播放的应用开发场景下,并不是所有类型的音频输出都能被如此精细地调控。特别是当涉及到硬件级别的默认行为时,像普通有线耳机这样的设备通常是按照固定的模式处理立体声音频信号,即左、右声道共享同一个物理按键或系统范围内的音量设置[^1]。 为了实现在 Android 手机上通过有线耳机进行左右声道音量的独立调节,可以考虑如下方法: #### 方法一:利用第三方应用 市场上存在一些专门用于管理音频路由和增强听觉体验的应用程序,它们可能提供更灵活的声音配置选项,包括但不限于每侧耳朵不同的响度水平。不过这取决于具体产品的功能集以及是否兼容目标机型。 #### 方法二:编写定制化服务 如果希望创建一个能够精确控制双耳监听强度的小工具,则需深入研究 Android NDK (Native Development Kit),借助 C/C++ 编写底层逻辑并与 Java/Kotlin 层交互。在此过程中,开发者可以直接操控 AudioTrack 对象并动态修改其属性以达到预期效果。 ```java // 创建一个新的 AudioTrack 实例 AudioTrack audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, sampleRateInHz, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); float[] volumes = {leftChannelVolume, rightChannelVolume}; // 设置左右声道音量比例 audioTrack.setStereoVolume(volumes[0], volumes[1]); ``` 值得注意的是,上述代码片段仅展示了如何初始化一个具备立体声能力的 AudioTrack 并为其指定初始音量参数;实际项目中还需要结合具体的业务需求设计完整的数据传输流程。 另外,考虑到不同版本间 API 的变化情况——例如从 Android 4.1 开始引入了针对 HDMI 输出路径下的多声道支持特性[^3]——建议始终查阅最新的官方文档获取最权威的信息指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值