自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (10)
  • 收藏
  • 关注

原创 如何使用webRTC检测音视频设备

音频输入设备的主要工作是采集音频数据,而采集音频数据的本质就是模数转换(A/D),即将模似信号转换成数字信号。模数转换使用的采集定理称为奈奎斯特定理,其内容如下:在进行模拟 / 数字信号的转换过程中,当采样率大于信号中最高频率的 2 倍时,采样之后的数字信号就完整地保留了原始信号中的信息。你也知道,人类听觉范围的频率是 20Hz~20kHz 之间。对于日常语音交流(像电话),8kHz 采样率就可以满足人们的需求。

2023-07-11 15:41:57 252

原创 使用浏览器访问摄像头

这幅图从大的方面可以分为 4 部分,即两个 WebRTC 终端(上图中的两个大方框)、一个 Signal(信令)服务器和一个 STUN/TURN 服务器。WebRTC 终端,负责音视频采集、编解码、NAT 穿越、音视频数据传输。Signal 服务器,负责信令处理,如加入房间、离开房间、媒体协商消息的传递等。STUN/TURN 服务器,负责获取 WebRTC 终端在公网的 IP 地址,以及 NAT 穿越失败后的数据中转。

2023-07-11 15:23:25 263

原创 RWMutex:读写锁的实现原理及避坑指南

我先简单解释一下读写锁 RWMutex。标准库中的 RWMutex 是一个 reader/writer 互斥锁。RWMutex 在某一时刻只能由任意数量的 reader 持有,或者是只被单个的 writer 持有。RWMutex 的方法也很少,总共有 5 个。Lock/Unlock:写操作时调用的方法。如果锁已经被 reader 或者 writer 持有,那么,Lock 方法会一直阻塞,直到能获取到锁;Unlock 则是配对的释放锁的方法。RLock/RUnlock:读操作时调用的方法。

2023-04-10 17:59:30 230

原创 Mutex:如何拓展额外功能?

我们学习了互斥锁 Mutex 的基本用法、实现原理以及易错场景,可以说是涵盖了互斥锁的方方面面。如果你能熟练掌握这些内容,那么,在大多数的开发场景中,你都可以得心应手。但是,在一些特定的场景中,这些基础功能是不足以应对的。这个时候,我们就需要开发一些扩展功能了。我来举几个例子。比如说,我们知道,如果互斥锁被某个 goroutine 获取了,而且还没有释放,那么,其他请求这把锁的 goroutine,就会阻塞等待,直到有机会获得这把锁。

2023-04-10 17:21:12 147

原创 Mutex:4种易错场景大盘点

正常使用 Mutex 时,确实是这样的,很简单,基本不会有什么错误,即使出现错误,也是在一些复杂的场景中,比如跨函数调用 Mutex 或者是在重构或者修补 Bug 时误操作。但是,我们使用 Mutex 时,确实会出现一些 Bug,比如说忘记释放锁、重入锁、复制已使用了的 Mutex 等情况。那在这一讲中,我们就一起来看看使用 Mutex 常犯的几个错误,做到“Bug 提前知,后面早防范”。

2023-04-07 16:55:52 297

原创 Mutex:解决资源并发访问问题?

说起并发访问问题,真是太常见了,比如多个 goroutine 并发更新同一个资源,像计数器;同时更新用户的账户信息;秒杀系统;往同一个 buffer 中并发写入数据等等。如果没有互斥控制,就会出现一些异常情况,比如计数器的计数不准确、用户的账户可能出现透支、秒杀系统出现超卖、buffer 中的数据混乱,等等,后果都很严重。这些问题怎么解决呢?对,用互斥锁,那在 Go 语言里,就是 Mutex。我会带你详细了解互斥锁的实现机制,以及 Go 标准库的互斥锁 Mutex 的基本使用方法。

2023-04-04 15:54:59 109

原创 哪些Linux 系统配置影响tcp连接的建立及断开的过程

tcp连接的建立受哪些配置项的影响?tcp连接过程TCP 连接的建立是一个从 Client 侧调用 connect(),到 Server 侧 accept() 成功返回的过程。你可以看到,在整个 TCP 建立连接的过程中,各个行为都有配置选项来进行控制。Client 调用 connect() 后,Linux 内核就开始进行三次握手。首先 Client 会给 Server 发送一个 SYN 包,但是该 SYN 包可能会在传输过程中丢失,或者因为其他原因导致 Server 无法处理,此时 Client 这一侧

2023-01-28 10:07:32 161

