PHPackages                             jade/pcm-to-wav - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. jade/pcm-to-wav

ActiveLibrary

jade/pcm-to-wav
===============

Pcm波形文件转Wav音频文件

v1.0.0(7y ago)2153247MITPHPPHP &gt;=5.4

Since Mar 5Pushed 1y agoCompare

[ Source](https://github.com/Jader/PcmToWav)[ Packagist](https://packagist.org/packages/jade/pcm-to-wav)[ RSS](/packages/jade-pcm-to-wav/feed)WikiDiscussions master Synced today

READMEChangelogDependenciesVersions (2)Used By (0)

PHP 实现PCM转WAV
=============

[](#php-实现pcm转wav)

[![License](https://camo.githubusercontent.com/2d31ca28474d07eede0095efcb6ba709c3416b1c91661d6c0ea91daee72b29ee/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f696e686572652f636f6e736f6c652e737667)](LICENSE)[![Php Version](https://camo.githubusercontent.com/e7e98baca760f621e709aedd13a306b442f54bb470e8c5a113c4b96f0997d836/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d2533453d352e342d627269676874677265656e2e737667)](https://packagist.org/packages/jade/pcm-to-wav)[![Latest Stable Version](https://camo.githubusercontent.com/35b101f7dbcbb4af12585a42c93fccde004e0d85e799182d221e6692c6e1a4cf/687474703a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6a6164652f70636d2d746f2d7761762e737667)](https://packagist.org/packages/jade/pcm-to-wav)

此扩展能快速将PCM格式的音波文件转换成WAV格式的音频文件，目前只为公司项目提供解决方案。

扩展参考于 [helviojunior/WaveGenerator](https://github.com/helviojunior/WaveGenerator) ，在此特别感谢！

安装
--

[](#安装)

```
composer require jade/pcm-to-wav
```

使用
--

[](#使用)

```
use PcmToWave\PcmToWave;

$input_file = './file/test.pcm'; // 准备输入的文件
$output_file = './file/test.wav'; // 预计输出的文件
$data = PcmToWave::init($pcm_file, $wav_file); // 调用转换
```

测试Demo使用
--------

[](#测试demo使用)

```
进入扩展包目录
cd vendor/jade/pcm-to-wav
composer install
cd test
php Test.php
```

原理介绍
----

[](#原理介绍)

### 什么是 `PCM` 和 `WAV` ？

[](#什么是-pcm-和-wav-)

`PCM` ：PCM（Pulse Code Modulation----脉码调制录音)。所谓 `PCM` 录音就是将声音等模拟信号变成符号化的脉冲列，再予以记录。 `PCM` 信号是由 `1` 、 `0` 等符号构成的数字信号，而未经过任何编码和压缩处理。与模拟信号比，它不易受传送系统的杂波及失真的影响。动态范围宽，可得到音质相当好的影响效果。

`WAV` ： `WAV` 是一种无损的音频文件格式， `WAV` 符合 PIFF(Resource Interchange File Format) 规范。所有的 `WAV` 都有一个文件头，这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定，除了 `PCM` 之外，还有几乎所有支持 `ACM` 规范的编码都可以为WAV的音频流进行编码。

### `PCM` 和 `WAV` 的关系

[](#pcm-和-wav-的关系)

简单地说, `PCM` 是音频的原始数据, `WAV` 则是一种封装音频数据的容器, 而且它的格式还很简单, 只是在数据开头添加一些和音频数据相关的头信息。

首先我们看一下WAV的格式规则, 如下图

[![](https://camo.githubusercontent.com/0dfa98bbb0f2a39aa46021be625624665f5a681a91ac8e58fa513119c61e232c/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f6a616465722f7265736f757263652f696d616765732f323032342f3230323430353331313833333832392e6a706567)](https://camo.githubusercontent.com/0dfa98bbb0f2a39aa46021be625624665f5a681a91ac8e58fa513119c61e232c/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f6a616465722f7265736f757263652f696d616765732f323032342f3230323430353331313833333832392e6a706567)

[![](https://camo.githubusercontent.com/c11f90609bc7f347daff17146701c826f16456971d55274537d3a025638ddcba/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f6a616465722f7265736f757263652f696d616765732f323032342f3230323430353331313833343730392e6a706567)](https://camo.githubusercontent.com/c11f90609bc7f347daff17146701c826f16456971d55274537d3a025638ddcba/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f6a616465722f7265736f757263652f696d616765732f323032342f3230323430353331313833343730392e6a706567)

了解这些规则后，我们就可以撸代码吧

1、 `ChunkID` 占4byte, 固定值"RIFF"

```
$ChunkID = array(0x52, 0x49, 0x46, 0x46); // RIFF 16进制的0x52等于10进制中的82，82对应的ASCII码为R

```

2、 `ChunkSize` 占4byte, 值为4 + (8 + SubChunk1Size) + (8 + SubChunk2Size), 其中如果原始数据是PCM, 简化为36 + SubChunk2Size

```
$ChunkSize = array(0x0, 0x0, 0x0, 0x0);
$ChunkSize = self::getLittleEndianByteArray(36 + $dataSize);

```

3、 `Format` 占4byte, 固定值"WAVE"

```
$FileFormat = array(0x57, 0x41, 0x56, 0x45); // WAVE

```

4、 `Subchunk1ID` 占4byte, 固定值"ftm "(注意空格补全4位)

```
$Subchunk1ID = array(0x66, 0x6D, 0x74, 0x20); // fmt

```

5、 `Subchunk1Size` 占4byte, 数据为PCM时, 值为16

```
$Subchunk1Size = array(0x10, 0x0, 0x0, 0x0); // 16 little endian

```

6、 `AudioFormat` 占2byte, 数据为PCM时, 值为1, 其他值表示数据进行过某种压缩

```
$AudioFormat = array(0x1, 0x0); // PCM = 1 little endian

```

7、 `NumChannels` 占2byte, 对应AudioRecord中的channelConfig, 单声道Mono = 1, 立体声Stereo = 2

```
if ($numchannels == 2) {
    $fmt->NumChannels = array(0x2, 0x0); // 立体声为2
} else {
    $fmt->NumChannels = array(0x1, 0x0); // 单声道为1
}

```

8、 `SampleRate` 占4byte, 对应AudioRecord中的sampleRateInHz, 即采样频率, 例如8000, 16000, 44100

```
$SampleRate = self::getLittleEndianByteArray($samplerate);

```

9、 `ByteRate` 占4byte, 值为SampleRate \* BlockAlign

```
self::getLittleEndianByteArray($samplerate * $numchannels * ($bitspersample / 8));

```

10、 `BlockAlign` 占2byte, 值为NumChannels \* BitsPerSample / 8

```
self::getLittleEndianByteArray($numchannels * ($bitspersample / 8), true);

```

11、 `BitsPerSample` 占2byte, 对应AudioRecord中的audioFormat, 8bits = 8, 16bits = 16

```
self::getLittleEndianByteArray($bitspersample, true);

```

12、 `Subchunk2ID` 占4byte, 固定值"data", 即

```
$Subchunk2ID = array(0x64, 0x61, 0x74, 0x61); // data

```

13、 `Subchunk2Size` 占4byte, 描述音频数据的长度, 就是pcm文件大小

```
self::getLittleEndianByteArray(filesize($filename));

```

14、 `Data` 占pcm文件大小个byte, 表示原始的PCM音频数据

`getLittleEndianByteArray` 方法说明

`getLittleEndianByteArray`主要是将传递过来的数进行处理已转换成需要使用的数据，站几字节，就返回多少长度的数组

```
private static function getLittleEndianByteArray($lValue, $short = false)
    {
        $b = array(0, 0, 0, 0);
        $running = $lValue / pow(16, 6);
        $b[3] = floor($running);
        $running -= $b[3];
        $running *= 256;
        $b[2] = floor($running);
        $running -= $b[2];
        $running *= 256;
        $b[1] = floor($running);
        $running -= $b[1];
        $running *= 256;
        $b[0] = round($running);

        if ($short) { // 为 `true` 时返回长度为2的数组
            $tmp = array_slice($b, 0, 2);
            $b = $tmp;
        }

        return $b;
    }

```

整个文件的开头44字节信息也基本说明完了，下面就说下处理类文件的实现，这边处理的逻辑先临时创建一个只有44字节的文件，然后将 `PCM` 文件的数据追加进该文件，最终根据WAV的格式规则实际计算出真实的头部44字节信息并将文件修改指针指向文件开头，然后修改为新产生的数据

###  Health Score

34

—

LowBetter than 77% of packages

Maintenance26

Infrequent updates — may be unmaintained

Popularity31

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity55

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

2625d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/15cdee5d0b94896fa3c2418700372b9cc19e5f43cbb31b115fac4721401e9c38?d=identicon)[Jader](/maintainers/Jader)

---

Top Contributors

[![Jader](https://avatars.githubusercontent.com/u/36842755?v=4)](https://github.com/Jader "Jader (10 commits)")

---

Tags

audioaudio-convertercomposerpcmphpphp-librarywavjadeCmsTop

### Embed Badge

![Health badge](/badges/jade-pcm-to-wav/health.svg)

```
[![Health](https://phpackages.com/badges/jade-pcm-to-wav/health.svg)](https://phpackages.com/packages/jade-pcm-to-wav)
```

###  Alternatives

[pug-php/pug

HAML-like template engine for PHP

393383.2k54](/packages/pug-php-pug)[phug/phug

Pug (ex-Jade) facade engine for PHP, HTML template engine structured by indentation

67292.2k13](/packages/phug-phug)[talesoft/tale-jade

A clean, lightweight and easy-to-use templating engine for PHP based on Jade/Pug

8919.3k5](/packages/talesoft-tale-jade)[talesoft/tale-pug

A clean, lightweight and easy-to-use templating engine for PHP based on Pug, formerly Jade

319.4k3](/packages/talesoft-tale-pug)[lavender/lavender

jade-esque templates for PHP 5.3

175.6k1](/packages/lavender-lavender)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
