1 perl脚本
在北大中文论坛看到一位网友问起怎样把大尾的PCM数据播放出来。我以前在工作中碰到过8K采样的PCM数据,当时不清楚wav文件的格式,正好perl模块中有个Audio::Wav模块可以写wav文件,就写了个perl脚本:
use Audio::Wav;
my $wav = new Audio::Wav;
my $sample_rate = 8000;
my $bits_sample = 16;
my $details = {
'bits_sample' => $bits_sample,
'sample_rate' => $sample_rate,
'channels' => 1,
};
my $write = $wav -> write( 'testout.wav', $details );
my $inputFile = "dout.txt";
open (INFILE, "<$inputFile") or die "The file $inputFile ".
"could not be opened.\n";
my @pcm_data = <infile>;
close(INFILE);
my $samp;
foreach $samp(@pcm_data) {
chomp($samp);
$write -> write( $samp );
}
$write -> finish();
</infile>
这几行脚本就可以把PCM数据转换到wav文件。后来我看过wav文件格式,觉得很简单,这次又看到网友提到这个问题,就抽空写了个小程序。
2 pcm2wav
将PCM数据转换成WAV文件其实只是加个文件头。但要做给普通用户用,界面比较费时间。我找了一个以前写的html2txt工程修改一下,花了半个晚上和一个中午,完成了这个pcm2wav程序。
3 实现原理
网上有一篇曹京写的《wav文件格式分析详解》已经介绍过wav文件格式,有兴趣的读者可以查阅。wav文件通常包含4段:RIFF、格式段、FACT段和数据段。 PCM数据就放在数据段。只要格式段设置的格式与数据段的数据一致,播放程序就可以正确解析。下面这个数组的数据其实就是一个最小的wav文件。
static const unsigned char wav_template[] =
{
// RIFF WAVE Chunk
0x52, 0x49, 0x46, 0x46, // "RIFF"
0x30, 0x00, 0x00, 0x00, // 总长度 整个wav文件大小减去ID和Size所占用的字节数
0x57, 0x41, 0x56, 0x45, // "WAVE"
// Format Chunk
0x66, 0x6D, 0x74, 0x20, // "fmt "
0x10, 0x00, 0x00, 0x00, // 块长度
0x01, 0x00, // 编码方式
0x01, 0x00, // 声道数目
0x80, 0x3E, 0x00, 0x00, // 采样频率
0x00, 0x7D, 0x00, 0x00, // 每秒所需字节数=采样频率*块对齐字节
0x02, 0x00, // 数据对齐字节=每个样本字节数*声道数目
0x10, 0x00, // 样本宽度
// Fact Chunk
0x66, 0x61, 0x63, 0x74, // "fact"
0x04, 0x00, 0x00, 0x00, // 块长度
0x00, 0xBE, 0x00, 0x00,
// Data Chunk
0x64, 0x61, 0x74, 0x61, // "data"
0x00, 0x00, 0x00, 0x00, // 块长度
};
这个wav文件的数据长度为0。我们要增加PCM数据只要完成以下工作:
- 在数据段尾增加PCM数据;
- 修改数据段的块长度,修改RIFF段的总长度;
- 正确设置格式段的PCM参数。
样本长度可能不是8的整数倍,这时wav文件还是要求样本按照字节对齐。在一个样本中数据是左对齐的,右侧空位用0填充。 pcm2wav只考虑了样本长度是16位的情况。
如果有多个声道,wav文件要求先放样本1的各声道数据,再放样本2的各声道数据,依此类推。因为我没有碰到过处理多声道数据的需求,所以pcm2wav只考虑了单声道。
4 结束语
用户可以从这里下载pcm2wav程序。如果转换个别文件,其实可以用一个叫WaveCN的程序。不过WaveCN不支持big endian。我现在不怎么用到PCM数据,但写这种简单的程序,其实和打一个小游戏也差不多,一些按部就班,几个小关卡和一点成功的喜悦。
5 后记
根据网友需求,增加了单声道、双声道选择,样本宽度,提供更多采样率,并允许输入采样率。
分享到:
相关推荐
PCM2WAV程序就是为此目的设计的,它可以轻松地将PCM格式的语音文件转换为WAV格式,反之亦然。 转换过程通常涉及以下步骤: 1. 读取输入文件:程序首先读取源文件,无论它是PCM还是WAV,都需要解析文件头以获取必要...
标题"pcm2wav(PCM转换成WAV文件).rar"表明这是一个关于将PCM数据转换为WAV文件的工具或程序的压缩包。这可能包含一个名为"pcm2wav(PCM转换成WAV文件)_Jisuxz.com.exe"的可执行文件,该文件是一个转换工具,用于将PCM...
支持将PCM格式数据转换成多通道wav文件格式数据,PCM数据默认是S16_LE格式,可支持选择通道数以及采样频率,使用方法PCM2WAV -d dump.pcm -c 8 -f 16000 -o dump.wav
在这个场景下,我们关注的是将PCM(脉冲编码调制)音频文件转换为WAV(Waveform Audio Format)文件。PCM是一种未经压缩的原始音频数据格式,而WAV是一种流行的、包含更多元数据的容器格式,广泛用于存储和交换音频...
1、Java实现wav音频文件转换为pcm音频文件(AudioUtils.java) 2、Java实现播放pcm音频文件(PCMPlay.java) WAV:wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都...
- **写入PCM数据**:将从AudioRecord读取的PCM数据追加到WAV文件的数据块。 - **写入WAV尾部**:在数据块之后,更新RIFF头的总文件大小并写入文件。 以下是一个简单的示例代码片段,展示了如何将PCM数据转换为WAV:...
本项目的核心就是将PCM文件转换为WAV文件。转换过程主要涉及以下几个步骤: 1. **读取PCM文件**:首先,我们需要读取PCM文件的数据,这些数据通常包含采样率、位深度(例如16位)、声道数(单声道或立体声)等元...
本示例涉及到将浮点型(float)PCM(脉冲编码调制)数据转换并写入WAV(Waveform Audio File Format)文件的过程。这是一个在C#编程语言中实现的案例,涉及到数组操作和对音频格式的理解。 首先,我们需要理解PCM...
`pcm2wav.zip`中的C++程序是用来将PCM数据转换为WAV文件的。这个过程主要涉及以下几个步骤: 1. **解析PCM数据**:程序首先需要读取PCM文件,提取出连续的采样值。这些采样值可能以不同字节顺序(如大端或小端)和...
在提供的文件`PcmTowav`中,很可能是实现了从PCM数据转换成WAV文件的C代码。通过分析和理解这段代码,你可以更深入地了解如何在实际项目中实现这种转换。在实际操作中,可能还需要根据实际的音频参数(如采样率、位...
WAV文件可以包含PCM编码的数据,也可以包含其他类型的编码,如压缩的ADPCM(Adaptive Differential Pulse Code Modulation)。WAV文件通常包含了文件头信息,描述了音频的采样率、位深度、通道数等参数。由于WAV文件...
本文将深入讲解如何使用C++将WAV格式的音频文件转换为PCM(脉冲编码调制)格式,这是一种常见的数字音频编码方式。 WAV是Windows平台上的无损音频文件格式,它包含了完整的音频波形数据,包括采样率、位深度、通道...
2. 写入PCM数据:将PCM流写入"data"子块,同时更新"data"子块的大小。 3. 修正文件大小:一旦所有数据写入,回溯到RIFF头,更新文件总大小(包括RIFF头的大小)。 在C++中,我们可以使用标准库(如fstream)处理...
4. **处理多通道音频**:如果PCM数据是立体声或其他多通道音频,我们需要按正确的顺序和方式将左右声道或者其他通道的数据合并到WAV文件中。 5. **文件封装**:最后,将头信息和PCM数据封装到一起,形成完整的WAV...
在AI领域,如语音识别系统中,经常需要先将WAV文件转换为PCM数据,然后进行特征提取和模型训练。在游戏开发中,为了减少资源占用,可能会将大的WAV文件转换为更小的PCM格式。 6. 开发注意事项: 在处理PCM和WAV文件...
标题"pcm_wav.zip_WAV_P_pcm_pcm 转_wav_pcm 转换_pcm文件"表明这是一个关于PCM音频文件转换成WAV格式的资源包。在描述中提到,该资源包含了用Delphi编程语言编写的源代码,用于实现这一转换过程。Delphi是一种面向...
标题中的"PCM转WAV.rar_pcm_pcm 转wav_pcm转WAV js_rhythm69z_wav 转 pcm"表明这是一个关于音频格式转换的压缩包,主要涉及PCM(脉冲编码调制)和WAV(Waveform Audio Format)两种音频格式之间的相互转换。PCM是一...
2. **数据转换**:PCM数据是纯数字音频样本,工具会将这些样本按照WAV文件的标准格式进行包装。这可能涉及到对元数据的添加,如写入文件头信息,以及确保数据排列符合WAV规范。 3. **创建WAV文件**:转换完成后,...
4. **写入新的PCM文件**:将提取的PCM数据写入新的文件,此时的文件就是纯PCM格式,没有WAV文件的额外元数据。 5. **反向转换**:从PCM转换回WAV时,需要创建一个新的WAV文件头,包含正确的采样率、位深度和通道数...
在音频处理领域,将PCM文件转换为WAV文件是一项基本操作。这个C程序提供了这样的功能,通过读取PCM文件的采样率和比特率信息,然后将其封装到WAV文件头中,从而实现转换。下面我们将深入探讨这个过程中的关键知识点...