最近在做一款变声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. git命令学习汇总

    GIT 版本控制常用命令汇总 git version 查看当前git版本信息 git help 获取全部命令帮助信息 git help <command> 获取指定命令帮助信息 git c ...

  2. python error: curl: (1) Protocol "'https" not supported or disabled in libcurl

    python 调用curl访问一个网页时,出现error: curl: (1) Protocol "'https" not supported or disabled in lib ...

  3. 20145103《JAVA程序设计》课程总结

    每周读书笔记链接汇总 假期笔记 http://www.cnblogs.com/20145103fwh/p/5248170.html 第一周读书笔记 http://www.cnblogs.com/201 ...

  4. 《Java程序设计》实验2实验报告

    20145318 <Java程序设计>实验2 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 ...

  5. ImportError: No module named Crypto.PublicKey

    答: sudo apt-get install python-pip  (如果没有安装pip的话,需要这一操作) pip install pycrypto

  6. LeetCode——3Sum Closest

    Question Given an array S of n integers, find three integers in S such that the sum is closest to a ...

  7. Codeforces Round #365 (Div. 2) B - Mishka and trip

    http://codeforces.com/contest/703/problem/B 题意: 每个点都有一个值,每条边的权值为这两个点相乘.1~n成环.现在有k个城市,城市与其他所有点都相连,计算出 ...

  8. java 集合操作小结

    Map<String,String> m1=new HashMap<String,String>(); m1.put("zara", "name1 ...

  9. BZOJ4787/UOJ290 【ZJOI2017】仙人掌

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  10. python一个元素全为数的列表做差分

    woc = [7, 5, 7, 3, 5, 1, 2] diff = [ wo[i]-wo[i+1] for i in range(len(wo)-1) ]