为pcm数据添加wav头

本文介绍了一种方法,通过程序为PCM数据添加wav头,以验证数据的正确性。提供了相关程序的下载链接。
摘要由CSDN通过智能技术生成

为了测试PCM数据是否正确,写了一个程序,为pcm数据添加wav头,代码网上找的,自己整理了下。

下载编译好的程序: http://download.csdn.net/detail/gavinr/3779759

/**
 * pcm2wav.c 
 * add wav head for pcm data
 */

#include <stdio.h>
#include <string.h>

//wav头的结构如下所示:  
typedef   struct   {  
    char         fccID[4];        
    unsigned   long       dwSize;            
    char         fccType[4];    
}HEADER;  

typedef   struct   {  
    char         fccID[4];        
    unsigned   long       dwSize;            
    unsigned   short     wFormatTag;    
    unsigned   short     wChannels;  
    unsigned   long       dwSamplesPerSec;  
    unsigned   long       dwAvgBytesPerSec;  
    unsigned   short     wBlockAlign;  
    unsigned   short     uiBitsPerSample;  
}FMT;  

typedef   struct   {  
    char         fccID[4];          
    unsigned   long       dwSi
要将PCM数据流封装为WAV文件格式,需要将PCM数据流保存到WAV文件中,并为WAV文件添加相应的文件和元数据WAV文件格式是一种常见的音频文件格式,通常用于存储未经压缩的音频数据。 下面是一个简单的示例代码,演示了如何将PCM数据流封装为WAV文件格式: ```java public static void pcmToWav(String pcmPath, String wavPath, int sampleRate, int channels, int bitPerSample) { FileInputStream pcmInputStream = null; FileOutputStream wavOutputStream = null; long totalAudioLen, totalDataLen; long longSampleRate = sampleRate; int byteRate = bitPerSample * channels * (int) (longSampleRate / 8); try { pcmInputStream = new FileInputStream(new File(pcmPath)); wavOutputStream = new FileOutputStream(new File(wavPath)); totalAudioLen = pcmInputStream.getChannel().size(); totalDataLen = totalAudioLen + 36; byte[] data = new byte[1024]; writeWaveFileHeader(wavOutputStream, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate); while (pcmInputStream.read(data) != -1) { wavOutputStream.write(data); } pcmInputStream.close(); wavOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } private static void writeWaveFileHeader( FileOutputStream outputStream, long totalAudioLen, long totalDataLen, long longSampleRate, int channels, int byteRate) throws IOException { byte[] header = new byte[44]; header[0] = 'R'; // RIFF/WAVE header header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; header[4] = (byte) (totalDataLen & 0xff); header[5] = (byte) ((totalDataLen >> 8) & 0xff); header[6] = (byte) ((totalDataLen >> 16) & 0xff); header[7] = (byte) ((totalDataLen >> 24) & 0xff); header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; header[12] = 'f'; // 'fmt ' chunk header[13] = 'm'; header[14] = 't'; header[15] = ' '; header[16] = 16; // 4 bytes: size of 'fmt ' chunk header[17] = 0; header[18] = 0; header[19] = 0; header[20] = 1; // format = 1 header[21] = 0; header[22] = (byte) channels; header[23] = 0; header[24] = (byte) (longSampleRate & 0xff); header[25] = (byte) ((longSampleRate >> 8) & 0xff); header[26] = (byte) ((longSampleRate >> 16) & 0xff); header[27] = (byte) ((longSampleRate >> 24) & 0xff); header[28] = (byte) (byteRate & 0xff); header[29] = (byte) ((byteRate >> 8) & 0xff); header[30] = (byte) ((byteRate >> 16) & 0xff); header[31] = (byte) ((byteRate >> 24) & 0xff); header[32] = (byte) (2 * 16 / 8); // block align header[33] = 0; header[34] = (byte) bitPerSample; header[35] = 0; header[36] = 'd'; // data chunk header[37] = 'a'; header[38] = 't'; header[39] = 'a'; header[40] = (byte) (totalAudioLen & 0xff); header[41] = (byte) ((totalAudioLen >> 8) & 0xff); header[42] = (byte) ((totalAudioLen >> 16) & 0xff); header[43] = (byte) ((totalAudioLen >> 24) & 0xff); outputStream.write(header, 0, 44); } ``` 在这个示例代码中,我们定义了一个`pcmToWav()`方法,用于将PCM数据流保存为WAV文件。该方法接收三个参数:PCM文件路径、WAV文件路径、采样率、声道数和位宽。在方法中,我们使用FileInputStream读取PCM文件中的数据,并使用FileOutputStream将WAV文件写入磁盘。同时,我们调用了`writeWaveFileHeader()`方法,向WAV文件中添加WAV文件和元数据。在添加WAV文件和元数据时,我们需要根据采样率、声道数和位宽计算出相应的文件和元数据,并将其写入WAV文件中。 通过调用`pcmToWav()`方法,我们可以将PCM数据流保存为WAV文件,并在保存的过程中添加相应的文件和元数据
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值