最近在做一款变声App,其中就用到了将pcm格式转wave格式,下面贴出源代码,希望带有需求的童鞋有帮助!!!这里是c++语言写的,也可以用java实现。当然java调用native函数要用到jni技术。具体jni技术自己到网路上找找资料。

Cpp文件Pcm2Wave.cpp

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "wave.h"
#include "constant.h" class Pcm2Wave
{
private:
WAVE_HEAD wave_head;
FILE* src_pcm_file;
FILE* dest_wave_file;
public:
Pcm2Wave()
{
memcpy(&wave_head.riff_char, "RIFF", );
memcpy(&wave_head.wave, "WAVE", );
memcpy(&wave_head.fmt, "fmt ", );
memcpy(&wave_head.fccID, "fact", );
memcpy(&wave_head.data_field, "data", );
wave_head.package_len = ;
wave_head.format_len = ;
wave_head.fixed = ;
wave_head.channel_number = ;
// 采样率 long int samplespersec
wave_head.sample_rate = ; // 量化数 int bitpersamples=8或16
wave_head.bits_per_sample = ;
// 采样一次占字节数 int blockalig
wave_head.byte_per_sample = wave_head.channel_number * wave_head.bits_per_sample / ; //NumChannels * BitsPerSample/8
// 每秒播放字节数 long int bytepersec
wave_head.byte_rate = wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / ; //SampleRate * NumChannels * BitsPerSample /8 wave_head.id = ;
wave_head.dwSize = ; wave_head.data_len = ;
} Pcm2Wave(WAVE_HEAD* pwave_head)
{
if(pwave_head != NULL)
{
memcpy(&wave_head, pwave_head, sizeof(*pwave_head));
}
} ~Pcm2Wave()
{} void set_channel(short pchannel_number)
{
wave_head.channel_number = pchannel_number;
wave_head.byte_per_sample = wave_head.channel_number * wave_head.bits_per_sample / ;
wave_head.byte_rate = wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / ;
} void set_sample_rate(int psample_rate)
{
wave_head.sample_rate = psample_rate;
wave_head.byte_rate = wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / ;
} void set_bits_per_sample(short pbits_per_sample)
{
wave_head.bits_per_sample = pbits_per_sample;
wave_head.byte_per_sample = wave_head.channel_number * wave_head.bits_per_sample / ;
wave_head.byte_rate = wave_head.sample_rate * wave_head.channel_number * wave_head.bits_per_sample / ;
} int change(const char *srcfile, const char *dsetfile)
{
int nFileLen = ;
int nSize = sizeof(wave_head);
printf("wave的头的大小: %d\n", nSize);
src_pcm_file = NULL;
dest_wave_file = NULL;
src_pcm_file = fopen(srcfile, "rb");
if (src_pcm_file == NULL)
return -; dest_wave_file = fopen(dsetfile, "wb+");
if (dest_wave_file == NULL)
return -; int nWrite = fwrite(&wave_head, , nSize, dest_wave_file);
if (nWrite != nSize)
{
fclose(src_pcm_file);
fclose(dest_wave_file);
return -;
} while( !feof(src_pcm_file))
{
char readBuf[];
int nRead = fread(readBuf, , , src_pcm_file);
if (nRead > )
{
fwrite(readBuf, , nRead, dest_wave_file);
} nFileLen += nRead;
}
printf("文件指针位置: %d\n", ftell(dest_wave_file));
//将目的文件的游标指针指向文件的开头
printf("nFileLen的大小: %d\n nSize的大小:%d\n", nFileLen, nSize);
fseek(dest_wave_file, , SEEK_SET); wave_head.package_len = nFileLen - + nSize;
wave_head.data_len = nFileLen;
nWrite = fwrite(&wave_head, , nSize, dest_wave_file);
if (nWrite != nSize)
{
fclose(src_pcm_file);
fclose(dest_wave_file);
return -;
}
fclose(src_pcm_file);
fclose(dest_wave_file); return ;
} }; int main(char args [])
{
Pcm2Wave pp;
pp.set_sample_rate();
pp.change("jj.pcm", "jj.wav");
return ;
}

wave.h头文件

