Skip to content

Commit 882df39

Browse files
committed
Update
1 parent 5b8a8d6 commit 882df39

File tree

5 files changed

+471
-68
lines changed

5 files changed

+471
-68
lines changed

01_文章/02_重识声音.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,16 @@
168168

169169
**音调**是由**基音**决定的,而**音色**主要取决于**泛音**
170170

171+
从下图可以看得出来,音色不同,波形也就不同。
172+
173+
![不同乐器的波形](https://img2020.cnblogs.com/blog/497279/202104/497279-20210408094902031-163154257.jpg)
174+
175+
下图形象生动地展示了:声音的最终波形是由多个不同的波形组合而成的。
176+
177+
![](https://img2020.cnblogs.com/blog/497279/202104/497279-20210408094904934-2003923078.gif)
178+
179+
![](https://img2020.cnblogs.com/blog/497279/202104/497279-20210408094907820-412969234.gif)
180+
171181
## 噪音
172182

173183
### 物理学角度

01_文章/04_Windows开发环境搭建.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ FFmpeg的名字由FF和mpeg组成。
3535
网上已经有编译好的FFmpeg,目前最新的Release版本是4.3.2,可以直接下载到项目中进行开发使用。
3636

3737
- [Windows版本下载]( https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-github )[ffmpeg-4.3.2-2021-02-27-full_build-shared.7z](https://github.com/GyanD/codexffmpeg/releases/download/4.3.2-2021-02-27/ffmpeg-4.3.2-2021-02-27-full_build-shared.7z)
38-
- 源码下载:[ffmpeg-4.3.2.tar.xz](http://ffmpeg.org/releases/ffmpeg-4.3.2.tar.xz)
38+
- 源码下载:[ffmpeg-4.3.2.tar.xz](https://ffmpeg.org/releases/ffmpeg-4.3.2.tar.xz)
3939
- 网上编译好的FFmpeg一般是完整版,体积比较大
4040
- 日后我们可以根据实际需要,对FFmpeg的源码进行裁剪后再进行重新编译
4141

01_文章/10_PCM转WAV.md

Lines changed: 22 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -60,60 +60,8 @@ ffmpeg -ar 44100 -ac 2 -f s16le -i out.pcm -bitexact out2.wav
6060
WAV的文件头结构大概如下所示:
6161

6262
```cpp
63-
typedef struct {
64-
// RIFF chunk的id
65-
char chunkId[4] = {'R', 'I', 'F', 'F'};
66-
// RIFF chunk的data大小,即文件总长度减去8字节
67-
uint32_t chunkSize;
68-
// "WAVE"
69-
char format[4] = {'W', 'A', 'V', 'E'};
70-
71-
/* fmt chunk */
72-
// fmt chunk的id
73-
char subchunk1Id[4] = {'f', 'm', 't', ' '};
74-
// fmt chunk的data大小:存储PCM数据时,是16
75-
uint32_t subchunk1Size = 16;
76-
// 音频编码,1表示PCM,3表示Floating Point
77-
uint16_t audioFormat = 1;
78-
// 声道数
79-
uint16_t numChannels;
80-
// 采样率
81-
uint32_t sampleRate;
82-
// 字节率 = sampleRate * blockAlign
83-
uint32_t byteRate;
84-
// 一个样本的字节数 = bitsPerSample * numChannels / 8
85-
uint16_t blockAlign;
86-
// 位深度
87-
uint16_t bitsPerSample;
88-
89-
/* data chunk */
90-
// data chunk的id
91-
char subchunk2Id[4] = {'d', 'a', 't', 'a'};
92-
// data chunk的data大小:音频数据的总长度,即文件总长度减去文件头的长度
93-
uint32_t subchunk2Size;
94-
} WAVHeader;
95-
```
96-
97-
### 宏定义
98-
99-
```cpp
100-
// 采样率
101-
#define SAMPLE_RATE 44100
102-
// 采样大小
103-
#define SAMPLE_SIZE 16
104-
// 声道数
105-
#define CHANNELS 2
106-
// 字节率
107-
#define BYTE_RATE (SAMPLE_RATE * SAMPLE_SIZE * CHANNELS / 8)
108-
```
109-
110-
### PCM转WAV核心实现
111-
112-
封装到了FFmpegs类的pcm2wav函数中。
113-
114-
```cpp
115-
#include <QFile>
116-
#include <QDebug>
63+
#define AUDIO_FORMAT_PCM 1
64+
#define AUDIO_FORMAT_FLOAT 3
11765

11866
// WAV文件头(44字节)
11967
typedef struct {
@@ -131,7 +79,7 @@ typedef struct {
13179
// fmt chunk的data大小:存储PCM数据时,是16
13280
uint32_t fmtChunkDataSize = 16;
13381
// 音频编码,1表示PCM,3表示Floating Point
134-
uint16_t audioFormat = 1;
82+
uint16_t audioFormat = AUDIO_FORMAT_PCM;
13583
// 声道数
13684
uint16_t numChannels;
13785
// 采样率
@@ -149,6 +97,15 @@ typedef struct {
14997
// data chunk的data大小:音频数据的总长度,即文件总长度减去文件头的长度(一般是44)
15098
uint32_t dataChunkDataSize;
15199
} WAVHeader;
100+
```
101+
102+
### PCM转WAV核心实现
103+
104+
封装到了FFmpegs类的pcm2wav函数中。
105+
106+
```cpp
107+
#include <QFile>
108+
#include <QDebug>
152109

153110
class FFmpegs {
154111
public:
@@ -161,12 +118,18 @@ public:
161118
void FFmpegs::pcm2wav(WAVHeader &header,
162119
const char *pcmFilename,
163120
const char *wavFilename) {
121+
header.blockAlign = header.bitsPerSample * header.numChannels >> 3;
122+
header.byteRate = header.sampleRate * header.blockAlign;
123+
164124
// 打开pcm文件
165125
QFile pcmFile(pcmFilename);
166126
if (!pcmFile.open(QFile::ReadOnly)) {
167127
qDebug() << "文件打开失败" << pcmFilename;
168128
return;
169129
}
130+
header.dataChunkDataSize = pcmFile.size();
131+
header.riffChunkDataSize = header.dataChunkDataSize
132+
+ sizeof (WAVHeader) - 8;
170133

171134
// 打开wav文件
172135
QFile wavFile(wavFilename);
@@ -196,20 +159,12 @@ void FFmpegs::pcm2wav(WAVHeader &header,
196159
### 调用函数
197160
198161
```cpp
199-
// 文件名
200-
const char *pcmFilename = "F:/in.pcm";
201-
const char *wavFilename = "F:/out.wav";
202-
203162
// 封装WAV的头部
204163
WAVHeader header;
205-
header.numChannels = CHANNELS;
206-
header.sampleRate = SAMPLE_RATE;
207-
header.bitsPerSample = SAMPLE_SIZE;
208-
header.blockAlign = CHANNELS * SAMPLE_SIZE >> 3;
209-
header.byteRate = SAMPLE_RATE * header.blockAlign;
210-
header.subchunk2Size = size;
211-
header.chunkSize = size + sizeof (WAVHeader) - 8;
164+
header.numChannels = 2;
165+
header.sampleRate = 44100;
166+
header.bitsPerSample = 16;
212167
213168
// 调用函数
214-
FFmpegs::pcm2wav(header, pcmFilename, wavFilename);
169+
FFmpegs::pcm2wav(header, "F:/in.pcm", "F:/out.wav");
215170
```

0 commit comments

Comments
 (0)