最近在做一款变声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. netty7---自定义序列化接口

    package com.cn.core; import java.nio.ByteOrder; import java.nio.charset.Charset; import java.util.Ar ...

  2. 查看ubuntu 各系统的内核版本

    1.查看ubuntu版本号:   cat  /etc/issue 返回结果: Ubuntu 16.04.2 LTS \n \l   2.查看内核版本号:   cat /proc/version 返回结 ...

  3. JS正则表达式从入门到入土(9)—— test方法以及它的那些坑

    test方法 test方法介绍 RegExp.prototype.test(str) test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串 test方法的使用 let reg = /\w ...

  4. wix toolset将 cab 打包进msi

    在***wxs中添加配置 <MediaTemplate EmbedCab="yes" /> 下面是一个简单配置:(包含写注册表) <?xml version=&q ...

  5. 20145302张薇《Java程序设计》第十周学习总结

    20145302 <Java程序设计>第十周学习总结 客户端和服务器端功能 客户端程序功能列表: 接收用户控制台输入 判断输入内容是否合法 按照协议格式发送数据 根据服务器端的反馈给出相应 ...

  6. Java之JNDI详解

    转载自(http://blog.csdn.net/u010430304/article/details/54601302) JNDI的基本应用         JNDI是Java Naming and ...

  7. bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组

    1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Descrip ...

  8. brew 与 nvm

    brew  与 nvm 是两个管理软件工具 今天更新了brew结果brew下安装的软件都找不着了.得重新安装,据说brew已经不再更新了.应该是通过github的吧. 结果得重装node与npm,这两 ...

  9. .Net遍历窗体上控件

    实现遍历窗体上的控件以及找出TextBox控件,代码如下: foreach( Control control in this.Controls ) { if( control is TextBox ) ...

  10. C# ContentType: "application/json" 请求方式传json参数问题

    处理Http请求时遇到的ContentType为application/json方式,记录下这种Post请求方式下如何传json参数: var request = (HttpWebRequest)We ...