实战
上进唯实战可得,突破绝技成长瓶颈
手记
分享经验交流心得,学习前沿流行技术
-
《WebRTC源码深入剖析》总结
我精心打造的新课 《WebRTC源码深入剖析》 终于更新完了!!! 背景 2021年年初,在完成了我的处女作《WebRTC音视频实时互动技术——原理、实战与源码分析》一书之后,我终于下定决心,出一部WebRTC源码分析的课程了。 我心里十分清楚,要完成这样一个“大部头” ,一定会遇到很多困难。比如,如何将这些苦涩难懂的代码讲的通俗易懂?多长时间能讲完?费那么大心血是否值得(有相应的回报) ...... 但我内心又有几分笃定,一方面自2011年起,自己就开始关注WebRTC,最近几年也一直使用We
4544浏览
5推荐
0评论
-
WebRTC基础面试题
最近音视频会议,在线教育都比较火,很多学习了我课程的同学都偿试着去面试音视频相关的岗位,这里我就简单的整理了一份 WebRTC 相关的面试题,希望对大家有所帮助。 同时,这份面试题也对你学习《WebRTC入门》这门课的一个检验。 面试题 为什么用浏览器无法打开摄像头? A. 浏览器不支持 WebRTC B. 没有使用 HTTPS 服务 C. 证书不正确 D. 没有打开浏览器权限 在浏览器下使用 WebRTC 必须要使用 HTTPS 服务? A. 当提供正式服务时必须用 HTTPS时,必须使用 HTTPS 服务
9061浏览
6推荐
4评论
-
Windows 下使用 ffmpeg 库
今天我们来聊聊如何在Windows下使用ffmpeg库进行音视开发。一般情况下我很少在Windows下使用ffmpeg, 最主要的原因是在Windows下编译ffmpeg没有在Linux/Mac下编译方便。 不过相对来说还是使用 Windows 的同学比较多,为了方便他们可以更顺利的学习音视频开发,因此今天我们就来看看如何在 Windows 搭建使用 ffmpeg 的开发环境。 在Windows下搭建 ffmpeg 开发环境可以分为以下几个步骤: 编译出 Windows可以使用的ffmpeg 使用VS创建工程时,选择好 x86 或 x64 架构指令集 指定
9363浏览
3推荐
1评论
-
音视频小白系统入门常见问题解决办法
同学们在学习视频课小白系统入门这门课的过程中,经常遇到一些问题,这里总结一些最常见的问题,供大家参考: Q: 在 Mac 10.15.3 系统下编译 ffmpeg 成功后,在运行 ffmpeg 命令时出现crash. A: 重新编译ffmpeg,在执行 ./configure 时增加 --extra-cflags="fno-static-check" 选项,注意该选项一定要放在前面,否则编译有问题。 Q:添加 --extra-cflags="fno-static-check" 选项 仍然 crash A: 编译时保持尽量少的参数,应该是与其它一些参数有突冲 Q:Xcode 编译成功
8509浏览
3推荐
2评论
-
多人实时互动之各WebRTC流媒体服务器的比较
前言 随着网络基础设施的提高,音视频实时通信越来越成为人们日常生活和工作中必不可少的需求。2011年 WebRTC的出现,则更加速了这种需求变为现实的可能性。 熟悉 WebRTC 的同学应该都知道,WebRTC规范只定义了实时通信中客户端的行为,而没有规范服务端(包括哪些信令、数据如何流转)的行为。所以,你可以使用WebRTC库方便的实现 1:1 实时通信,但对于多人实时互动,光依靠 WebRTC库显然就无法完成要求了。 那我们该如何实现多人实时互动通信呢? WebRTC 流媒体服务器 要想实现多
13686浏览
8推荐
2评论
-
iOS 端实现1对1音视频实时通话
前言 之前,我已经写过 Android 端实现1对1音视频实时通话 的文章。在那篇文章中,我向大家介绍了在 Android 端是如何使用 WebRTC 进行音视频通话的。今天,我们再来看看 iOS 端1对1音视频实时通话的具体实现。 iOS 端的实现逻辑与 Android 端基本相同,最大的区别可能是语言方面的差异啦!所以,下面我基本上还是按照介绍 Android 端一样的过程来介绍 iOS 端的实现。具体步骤如下: 权限申请 引入 WebRTC 库 采集并显示本地视频 信令驱动 创建音视频数据通道 媒体协
5545浏览
4推荐
1评论
-
Android端实现1对1音视频实时通话
前言 在学习 WebRTC 的过程中,学习的一个基本步骤是先通过 JS 学习 WebRTC的整体流程,在熟悉了整体流程之后,再学习其它端如何使用 WebRTC 进行互联互通。 本文将讲解 Android 端是如何使用WebRTC的,至于 P2P 穿越、STUN/TURN/ICE、RTP/RTCP协议、DTLS等内容不做讲解。 对这方面有兴趣的同学可以看我的视频课「 WebRTC实时互动直播技术入门与实战」 申请权限 我们要使用 WebRTC 进行音视频互动时需要申请访问硬件的权限,至少要申请以下三种权限: Camera 权限 Record
16672浏览
26推荐
2评论
-
Nodejs+socket.io搭建WebRTC信令服务器
前言 我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了。 对于 WebRTC 来说,它有一整套规范,如使它使用的接口、使用SDP进行媒体协商、通过ICE收集地址并进行连通性检测等等。除此之外,WebRTC还需要房间服务器将多端聚集到一起管理,以及信令服务器进行信令数据交换(如媒体描述信息SDP的交换,连接地址的交抽换等),但在WebRTC的规范中没有对这部分内容进行规定,所以需要由用户自己处理。 你可以根据自己的喜好选择服务器(如 Apache,Nginx 或
14113浏览
7推荐
0评论
-
半天学会 Go 语言语法
前言 现在 Go 语言越来越流行,它背后有 Google的支持,而且已经有很多人开始使用 Go 语言做服务端开发。现在我们就来看一下该如何快速的学习Go 语言。 在学习一门语言之前,首先我们要了解都该学习这门语言的那些知识点。我这里简单列举一下: 基本语法,包括变量/常量的定义,数组,if/else语句,for循环,函数,结构体以及指针。 Go 特性 如何使用Go语言 下面我们就一项一项来看。 基本语言 Go的基本语法与其它语言都差不多,我们学习语言的最好方法就是类比法。我用这种方法
7126浏览
12推荐
3评论
-
FFmpeg抽取音频AAC
前言 在我的视频课中为了讲解对多媒体文件进行复用和解复用,我特别举了一个例子,就是将一个MP4文件中的音频 AAC 抽取出来。但有很多同学产生的疑问,不断的在群里问我:“为什么使用你代码中例子抽取出来的不能播放呀?” 我在群里给大家耐心的说明了一下 AAC分为 HE-AAC 和 LC-AAC...,由于写的代码只是一个例子,并没有适配所有的情况,所以只对HE-AAC有效,而对于 LC-AAC,需要手动修改一下。 但没过两天当有新的小伙伴加入的时候,我又要重新解释一遍,自己真的很无语呀!感觉刨
11012浏览
2推荐
5评论
-
FFMPEG常用命令
前言 FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。 本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用 ffmpeg 提供的工具来处理音视频文件。 FFMPEG 目录及作用 libavcodec: 提供了一系列编码器的实现。 libavformat: 实现在流协议,容器格式及其本IO访问。 libavutil: 包括了hash器,解码器和各利工
17465浏览
15推荐
2评论
-
Windows下编译安装 FFmpeg
前言 最近我的视频课《FFmpeg音视频核心技术精讲与实战》终于与大家见面了。在学生学习的过程中不断有学生反馈一些问题,其中较多的是如何在Windows 上编译 ffmpeg。 在Linux/Mac下编译 ffmpeg是非常方便的。但要在 Windows下编译 ffmpeg还真要花点时间。不过为了满足学员的要求,也方便自己不再被这类问题打扰,今天我就写一下在 Windowns下编译ffmpeg的步骤,以供大家参考。 安装Cygwin 在windows下安装 ffmpeg 的最好方式就是使用Cygwin。 Cygwin是什么呢?简单的说,就是在 Wi
31625浏览
36推荐
38评论
-
ffmpeg中的时间戳与时间基
前言 在开发多媒体播放器或直播系统时,音视频的同步是非常关键且复杂的点。要想把音视频同步搞明白,我们必须要了解一些基本的知识。只有了解了这些基本知识,才能为你打下理解音视频同步的基础。 本文将从下面几个主题介绍这些知识点: I/B/P帧 PTS/DTS 时间基 ffmpeg的内部时间基 不同时间基的换算 I/B/P帧 对于 I帧,B帧,P帧,我想很多人对它们已经了解的很多了。 I帧是关键帧,它采用帧内压缩技术; B帧是前后参考帧,它属由帧间压缩技术。也就是说在压缩成 B帧前,它会参考
18499浏览
12推荐
2评论
-
OC中的KVO
前言 听到很多同学说iOS中的 KVO是最难使用的一项技术,要尽量避免。通过我的观察,其实并不是 KVO难用,而是很多做 OC 的同学见到指针就发怵,因为一旦使用不好就会引起Crash。 我们在开发RTC项目时,由于需要侦听iOS手机的音量键,然后根据音量的大小做一些逻辑处理,所以也要用 KVO。下面我就来介绍一下OC中的KVO,看看它真的有很么可怕吗? KVO的基本原理 KVO(Key - Value - Observer),其实就是一种观察者模式的实现。 当一些对象想侦听某个被观察对象的事件时候,首先需要
3528浏览
0推荐
0评论
-
C++与OC相互调用
前言 在开发 RTC 的过程中遇要一个棘手的问题,需要侦听iOS手机的音量键,然后根据音量的大小来处理一些逻辑。 我们是以老的 WebRTC代码为基础来开发自己的 RTC 库的。在老的 WebRTC中,对 iOS的 Native 代码的处理都是 C++风格的。 而要侦听iOS手机的音量键,又必须通过 KVO的 OC 方式才可以,也就是要向 AVAudioSession注册一个观察者对象来侦听音量键消息,如下所示: [session addObserver:OCObject forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionNew
6521浏览
0推荐
0评论
-
投稿001期 | 撸码,少时的梦想,中年的焦虑
儿时每个人都有很多梦想,但长大后 梦 就渐渐少了。取而代之的,是生活的苦涩与无耐。梦,虚无缥缈。梦想,就是异想天开。当你睁开双眼,回到现实,还是要油、盐、酱、醋、茶,生活依然故我! 说起来,我还真是一个 “幸运儿”,从高中时就梦想作一个程序员。结果一不小心,这梦竟成真了。 那时的电脑还是个新鲜玩意儿 1996年,我一次接触到计算机,那时的电脑还是个新鲜玩意儿。机房里一尘不染,我穿上老师发给我的蓝色鞋套,终于见到了传说中的电脑。你能想到我们当时用的计算机的样子吗
4716浏览
32推荐
9评论
-
「SDL第八篇」支持倍速与慢放的YUV视频播放器
前言 今天向大家介绍一下如何通过 SDL 实现一个YUV视频播放器。它与上次介绍的音频播放器一样,也是一个简单的不能再简单的播放器了。只不过一个是播放的音频PCM数据,另一个播放的时视频YUV数据。 该播放器不涉及到视频的解复用,解码等工作。我们只需要定时的刷新视频帧就可以了,而且还可以支持视频的倍速与慢放。在下面的列子中我将向你演示,使用 SDL 做这样一个播放器是何等的简单。 当然这个看似简单的播放器其实是由许多的理论基础在底层支持着的。如果在这方面没有什么基础的同
7474浏览
5推荐
0评论
-
视频格式YUV详解
什么是YUV YUV(也称YCbCr)是电视系统所采用的一种颜色编码方法。其中 Y 表示明亮度,也就是灰阶值,它是基础信号;U 和 V 表示的则是色度,UV 的作用是描述影像色彩及饱和度,它们用于指定像素的颜色。U和V不是基础信号,它俩都是被正交调制的. YUV与RGB视频信号相比,最大的优点在于只需占用极少的带宽,YUV只需要占用RGB一半的带宽。 YUV采样格式 主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2 和 YCbCr 4:4:4 ,其中 YCbCr 4:2:0是最常用的采样格式。 YUV 4:4:4 YUV三个
12941浏览
5推荐
0评论
-
「SDL第七篇」PCM音频播放器的实现
前言 今天向大家介绍一下如何通过 SDL 实现一个PCM音频播放器。这是一个最简单的播放器,它不涉及到音频的解复用,解码等工作。我们只需要将音频原始数据喂给 SDL 音频接口就可以听到悦耳的声音了。在下面的列子中我将向你演示,使用 SDL 做这样一个播放器是何等的简音。 当然这个看似简单的播放器其实是由许多的理论基础在底层支持着的。如果在这方面没有什么基础的同学可以通过下面的链接去自行学习。 SDL 入门 SDL窗口渲染 SDL基本图形绘制 SDL事件处事 彻底理解SDL纹理 SDL孙
8628浏览
5推荐
3评论
-
「SDL第六篇」孙悟空与多线程
前言 今天将向大家介绍一下SDL中的多线程的使用。通过下面对SDL 线程与锁相关的API,你会发现,它与 Linux, Windows相关的API几乎是一模一样的。从这里可以推断出,其实SDL对于多线程的处理只是为大家提供了一套统一接口,并没有做其它太多的工作。 这是我们介绍 SDL 的第六篇文章。有兴趣的同学可以通过下面的链接查看其它几篇文章。 SDL 入门 SDL窗口渲染 SDL基本图形绘制 SDL事件处事 彻底理解SDL纹理 另外,我在慕课网分享了音视频免费入门课程,有兴趣的同学可以去观看。 为
6515浏览
6推荐
1评论
-
「SDL第五篇」彻底理解纹理(Texture)
前言 这是SDL系列文章的第五篇,本文将带你深入探讨SDL的几个重要概念SDL_Window、SDL_Render、SDL_Surface 与 SDL_Texture,并在文章的最后向你展示SDL如何通过SDL_Texture将视频渲染出来。 对于前面系列文章感兴趣的同学可以通过下面的链接查看: SDL 入门 SDL窗口渲染 SDL基本图形绘制 SDL事件处事 另外,我在慕课网分享了音视频免费入门课程,有兴趣的同学可以去观看学习更多的音视频知识。 SDL_Surface vs SDL_Texture 在SDL系列文章的第二篇里,我详细的介绍了SDL 渲染的工
7615浏览
3推荐
0评论
-
「SDL第四篇」事件处理
前言 前面我为大家介绍了 SDL 的三个主题: SDL入门 SDL窗口显示 SDL绘制基本图形 今天我为大家介绍一下SDL的事件处理。这里所指的事件处理就是我们通常所说的,键盘事件,鼠标事件,窗口事件等。 SDL对这些事件都做了封装,提供了统一的API,下面我们就来详细的看一下。 SDL中的事件处理 要想了解 SDL 的事件处理,我们必须要知道的一个原理是,SDL将所有事件都存放在一个队列中。所有对事件的操作,其实就是对队列的操作。了解了这个原理后,我们再来说SDL提供的 API 就很容易理
5517浏览
5推荐
0评论
-
「SDL第三篇」绘制基本图形
前言 之前的SDL的两篇文章我向大家介绍了如何编译使用 SDL,以及如何才能让窗口显示出来。想了解相关内容的同学可以点击下面的链接查看相关内容。 「SDL第一篇」入门 「SDL第二篇」窗口渲染 本文将向大家介绍一下,如何通过 SDL 绘制一些基本图形,如 点、线、矩形。了解了这些基本图形后,你就可以按照搭积木的方式,构造出其它更复杂的图形了。 有哪些基本图形可以绘制 SDL中绘制基本图形的 API并不多,主要是 点、线、矩形。其它图形都可以通过 点、线、矩形组合出来。 设置颜
6852浏览
2推荐
0评论
-
「SDL第二篇」窗口渲染
前言 上一篇文章中我们对SDL作了简单的介绍,重点介绍了如何编译SDL以及如何使用它。在文章的最后我们留下了一个疑问,即虽然我们创建了窗口,但窗口却并没有真正显示出来。 今天我们就来看一看,如何才能让创建的窗口真正的显示出来。 渲染的基本流程 为什么我们上一课中创建了窗口,但它却并没有显示出来呢?其原因是,我们创建的窗口只是逻辑上的窗口,要想让窗口显示出来,我们需要对窗口进行效果渲染,也就是要通过绘制像素的方法,将窗口中的像素全部点亮。 那么如何对窗口进行渲染呢
6517浏览
6推荐
2评论
-
SDL入门
为什么要学习SDL SDL是 “Simple DirectMedia Layer”的缩写,它是一个开源的项目。其主要用于游戏开发中的多媒体处理,如视频渲染,音频播放,鼠标/键盘控制等操作。 并且它是一个跨平台的多媒体库。也就是说它对外接供了一套统一的接口,但在内部,它会根据不同平台调用不同的底层 API库。如在 Linux 系统下,它会使用 opengl 做渲染,而在 Window 下它会调用 D3D API进行渲染。 我之所以要介绍它,主要是因为我要在开发的多媒体播放器中使用它。 SDL的编译与安装 目前 SDL
9206浏览
12推荐
0评论