Skip to content

Commit 74749ea

Browse files
committed
day 27
1 parent 5a9841f commit 74749ea

16 files changed

+1212
-23
lines changed

01_文章/08_音频录制02_编程.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,4 +259,30 @@ void AudioThread::run() {
259259
// ...
260260
}
261261
}
262+
```
263+
264+
### 改造录音代码
265+
266+
```cpp
267+
// 数据包
268+
AVPacket *pkt = av_packet_alloc();
269+
while (!isInterruptionRequested()) {
270+
// 从设备中采集数据,返回值为0,代表采集数据成功
271+
ret = av_read_frame(ctx, pkt);
272+
273+
if (ret == 0) { // 读取成功
274+
// 将数据写入文件
275+
file.write((const char *) pkt->data, pkt->size);
276+
277+
// 释放资源
278+
av_packet_unref(pkt);
279+
} else if (ret == AVERROR(EAGAIN)) { // 资源临时不可用
280+
continue;
281+
} else { // 其他错误
282+
char errbuf[1024];
283+
av_strerror(ret, errbuf, sizeof (errbuf));
284+
qDebug() << "av_read_frame error" << errbuf << ret;
285+
break;
286+
}
287+
}
262288
```

01_文章/21_显示BMP图片.md

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ SDL_Renderer *renderer = nullptr;
3030
SDL_Surface *surface = nullptr;
3131
// 纹理(直接跟特定驱动程序相关的像素数据)
3232
SDL_Texture *texture = nullptr;
33-
// 事件
34-
SDL_Event event;
3533
```
3634

3735
## 初始化子系统
@@ -114,16 +112,11 @@ END(SDL_RenderCopy(renderer, texture, nullptr, nullptr),
114112
SDL_RenderPresent(renderer);
115113
```
116114

117-
## 监听退出事件
115+
## 延迟退出
118116

119117
```cpp
120-
// 监听退出事件
121-
while (!isInterruptionRequested()) {
122-
END(!SDL_WaitEvent(&event), SDL_WaitEvent);
123-
if (event.type == SDL_QUIT) {
124-
break;
125-
}
126-
}
118+
// 延迟3秒退出
119+
SDL_Delay(3000);
127120
```
128121
129122
## 释放资源

01_文章/22_显示YUV图片.md

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
> 文本的主要内容是:使用[SDL](https://www.cnblogs.com/mjios/p/14581738.html#toc_title_1)显示一张YUV图片,整体过程跟《[显示BMP图片](https://www.cnblogs.com/mjios/p/14733502.html)》比较像。
2+
3+
## 宏定义
4+
5+
```cpp
6+
#include <SDL2/SDL.h>
7+
#include <QDebug>
8+
9+
#define END(judge, func) \
10+
if (judge) { \
11+
qDebug() << #func << "error" << SDL_GetError(); \
12+
goto end; \
13+
}
14+
15+
#define FILENAME "F:/res/in.yuv"
16+
#define PIXEL_FORMAT SDL_PIXELFORMAT_IYUV
17+
#define IMG_W 512
18+
#define IMG_H 512
19+
```
20+
21+
## 变量定义
22+
23+
```cpp
24+
// 窗口
25+
SDL_Window *window = nullptr;
26+
27+
// 渲染上下文
28+
SDL_Renderer *renderer = nullptr;
29+
30+
// 纹理(直接跟特定驱动程序相关的像素数据)
31+
SDL_Texture *texture = nullptr;
32+
33+
// 文件
34+
QFile file(FILENAME);
35+
```
36+
37+
## 初始化子系统
38+
39+
```cpp
40+
// 初始化Video子系统
41+
END(SDL_Init(SDL_INIT_VIDEO), SDL_Init);
42+
```
43+
44+
## 创建窗口
45+
46+
```cpp
47+
// 创建窗口
48+
window = SDL_CreateWindow(
49+
// 窗口标题
50+
"SDL显示YUV图片",
51+
// 窗口X(未定义)
52+
SDL_WINDOWPOS_UNDEFINED,
53+
// 窗口Y(未定义)
54+
SDL_WINDOWPOS_UNDEFINED,
55+
// 窗口宽度(跟图片宽度一样)
56+
surface->w,
57+
// 窗口高度(跟图片高度一样)
58+
surface->h,
59+
// 显示窗口
60+
SDL_WINDOW_SHOWN
61+
);
62+
END(!window, SDL_CreateWindow);
63+
```
64+
65+
## 创建渲染上下文
66+
67+
```cpp
68+
// 创建渲染上下文(默认的渲染目标是window)
69+
renderer = SDL_CreateRenderer(window, -1,
70+
SDL_RENDERER_ACCELERATED |
71+
SDL_RENDERER_PRESENTVSYNC);
72+
if (!renderer) { // 说明开启硬件加速失败
73+
renderer = SDL_CreateRenderer(window, -1, 0);
74+
}
75+
END(!renderer, SDL_CreateRenderer);
76+
```
77+
78+
## 创建纹理
79+
80+
```cpp
81+
// 创建纹理
82+
texture = SDL_CreateTexture(renderer,
83+
PIXEL_FORMAT,
84+
SDL_TEXTUREACCESS_STREAMING,
85+
IMG_W, IMG_H);
86+
END(!texture, SDL_CreateTexture);
87+
```
88+
89+
## 打开文件
90+
91+
```cpp
92+
// 打开文件
93+
if (!file.open(QFile::ReadOnly)) {
94+
qDebug() << "file open error" << FILENAME;
95+
goto end;
96+
}
97+
```
98+
99+
## 渲染
100+
101+
```cpp
102+
// 将YUV的像素数据填充到texture
103+
END(SDL_UpdateTexture(texture, nullptr, file.readAll().data(), IMG_W),
104+
SDL_UpdateTexture);
105+
106+
// 设置绘制颜色(画笔颜色)
107+
END(SDL_SetRenderDrawColor(renderer,
108+
0, 0, 0, SDL_ALPHA_OPAQUE),
109+
SDL_SetRenderDrawColor);
110+
111+
// 用绘制颜色(画笔颜色)清除渲染目标
112+
END(SDL_RenderClear(renderer),
113+
SDL_RenderClear);
114+
115+
// 拷贝纹理数据到渲染目标(默认是window)
116+
END(SDL_RenderCopy(renderer, texture, nullptr, nullptr),
117+
SDL_RenderCopy);
118+
119+
// 更新所有的渲染操作到屏幕上
120+
SDL_RenderPresent(renderer);
121+
```
122+
123+
## 延迟退出
124+
125+
```cpp
126+
// 延迟3秒退出
127+
SDL_Delay(3000);
128+
```
129+
130+
## 释放资源
131+
132+
```cpp
133+
end:
134+
file.close();
135+
SDL_DestroyTexture(texture);
136+
SDL_DestroyRenderer(renderer);
137+
SDL_DestroyWindow(window);
138+
SDL_Quit();
139+
```

0 commit comments

Comments
 (0)