原创 音视频同步

音视频同步是什么呢?它就是指在音视频数据播放的时候,播放的画面和声音是需要同步的,是能对得上的。相信你一定遇到过这种情况,就是看电视、电影或者直播的时候,人的口型和声音是对不上的,这样看起来会让人非常难受,这种问题就是音视频不同步导致的。因此做好音视频同步是非常重要的,当然也会有一定的难度,我们不妨先从一些基础知识讲起。

2023-01-18 10:36:38 331

原创 音视频封装: FLV & MP4

音视频封装其实就是将一帧帧视频和音频数据按照对应封装的标准有组织地存放在一个文件里面,并且再存放一些额外的基础信息,比如说分辨率、采样率等信息。那到底怎么组织这些基础信息还有音视频数据呢?我们接下来先看看 FLV 是怎么做的。

2023-01-18 10:26:19 270

原创 卡顿与花屏问题

视频卡顿是在实时视频通话场景中非常重要的一个问题。卡顿率也是实时通话场景中一个非常重要的指标。一般来说,人眼在帧率达到 10fps 并且均匀播放时就不太能看出来卡顿了。如果两帧之间的播放时间间隔超过了 200ms,人眼就可以明显看出卡顿了。那一般什么情况下会导致两帧之间的播放时间间隔超过 200ms 呢?我们下面一个个来分析一下,并给出相应的解决方法。

2023-01-18 09:57:28 373

原创 视频码 率控制

码控,顾名思义,就是码率控制,它是编码器的一个重要模块,主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分,但是它并不是编码标准的一部分,也就是说,标准并没有给码控设定规则。我们平时用的编码器的码控都是编码器程序自己实现的。那码控的原理是什么呢?其实码控就是为每一帧编码图像选择一个合适的 QP 值的过程。我们知道当一帧图像的画面确定了之后,画面的复杂度和 QP 值几乎决定了它编码之后的大小。

2023-01-18 09:35:07 430

原创 RTP 协议、RTCP 协议和 H264 的 RTP 打包方法

RTP(Real-time Transport Protocol)协议,全称是实时传输协议。它主要用于音视频数据的传输。那它的作用是什么呢?一般我们在实时通信的时候,需要传输音频和视频数据。我们通常是这样做的,先将原始数据经过编码压缩之后,再将编码码流传输到接收端。在传输的时候我们通常不会直接将编码码流进行传输,而是先将码流打包成一个个 RTP 包再进行发送。那为什么需要打包成 RTP 包呢?这是因为我们的接收端要能够正确地使用这些音视频编码数据,不仅仅需要原始的编码码流,还需要一些额外的信息。

2023-01-18 08:36:11 545

原创 帧间预测: 减少时间冗余

视频在 1 秒钟内有很多帧图像,其通过帧率来表示。一般来说帧率为 24fps 或者 30fps,也就是指,1 秒钟会有多达 24 帧或者 30 帧图像。但是其实在自然状态下,人或者物体的运动速度在 1 秒钟之内引起的画面变化并不大,且自然运动是连续的。所以前后两帧图像往往变化比较小,这就是视频的时间相关性。帧间预测就是利用这个特点来进行的。通过在已经编码的帧里面找到一个块来预测待编码块的像素,从而达到减少时间冗余的目的。

2023-01-18 07:11:14 304

原创 帧内预测:减少空间冗余

视频编码是以块为单位进行的。在 H264 标准里面,块分为宏块和子块。宏块的大小是 16 x 16(YUV 4:2:0 图像亮度块为 16 x 16,色度块为 8 x 8)。在帧内预测中,亮度宏块可以继续划分成 16 个 4 x 4 的子块。因为图像中有的地方细节很多,我们需要划分成更小的块来做预测会更精细,所以会将宏块再划分成 4 x 4 的子块。如下图所示:帧内预测是根据块的大小分为不同的预测模式的。还有一个点就是亮度块和色度块的预测是分开进行的。

2023-01-17 14:17:45 167

原创 视频编码的码流 结构

这里有一些前置知识我们需要先了解一下。我们先一起来看几个重要的概念吧。它们之间有这样一条线索,你在接下来的学习中可以重点关注一下,对于你记忆它们也是非常有帮助的。首先,清楚帧类型是图像的基础;其次,GOP 是以其中的 IDR 帧作为分隔点的;最后的Slice 是我们深入帧内部以后的一个重要概念。整个过程,由浅入深。

2023-01-17 13:57:31 199

原创 视频编码原理

