如何将Pcm格式的音频文件转换成Wave格式的文件
最近在做一款变声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格式的文件的更多相关文章
- Python:将utf-8格式的文件转换成gbk格式的文件
需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...
- dvi文件和将dvi文件转换成pdf格式
dvi文件和将dvi文件转换成pdf格式 Latex只能把tex文件编译成dvi文件, 在cmd 中: 使用xdvi查看dvi格式的文件 若用texstudio编辑tex文件,则可直接将已编译成功的. ...
- 将文本(lrc,txt)文件转换成UTF-8格式
UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到6个字节编码UNICODE字符.用在网页上可以同一 ...
- 如何将.crt的ssl证书文件转换成.pem格式
如何将.crt的ssl证书文件转换成.pem格式 摘自:https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 准备:有一台安装 ...
- 怎么将oracle的sql文件转换成mysql的sql文件
怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...
- .net amr格式文件转换成mp3格式文件的方法
前言:winform端对于音频文件的格式多有限制,大多数不支持amr格式的文件的播放.但是,手机端传过来的音频文件大多数是amr格式的文件,所以,要想在winform客户端支持音频文件的播放,可以通过 ...
- 使用jave2将音频wav转换成mp3格式
最近需要用到语音合成功能,网上查阅了一番,发现可以使用腾讯云的语音合成API来完成这个功能,但是腾讯云的api返回的是wav格式的音频文件,这个格式的文件有些不通用,因此需要转换成mp3格式的文件. ...
- C# Tips: 将 VS2012 / VS2013 的.sln文件、project文件转换成 VS2010格式
原来有一些VS2013的工程文件(.sln..csproj),使用.Net 4.0.现需要将它们转换成VS2010格式. 经实验,办法如下: (1) 在Solution文件(.sln)中: 把文件头部 ...
- 【转】java将excel文件转换成txt格式文件
在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...
随机推荐
- netty8---自定义编码解码器
package com.cn.codc; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Cha ...
- asp.net Mvc 使用uploadify 上传文件 HTTP 302 Error
CSHTML代码 @{ if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) { <input type=" ...
- Web安全学习笔记之Nmap脚本编写
0x00 Nmap脚本简介 夜无眠,看了一下Nmap官方的英文API文档(全是English),瞬间心态崩塌,不想吐槽它们的nmap官网前端太丑了=.=,但是都是大牛啊,挺敬佩开源开发者的. Nmap ...
- LSTM-based Encoder-Decoder for Multi-sensor Anomaly Detection
1.主要工作是将机械设备的传感器数据,LSTM-encoder-decoder模型输入正常数据时间序列训练模型,重构时间序列,然后使用异常数据进行测试,产生较高的重构错误,表明时间序列数据为异常的. ...
- 20145314郑凯杰 《Java程序设计》实验四 实验报告
20145314郑凯杰 <Java程序设计>实验四 实验报告 实验要求 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用 ...
- Centos7 Python3.x源码安装
第一步,安装开发工具集 yum -y groupinstall "Development tools" 第二步,安装相关依赖包: yum -y install zlib-devel ...
- CentOS 6.2配置本地yum源
转载自http://www.cnblogs.com/centoser/articles/2411694.html#undefined 一.挂载本地光盘到系统:把Cent6.2安装光盘放入光驱,在终端命 ...
- Servlet3.0与Spring
servlet filter listener web.xml DispatcherServlet web.xml 后期 servlet3.0我们去除web.xml 通过注解方式 同时需要s ...
- [转][修]C清空输入缓冲区
为何要清空输入缓存区 读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下scanf()函数可以根据返回值判断成功取走的数目:但当发生读取异常之后,输入缓冲区中的内容并未被取走, ...
- 如何确保C#的应用程序只被打开一次
http://stackoverflow.com/questions/184084/how-to-force-c-sharp-net-app-to-run-only-one-instance-in-w ...