typedef struct WAVE_HEAD
{
char riff_char[]; // "RIFF" char riff_id[4]="RIFF"
int package_len ; //文件总长-8 long int size0=文总长-8
char wave[];
char fmt[];
int format_len;
short fixed; // fmttag=0x01
short channel_number; // channel=1 或2
int sample_rate; // 采样率 long int samplespersec
int byte_rate; // 每秒播放字节数 long int bytepersec
short byte_per_sample; // 采样一次占字节数 int blockalign=声道数*量化数/8
short bits_per_sample; // 量化数 int bitpersamples=8或16
char fccID[]; // must be "fact"
int id; // must be 0x4
int dwSize; // 暂时没发现有啥用
char data_field[]; // data_id="data"
int data_len; // 采样数据字节数 long int size2=文长-44 } WAVE_HEAD;

如何将Pcm格式的音频文件转换成Wave格式的文件的更多相关文章

  1. Python:将utf-8格式的文件转换成gbk格式的文件

    需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...

  2. dvi文件和将dvi文件转换成pdf格式

    dvi文件和将dvi文件转换成pdf格式 Latex只能把tex文件编译成dvi文件, 在cmd 中: 使用xdvi查看dvi格式的文件 若用texstudio编辑tex文件,则可直接将已编译成功的. ...

  3. 将文本(lrc,txt)文件转换成UTF-8格式

    UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到6个字节编码UNICODE字符.用在网页上可以同一 ...

  4. 如何将.crt的ssl证书文件转换成.pem格式

    如何将.crt的ssl证书文件转换成.pem格式 摘自:https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 准备:有一台安装 ...

  5. 怎么将oracle的sql文件转换成mysql的sql文件

    怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...

  6. .net amr格式文件转换成mp3格式文件的方法

    前言:winform端对于音频文件的格式多有限制,大多数不支持amr格式的文件的播放.但是,手机端传过来的音频文件大多数是amr格式的文件,所以,要想在winform客户端支持音频文件的播放,可以通过 ...

  7. 使用jave2将音频wav转换成mp3格式

    最近需要用到语音合成功能,网上查阅了一番,发现可以使用腾讯云的语音合成API来完成这个功能,但是腾讯云的api返回的是wav格式的音频文件,这个格式的文件有些不通用,因此需要转换成mp3格式的文件.  ...

  8. C# Tips: 将 VS2012 / VS2013 的.sln文件、project文件转换成 VS2010格式

    原来有一些VS2013的工程文件(.sln..csproj),使用.Net 4.0.现需要将它们转换成VS2010格式. 经实验,办法如下: (1) 在Solution文件(.sln)中: 把文件头部 ...

  9. 【转】java将excel文件转换成txt格式文件

    在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...

随机推荐

  1. mac/linux查询网络端口占用

    参考:http://www.cnblogs.com/kaiye/archive/2013/05/25/3099393.html netstat命令 netstat -an|grep 8080 lsof ...

  2. win32api win32gui win32con 窗口句柄 发送消息 常用方法

    Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量.接口.线程以及COM机制等等. 1.通过类名和标题查找窗口句柄,并获得窗口位置和 ...

  3. windows安装git客户端

    1:线上git地址 https://github.com/ 2:tortoiseGit地址 http://tortoisegit.org 3:安装步骤 操作系统:Windows XP SP3 Git客 ...

  4. SQL学习笔记之SQL中INNER、LEFT、RIGHT JOIN的区别和用法详解

    0x00 建表准备 相信很多人在刚开始使用数据库的INNER JOIN.LEFT JOIN和RIGHT JOIN时,都不太能明确区分和正确使用这三种JOIN操作,本文通过一个简单的例子通俗易懂的讲解这 ...

  5. CSS Text(文本)

    CSS Text(文本) 一.文本颜色 color 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RGB值 - 如: RGB(255,0,0 ...

  6. xtrabackup备份脚本

    背景:现网环境全备份脚本:基于xtrabackup命令 #!/bin/sh # MySQL端口 PORT=' # 备份用户 USER='bkpuser' PAWD='bkpuser' Time=`da ...

  7. mysql备份脚本-mysqldump

    背景:全库备份 备份流程: 1.生成DB列表,将DB名字写入文件 2.定义备份函数,结果写入SQL文件 3.压缩文件,减少磁盘占用量 4.设置保留天数,定期删除n天之前的 5.通过for循环读取DB列 ...

  8. P(Y|X) 和 P(X,Y)

    P ( x | y ):在Y发生的条件下,X发生的概率.P ( x , y )P(x,y)说明该事件与两个因素有关,比如设是因素A,B.P(x,y)=P{因素A处于x状态,因素B处于y状态}确切地说P ...

  9. creator cocos2d-js-min.js 文件廋身 变小 太大解决方法

    使用的 cocos creator 1.2 版本, 菜单栏 项目 -- 项目设置 -- 模块设置 里面 把不要的模块去掉

  10. linux如何以十六进制格式来查看任意文件

    答:vim+xxd 使用方法如下: 1.vim -b file.txt 2.在vim的命令行模式下对文件进行16进制转换 输入:%!xxd 3.在vim的命令行模式下回到正常格式 输入:%!xxd - ...