Skip to content

Commit 1801caa

Browse files
tijaio
1 parent 8d33916 commit 1801caa

File tree

4 files changed

+118
-1
lines changed

4 files changed

+118
-1
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
接下来我们针对Android高级展开的完整面试题
1818

19-
### 今晚5G音视频专场,掌握音视频编解码,直播,会议,视频码流,低延时,低功耗核心技术
19+
### 互联网的寒冬下,如何手握安卓70万年薪。一堂课带你走进象牙塔
2020

21+
[为什么会发生互联网的寒冬](android/videowhy.md)
2122

23+
[音频降噪原理,音频原理](android/voice.md)
2224

2325
[音视频是什么,视频为什么需要压缩](android/videowhy.md)
2426

@@ -32,6 +34,8 @@
3234

3335
[微信---音视频通话如何实现,视频会议原理](android/mediacodec.md)
3436

37+
[5G时代如何重生移动互联网,带你看看什么是5G应用]()
38+
3539
[小米--万物互联实现原理](android/net.md)
3640

3741
## 2019Android年高级面试

android/img/jiangzao.png

402 KB
Loading

android/img/jiangzao2.png

523 KB
Loading

android/voice.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#### 腾讯-音视频是什么,视频为什么需要压缩
2+
3+
本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个star
4+
5+
> **面试官: 音视频是什么,视频为什么需要压缩**
6+
7+
8+
9+
> **心理分析**:很多人对音视频的概念停留在 苍老师的小电影上,只能理解他是一个视频文件。面试官考的对视频文件下的封装格式,视频文件组成和音视频开发有没相关的概念
10+
11+
> **求职者:**首先需要从视频文件组成开始讲解,慢慢深入到视频编码
12+
13+
`WebRTC`很强大,包含了很多功能,如:音视频采集、编解码、传输、增益、消噪等,还支持跨平台,我这里只用到`WebRTC`的消噪相关模块([点击这里下载](https://link.jianshu.com/?t=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttps%2Fgithub.com%2Fs2eker%2FLBResources%2Fraw%2Fmaster%2FWebRTC%2FWebRtcMoudle.zip)),代码逻辑其实很简单,只用到4个函数
14+
15+
16+
17+
18+
19+
```
20+
1.创建:WebRtcNs_Create
21+
2.初始化:WebRtcNs_Init
22+
3.设置消噪级别:WebRtcNs_set_policy
23+
4.循环取10ms数据,进行消噪处理:WebRtcNs_Process
24+
```
25+
26+
### 具体代码如下:
27+
28+
```objectivec
29+
#include <stdio.h>
30+
#include <stdlib.h>
31+
#include <string.h>
32+
33+
#include "signal_processing_library.h"
34+
#include "noise_suppression_x.h"
35+
#include "noise_suppression.h"
36+
#include "gain_control.h"
37+
38+
@interface AudioManager()
39+
{
40+
NsHandle *_nshandle;
41+
}
42+
43+
@end
44+
45+
@implementation AudioManager
46+
+ (instancetype)sharedInstance {
47+
static id instance = nil;
48+
static dispatch_once_t onceToken;
49+
dispatch_once(&onceToken, ^{
50+
instance = [[self alloc] init];
51+
});
52+
return instance;
53+
}
54+
/**
55+
消噪
56+
57+
@param buffer PCM原始数据
58+
@param length PCM数据长度
59+
@param fs 采样率
60+
@param quality 消噪质量(0,1,2,3),0质量最差,3质量最好
61+
*/
62+
+ (void)denoise:(unsigned char *)buffer length:(NSUInteger)length fs:(NSUInteger)fs quality:(int)quality{
63+
AudioManager *audio = [AudioManager sharedInstance];
64+
NsHandle *nsHandle = NULL;
65+
int level = quality < 0 ? 0 : (quality > 3 ? 3 :quality);
66+
if (audio->_nshandle == NULL) {
67+
if (0 != WebRtcNs_Create(&nsHandle)) {
68+
NSLog(@"WebRTC 创建失败");
69+
return;
70+
}
71+
if (0 != WebRtcNs_Init(nsHandle, (uint32_t)fs)) {
72+
NSLog(@"WebRTC 初始化失败");
73+
return;
74+
}
75+
if (0 != WebRtcNs_set_policy(nsHandle, level)) {
76+
NSLog(@"WebRTC 设置失败");
77+
return;
78+
}
79+
audio->_nshandle = nsHandle;
80+
}else {
81+
nsHandle = audio->_nshandle;
82+
}
83+
NSLog(@"消噪级别=%d", level);
84+
//我们的PCM音频数据为16位,采样率8000Hz,而WebRTC每次只处理10ms的数据,经计算:sizeof(short)*fs/100,即为2*80=160个字节
85+
for (int i = 0; i < length; i+=sizeof(short)*fs/100) {
86+
short inP[80] = {0};
87+
short outP[80] = {0};
88+
memcpy(inP, buffer+i, 80*sizeof(short));
89+
if (0 != WebRtcNs_Process(nsHandle, inP, NULL, outP, NULL)) {
90+
NSLog(@"消噪失败:%d", i);
91+
}
92+
memcpy(buffer+i, outP, 80*sizeof(short));
93+
}
94+
}
95+
```
96+
97+
98+
99+
100+
101+
### 用Audacity软件分析
102+
103+
波形图如下:
104+
105+
![](img/jiangzao.png)
106+
107+
108+
109+
频谱图如下:
110+
111+
![](img/jiangzao2.png)
112+
113+
[开源库Speex编解码](https://link.jianshu.com/?t=http://blog.sina.com.cn/s/blog_4e0987310101nxel.html)

0 commit comments

Comments
 (0)