视频编码是对一帧帧图像来进行的。一般我们所熟知的彩色图像的格式是 RGB 的,即用红绿蓝三个分量的组合来表示所有颜色。但是,RGB 三个颜色是有相关性的,为了去掉这个相关性,减少需要编码的信息量,我们通常会把 RGB 转换成 YUV,也就是 1 个亮度分量和 2 个色度分量。另外,人眼对于亮度信息更加敏感,而对于色度信息稍弱,所以视频编码是将 Y 分量和UV 分量分开来编码的。

2023-01-17 13:37:45 373

原创 如何缩放图像?

列举 3 种用到图像缩放的情形:情形 1:播放窗口与原始图像分辨率不匹配的时候需要缩放。这和我刚才举的例子是一样的情况。情形 2:我们在线观看视频时会有多种分辨率可以选择,即需要在一个图像分辨率的基础上缩放出多种不同尺寸的图像出来做编码,并保存多个不同分辨率的视频文件。情形 3:RTC 场景,有的时候我们需要根据网络状况实时调节视频通话的分辨率。这个也是需要缩放算法来完成的。所以,我们可以看到图像的缩放算法是一个很常用的技术,且它是非常重要的。

2023-01-17 10:51:18 444

原创 YUV & RGB

RGB 相对比较简单。顾名思义,它就是指图像的每一个像素都有 R、G、B 三个值。RGB是我们平常遇到最多的一种图像颜色空间,比如摄像头采集的原始图像就是 RGB 图像,且显示器显示的图像也是 RGB 图像。一般来说,我们的 RGB 图像,每一个像素都是分别存储 R、G、B 三个值,且三个值依次排列存储。比如对于一张 8bit 位深的 RGB 图,每个值占用一个字节。但是,需要注意的是 RGB 图像像素中 R、G、B 三个值并不一定是按 R、G、B 顺序排列的,也有可能是 B、G、R 顺序排列。

2023-01-17 10:32:04 146

原创 视频图像的基本概念

像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中,你可以看到一个个方块,这些方块就是像素。那一张图片有多少个像素呢?要回答这个问题就需要引出另外一个非常重要的概念——分辨率。

2023-01-17 10:13:21 648

原创 变调、均衡器、混响

其实在之前讲弱网对抗部分的时候,我们在做快慢放操作时就使用到了变速不变调算法,这其实是变调算法中的一种用法。在讲算法具体实现之前我们先想一下,变调的物理含义是什么?之前我们讲语音信号分析的时候说过,不同的人发音的基频是不一样的。而音调和基频是直接相关的,要变调其实就是要改变基频。而基频的本质是一个信号的循环周期的倒数,比如基频是 250Hz,那么当前时间的语音信号就是以 4ms 为周期的信号。我们要变调,其实就是把这个循环周期进行扩大或者缩小。

2023-01-17 08:55:18 418

原创 利用HRTF实现听音辨位

上节课我们讲的“双耳效应”实际上就是空间中音源的声波从不同的方向传播到左右耳的路径不同,所以音量、音色、延迟在左右耳会产生不同的变化。其实这些声波变化的过程就是我们说的声波的空间传递函数,是不是很耳熟?我们在讲回声消除的时候就是通过计算回声的空间传递函数来做回声信号估计的。

2023-01-17 08:43:19 673

原创 空间音频技术入门

所谓空间音频的技术,就是把现实中这些对声音的感知,能够用空间音频采集设备和播放设备还原出来。空间音频涉及空间声学、空间声采集、空间声重放等细分领域,内容比较多。这里我会按照空间音频的基本原理以及空间音频的采集和播放,结合已有的解决方案,来给你讲一讲空间音频背后的原理和使用方法,从而让你能够快速步入空间音频这一音频“元宇宙”的入口。

2023-01-17 08:33:59 923

原创 音频网络传输与抗弱网策略

在讲弱网之前我们先来看看音频是怎么传输的。在实时音频交互的场景中,为了保证传输的实时性,一般使用基于 UDP 协议的 RTP 协议来传输音频数据。相较于 TCP 协议,UDP 提供了一种无需建立连接,就可以发送封装的 IP 数据包的方法。所以它的优点是延迟低、速度快,但丢包了、包损坏了的时候也没有重传机制等做保护,可以说它是一种“尽力而为”的协议机制。而 RTP 定义了我们音视频的数据包格式,其中包含了 RTP 版本号、包顺序编号等信息。

2023-01-17 08:13:32 401

原创 编解码器选择

音频编 / 解码器需要关注的指标主要包括码率、音质、计算复杂度和延迟这 4 个大项。你可以先结合图 1 来大体了解一下,下面我会详细介绍。

2023-01-16 16:24:04 589

原创 音频编解码基本原理

这里我们从发展的视角看下,音频编 / 解码器都有哪些类型,就以它的作用来区分吧。音频编 / 解码器包括编码和解码两个部分。编码的过程就是对音频进行压缩,而压缩的过程是为了保留音频的主要甚至全部信息。解码就是对压缩后的音频信号进行解码,从而恢复原始的音频信号。压缩按照是否可以完美还原,可以分为无损压缩和有损压缩。无损压缩,例如 APE、FLAC等格式可以让音频中所有的细节都得到还原,而有损压缩可提供更低的码率,是我们在实时音频中使用更多的压缩类型。一段音频包含的信息其实可以有很多。

2023-01-16 16:03:52 2171

原创 回声消除实战

从贝尔实验室发明电话后,实时音频处理的技术不断发展,至今基于 VoIP(Voice over Internet Protocol,基于 IP 的语音传输)的实时音频互动已经慢慢成为人们日常音频在线交流的主流方法。图 1 展示的就是这样一个“现代版”的基于 VoIP 的实时音频处理链路。实时音频可以分为上行链路和下行链路两个部分,其中上行链路中的音频处理步骤可以对应图 1 中的上半部分。

2023-01-16 15:46:09 227

原创 如何回声消除

回声是如何产生的呢?我们可以通过下面的图来看一下,这是一个出现回声的经典场景。图 中 B 端的人在说话,说话的声音会被 B 端的麦克风采集。麦克风采集到的语音信号转为数字信号后经过网络传输到 A 端,在 A 端的扬声器会把收到的语音信号转成声波播放出来,同时 A 端的麦克风又会把扬声器的声音采集回来,通过网络又传回给了 B 端。这时 B端的人就会听到自己发出去的声音,我们把这个声音就叫做回声。

2023-01-16 15:19:15 544

原创 AI降噪模型

AI 模型也就是我们经常听到的深度学习模型、机器学习模型或人工神经网络模型。其实 AI模型的定义更为广泛,后面的这几种说法都是从不同角度描述了目前常用 AI 模型的特点。AI 模型的构建普遍采用大量数据训练的方式,来让模型学习到数据内隐含的信息,这就是所谓的机器学习。在降噪这个领域,模型的输入是带噪的语音信号,模型的输出是纯净的语音信号,我们通过大量的这样成对的带噪和纯净的语音数据,来训练 AI 模型,使其具有降噪的能力。下面我们来看看常见的 AI 降噪模型的结构,以及 AI 降噪模型的训练方法。

2023-01-16 14:54:49 946

原创 如何音频降噪

从通信系统的角度来说,噪声可以分为加性噪声和乘性噪声。加性噪声与信号之间满足加性条件,即加噪信号是由噪声和源信号相加得到的,这种情况下信号和噪声是不相关的,我们常见的自然噪声、人造的噪声如电子元器件发出的热噪声等都是这种。乘性噪声则是,噪声和信号是相关联的,比如信号的衰减、房间的混响、多普勒效应等。这类噪声往往是以信号乘积的形式出现,而且往往是从信道传输中产生,所以也叫信道噪声。我们这里主要讲的是人声与其它不相关的噪声的处理,所以主要是针对加性噪声来讲。

2023-01-16 14:02:48 496

原创 评价音频质量的好与坏

在介绍主观测试方法前,先介绍一个组织:ITU(国际电信联盟)。ITU 是联合国下属的一个专门机构,负责电信、通话等相关标准的制定。其中的无线电通信组(ITU-R)和远程通信标准化组织(ITU-T)为了统一国际的音频质量评价方法制定了一系列的主、客观评价方法。按照 ITU 的评价方法,你的音频算法或者系统的评价结果才会比较有公信力。好了,下面就让我们以 ITU 主观评价方法中的 MUSHRA 为例来介绍一下如何做音频主观评价。

2023-01-16 10:44:10 414

原创 分析与处理音乐信号

我们先来看看音乐信号中的一些基础概念。这里主要介绍一下常见乐器的发音原理,什么是速度和节拍,以及什么是音调和调式。

2023-01-16 10:25:35 1803

原创 科学、量化的分析语音信号

语音按照发音原理可以分为清音和浊音,语音的音调、能量分布等信息可以用基频、谐波、共振峰等特征来分析。为了更好地分析语音,我们先来看看语音是如何产生的?

2023-01-16 10:10:51 388

原创 声音是如何保存成数字信号的?

声音我们每天都会听见,似乎早已习以为常。那么我们是怎么把声音信号转换成数字信号记录下来存储和传输的呢?声音是听觉对声波产生的感知,而声波的本质是介质的振动,比如空气的振动。那么我们只需要把这个振动信号记录下来,并用一串数字来表达振动信号振动的快慢和振动的幅度,就可以实现声音的记录。以前的留声机就是通过唱片上凹槽的深浅、长短来表征声音的振幅和持续时间。我们现在一般用麦克风来实现声音的采集。那如何通过麦克风来采集声音呢?

2023-01-16 09:30:24 1596

原创 透析Linux系统编程

适合人群:有志于从事Linux下系统编程;进一步提升自己在Linux下开发能力;进一步学习项目经验课程目标:学完本课程后,在日后的问题解决与分析上,不在浮于表面,能从更深层的层面去分析和解决问题;课程简介: 本课程的主题是: 透析Linux系统编程 不同于市面上的课程,只会把核心主题放到函数的讲解,本课程的核心主题是 Linux系统编程的经验总结 ; 当你在系统编程中,调用一个系统调用来解决问题时,是否考虑过 该系统调用是否会对系统性能带来影响?是否还有最...

2021-01-19 18:07:11 66

原创 NanoPi NEO Core 制作系统镜像

sd-fuse_h3Create bootable SD card for FriendlyELEC series board, NanoPi NEO/NEO Air/M1M1 Plus/NEO Core/Duo2 etc..How to find the /dev name of my SD CardUnplug all usb devices:ls -1 /dev > ~/before.txtplug it in, thenls -1 /dev > ~/afte

2020-09-05 15:40:04 825

原创 2020-09-05透析Linux系统编程

本课程的主题是: 透析Linux系统编程 不同于市面上的课程,只会把核心主题放到函数的讲解,本课程的核心主题是 Linux系统编程的经验总结 ; 当你在系统编程中,调用一个系统调用来解决问题时,是否考虑过 该系统调用是否会对系统性能带来影响?是否还有最优的方式? 当你在系统编程过程中,遇到问题,是否只是检查代码逻辑,而不会去深入底层去查找问题 ? 本课程将一一解决系统编程带给你的难点,疑点? 比如控制文件IO章节,给出系统文件操作的默认行...

2020-09-05 15:31:57 87

原创 openwrt 教程 2

7. 默认为lan口 修改单网口为wan口修改文件 /openwrt/target/linux/ar71xx/base-files/etc/board.d/02_network 修改效果如下图所示定位到如下图所示的位置:8.修改lan口默认ip 修改文件 /openwrt/package/base-files/files/bin/config_generate 定位到如下图所示 :19...

2019-02-28 17:23:54 595

原创 openwrt 教程

1.下载openwrt源码 git clone git://git.openwrt.org/openwrt.git2.下载并安装所有可用的"feeds" cd openwrt ./scripts/feeds update -a ./scripts/feeds install -a3.运行下面的命令让OpenWrt编译系统检查你的编译环境中缺失的软件包: make defconfig mak...

2019-02-28 17:12:58 668

Linux网络编程详细笔记

深入理解Linux驱动程序设计

2019-02-20

深入理解Linux驱动程序设计

深入理解Linux驱动程序设计

2019-02-20

Linux Shell 脚本攻略

嵌入式系统高级c语言编程

2019-02-19

嵌入式系统高级c语言编程

嵌入式系统高级c语言编程

2019-02-19

Linux内核分析及编程

Linux内核分析及编程 电子书 高清晰 倪继利 电子工业出版社

2019-02-19

华为物联网平台对接应用服务器源码 c++

开放源码用于对接华为的物联网平台或者对接电信的物联网平台或者对接移动的onenet物联网平台

2018-03-27

tcp/ip 协议 卷一

tcp/ip 协议学习的圣经,详细的介绍了tcp ip协议,欢迎大家下载学习

2018-03-12

华清远见嵌入式培训---驱动教程源码

华清远见培训期间驱动学习教程欢迎下载学习,包括流程图说明方便理解

2017-10-27

openwrt移植文档----工作期间整理文档

工作期间整理的openwrt移植文档,方便初学者入门,都是一些经验笔记

2017-09-30

嵌入式学习资料--华清远见培训驱动源码

本人在华清远见培训嵌入式期间整理的部分驱动代码,方便初学者学习。

2017-09-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除