- 博客(65)
- 资源 (11)
- 收藏
- 关注
原创 Pofile-level-id
说明:sdp中由于264对应的profile不同,则在创建编码器时会导致找不到对应的编码器。base_sdp += "m=video 9 UDP/TLS/RTP/SAVPF 127 125 108 124\n";base_sdp += "a=fmtp:127 " "level-asymmetry-allowed=1;packetization-mode=0;profile-level-id="; "42e01f";42e01f:分为三个部分,42 e0 1..
2021-02-05 16:47:11 502
原创 python调用dll
原因:由于涉及到通过python进行我们自己的dll调用,故查看了一下python关于dll的调用流程在此记录。概述:目前验证python只能调用c风格的接口,我们常规的类方法是不能直接调用的,如果需要调用,则可以通过再次将类方法导出即可。关于dll接口的导出我们涉及到两种定义格式,stdcall和cdecl两种,不同的导出约定python对应不同的调用方法。二者区别在此不进行阐述,简单的调用逻辑如下:首先定义一个dll如下extern "C" __declspec(dllexport) in
2020-10-14 21:32:25 1035
原创 mRemoterNG使用
概述:主要用于远程连接windows服务器使用。下载地址:https://mremoteng.org/download,选择对应版本进行下载安装即可.1:配置远程连接软件安装成功后,点击文件,新建连接,此时弹出一个连接窗口,我们输入对应的主机名/ip,用户名,密码等.双击该连接即可.2:配置文件的导出和导入如果涉及到很多机器的配置,一人配置多人使用,可以将该配置文件进行导出和导入即可。导出:点击文件,另存配置文件为。导入:将该配置文件.xml,点击文件,打开连接配置文件。.
2020-08-24 18:48:25 2531
原创 gn编译webrtc介绍
说明:由于需要通过gn编译webrtc源代码和自研代码的添加,在此介绍gn命令和格式。概述:我们通过gclient实现webrtc源码的下载,下载完成后使用gn命令进行编译,此时生成对应平台的文件(.ninja)。gn参考:https://www.chromium.org/developers/gn-build-configurationgn介绍:(generate ninja )顾名思义为生成ninja文件,为一个编译工具,是GYP(Generate Your Project)的替代工具,..
2020-08-16 00:37:58 2211
原创 webrtc屏幕共享
概述:通过webrtc/modules/desktop_caputre/模块实现屏幕采集(参照:https://www.jianshu.com/p/484edbd3311f)原理:窗口采集主要使用GDI或者DirectX实现。编译webrtc_modules模块将desktop_capture包含,此时会涉及到winsock2.h和windows.h的冲突问题,只需要添加WIN32_LEAN_AND_MEAN预编译选项即可。实现屏幕共享类,其中VideoCapturer类主要是用于实现数据源。Callb
2020-06-29 17:14:40 2358 3
原创 Inter_arrival模块分析
概述:该模块主要是为了获取发送端时间差值,到达时间差值,包组间包个数差值。通过获取这些参数传递给后续模块进行延迟估计。包组的概念:webrtc中计算延迟不是一个个包计算,而是通过将包进行分组,然后计算包组间的延迟,这样一是可以减少计算量,二也是可以使之更加平滑。具体方法:差值计算是在inter_arrival模块进行获取。timestamp:表示数据包的发送时间。arrival_time_ms:表示数据包到达时间单位ms。timestamp_delta:表示数据包两个组之间发送时间间隔(也就是下图中
2020-06-24 16:50:08 871
原创 webrtc中ICE介绍
原因:根据源码进行分析,在此记录一下webrtc中ice连接流程。概述:Agent首先获取需要的地址,然后地址进行交换,随后进行连通性测试,最终选择一个最合理的连接用于数据传输。ICE:interactive connectivity establishment交互式连接建立。是一组基于offer/answer模式解决NAT穿越的协议集合。在此简单介绍一下NAT,NAT(Network Address Translation网络地址转换)。目前NAT类型主要分为完全锥型,地址限制锥型,端口限制锥型,
2020-06-03 18:30:46 3143
原创 MediaFoundation视频采集
原因:由于目前pc平台采集DirectShow老旧和复杂,故了解MediaFoundation简单调用。概述:利用MediaFoundation实现视频采集,利用同步方式实现视频数据的读取。MediaFoundation介绍:MediaFoundation是DirectShow的替代,vist及以上才能支持,也就是说xp不支持,且不同的系统某些功能支持情况也不同,提供了两种编码模型,第一种是Media Session为主的Media pipeline模型,复杂。第二种就是通过SourceRe
2020-05-19 16:18:45 2331
原创 DirectShow实现视频采集和虚拟摄像头
概述:通过DirectShow实现本机摄像头的视频采集,以及利用dshow模块通过手动实现IPin和IBaseFilter等实现虚拟摄像头。总结:我们知道目前pc平台的视频采集主要有DirectShow和MediaFoundiation,而且虚拟摄像头的实现一般也是利用dshow的baseclass模块进行实现,而我们则选择通过手动实现IPin和IBaseFilter模块抛弃baseclass,从而对于DShow的采集内部流程更加了解。首先简单介绍一下DirectShow:DShow是windo
2020-05-18 16:07:05 4407 4
原创 libmicrohttpd介绍
原因:由于janus服务端http使用的是libmicrohttpd三方库,所以在此进行记录。概述:通过引用.lib,实现http服务端的创建,并通过客户端post发送,实现数据的传输。介绍:libmicrohttpd:是一个c语言库,主要实现http服务器的功能,主要特点有:体积小,api简单,跨平台,且兼容HTTP1.1。下载地址:http://www.gnu.org/s...
2020-05-08 17:25:04 2710
原创 DataChannel消息发送
原因:由于需要使用DataChannel进行消息发送,故在此记录一下流程概述:通过创建DataChannel,通过事件监听获取连接状态,从而实现消息发送,底层协议为DCT_RTP或者DCT_SCTP。流程介绍:首先配置启用rtp_data_channel,底层在创建webrtcsession时会默认data_channel底层协议为DCT_RTP。webrtc::PeerConn...
2020-04-28 17:08:24 1202
原创 SigSlot介绍
原因:由于webrtc中模块之间信息交互使用到sigslot库,故在此记录一下概述:A模块声明sigslot::signal模板方法,B模块实现对应的方法,通过connet进行关联,从而实现跨模块调用,减少了类指针的传递。模块之间相互调用一般使用继承相同接口,通过接口对象进行模块传递,从而实现跨模块调用,但是当接口方法比较多时这样会变得冗余,且当接口修改时各个模块都要进行编译修改。所以通过...
2020-04-22 18:39:47 447
原创 libx264编码流程
原因:发现在调用编码时没有指定帧的pts值,故单独调用libx264模块在此验证pts值的影响概述:首先编译libx264源码,将生成的lib和.h文件加载的工程中进行调用。流程:1:首先定义x264_param_t对象,该对象主要用于配置编码器参数信息。其中不同的preset和tune以及profile内部将会配置不同的参数信息,最终实现编码速度和编码质量的平衡。//设置pre...
2020-04-15 16:45:08 810
原创 x264码率控制
原因:在做视频编码时,当我们给定编码器一个目标码率的时候,编码器内部是怎么达到码率要求的那概况:关于码率控制有两个目的,第一:兼容传输,播放条件。第二:获取更高的视频质量。码率控制分为两类:CBR:constant bit rate,固定码率。 VBR:variable bit rate 可变码率。VBR:可变码率是一类码率控制算法的统称,他们的特点是局部的码率可变的,常用的可变码率子...
2020-01-17 16:04:38 304
原创 webrtc拥塞机制和带宽调节
参考:https://blog.csdn.net/yuanrxdu/article/details/80449740webrtc的gcc是通过延迟和丢包进行动态调整的,发送端通过接收到接收端rtcp反馈过来的信息(包延迟增量,丢包率信息等)计算出网络拥塞状态并评估出适合当前网络传输的码率,从而进行码率控制。所以重点是接收端rtcp反馈信息,和发送端是如何根据不同信息进行评估。首先分析一下r...
2020-01-03 18:43:55 549 1
原创 ios平台webrtc记录1
原因:由于需要实现连麦功能,故开始需要从零开始进行框架的搭建。概括:通过配置开源服务端和客户端实现连麦胡同测试。首先下载webrtc镜像:https://webrtc.org.cn/mirror/。该镜像由声网进行维护,避免了google服务器下载失败的问题。根据介绍的流程进行安装即可。本介绍以ios平台安装为例,通过下载后利用gn生成xcode工程文件。命令如下:gn gen ...
2019-12-26 13:37:47 377
原创 static_cast和dynamic_cast和reinterpret_cast和const_cast
说明:记录一下强制类型转换的关键字概况:static_cast定义类型:static_cast<new_type>(expression).new_type为目标类型,expression为原始数据类型变量或者表达式。用于强制类型转换。编译时检查,运行时不能保证转换的安全性。主要使用情况:1:基类与派生类之间类型转换,2:常规类型之间转换。注意事项:关于const的转换。...
2019-12-09 21:48:34 539
原创 unique_ptr
原因:介绍一下unique_ptr的使用说明概况:介绍:unique_ptr包含在memory头文件中,通过一个指针占用和管理一块内存。并在unique_ptr的作用域退出时释放改内存。主要定义方式如下两种:可以看出第一种释放函数为自带的delete操作符,而第二种情况为我们自己定义的释放函数。template<class T, class Deleter = std::d...
2019-12-05 20:55:47 102
原创 C++11 condition_variable
原因:记录一下条件变量的内部流程概况:通过条件变量实现线程间同步。伪代码如下:需要和锁配合使用,用到了unique_lock实现互斥。具体流程如下:线程a:1:首先利用unique_lock加锁。2:调用condition_variable的wait方法进行阻塞等待条件满足。wait内部流程首先进行unique_lock解锁,然后判断第二个参数是否为ture,如果为true则...
2019-12-04 13:28:12 181
原创 C++11 bind
原因:记录一下新特性bind函数:头文件<functionnal>,可将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象,一般形式如下:arg_list是参数列表,_n表示占位符(n是一个整数),用于表示参数顺序。通过不同的参数顺序可以实现参数的从新排序。而且当bind时指定了参数值,则再次调用传参则无效。auto newCallabl...
2019-12-03 23:06:56 156
原创 类创建堆上和栈上实现
原因:如何在堆上和栈上创建类概况:普通的局部变量声明被创建在栈上,如A a;而通过new进行创建的类对象则被分配到堆上如A *a = new A;类只在堆上创建,只需要将析构函数设置为private类型即可如下:编译器在为类对象分配空间时会检查析构函数的访问性。class TeC {private: ~TeC() {};public: void Test() { printf...
2019-12-03 22:42:12 365
原创 c++11 thread使用介绍
原因:c11里面的thread用法,故在此进行梳理一下概况:通过类内调用与跨类进行调用进行代码分析。首先分析一下thread头文件:explicit thread(_Fn&& _Fx, _Args&&... _Ax)thread(thread&& _Other) _NOEXCEPTbool joinable() //判断线程声明...
2019-11-29 17:03:42 818
原创 memory_order介绍
原因:查看Oboe源码,发现内部使用到std::atomic。故在此记录一下memory_order的理解概况:通过不同的memory_order实现线程同步介绍:线程间同步常规用法是通过互斥锁实现,但是在对性能要求实时性高的情况选,该方法不可取,故需要无锁编程,而无锁编程核心就是原子操作。针对C11提出的Atomic operations library(原子操作库)memory_ord...
2019-11-27 18:50:19 1174
原创 libcurl实现http交互
原因:由于涉及到使用libcurl进行http交互,故在此进行记录调用流程概况:利用curl模块实现http请求http介绍:(hyperText Transfer Protocol超文本传输协议)定义在应用层,底层基于TCP/IP协议,且是一个无状态的协议,永远都是客户端发起请求,服务器响应。http消息由客户端到服务器的请求和服务器到客户端响应组成。请求消息和响应消息都是由开始行(对于...
2019-11-26 10:42:04 1325
原创 OpenSL ES与AAudio简单介绍
原因:在耳返功能时,如果使用AudioRecord和AudioTrack进行采集与播放会造成延迟问题,故需要涉及到openSL ES与AAudio的使用。概况:OpenSL ES与AAudio简单理解为嵌入式跨平台免费的音频处理库,具有高性能,低延迟的特性。AAudio是作为OpenSL ES库的轻量级原生Android替代项。AAudio性能与功能上更加。但是AAudio只有在Android...
2019-11-19 18:20:27 6520
原创 MediaCodec编码
原因:由于涉及到yuv的编码故使用android自带的MediaCodec模块进行硬件编码概况:通过获取编码设备信息创建编码对象,然后设置编码参数,通过输入输出缓冲区进行数据的传递和读取。流程如下:首先获取当前设备支持的编解码设备信息:首先获取codc个数,然后判断是否是编码codec. m_codeccount = MediaCodecList.getCodecCount();...
2019-11-15 17:36:41 1710
原创 OpenGLES播放NV12流程
原因:为了实现yuv的播放故使用到了OpenGLES,在此介绍一下使用流程概况:使用着色器程序将yuv转换为RGB,然后利用Renderer渲染器将数据渲染到GLSufraceView上,故我们需要实现着色器程序,渲染器,渲染视图。首先视图创建伪代码如下:首先设置OpengGL的使用版本,然后设置一个渲染Renderer,此时的渲染Renderer就是我们自己实现的模块,紧接着设置渲染模式...
2019-11-14 14:44:36 1247
原创 Camera1介绍
原因:由于涉及到视频的采集和预览故在此记录一下Camera1的使用流程概况:通过配置Camera1的参数后创建Camera1对象,通过设置预览或者不预览然后触发采集回调。流程如下:导入头文件伪代码如下:import android.hardware.Camera;获取采集设备个数,找到对应的采集设备进行打开:m_iCount = Camera.getNumberOfCa...
2019-11-12 14:41:06 1267
原创 android添加Button
原因:由于编写测试程序设计到按钮的添加故在此记录一下使用流程。概况:通过手动添加Button控件,并通过Id进行关联,最终实现点击事件。流程如下:首先添加Button按钮:打开activity_main.xml布局文件.然后选择了手动拖动添加Button按钮,点击Design页面选择Button拖动到页面布局中.打开对应Text页面可以看到对应的Button名字和Id。修改显示内如...
2019-11-11 15:59:03 1520
原创 AudioTrack介绍
原因:由于需要实现音频播放,故使用AudioTrack实现功能.概况:音频播放可以使用MediaPlayer和AudioTrack两种方案,MediaPlayer可以播放多种格式的语音文件,例如.mp3,.wmv.等.而AudioTrack只能播放.pcm文件.通过了解可以看出MediaPlayer底层同样使用AudioTrack进行pcm填充.流程如下:首先进行创建一个AudioTrac...
2019-11-11 15:31:36 638
原创 FileOutputStream与FileInputStream使用
原因:由于使用AudioRecord需要进行文件保存,故需要使用到FileOutputStream的使用概况:通过File创建文件,使用FileOutputStream创建输出实例,通过write进行写入。首先导入头文件如下:import java.io.File;import java.io.FileOutputStream;获取文件路径并通过File进行文件创建伪代码如...
2019-11-08 17:04:47 552 1
原创 AudioRecord采集
原因:准备整理一遍从采集,编码,推流,拉流,解码,播放流程概况:利用AudioRecord实现音频采集。AudioRecord:android的媒体操作模块被定义到android/media/中,可以看出AudioRecord为java接口,而内部调用的为JNI接口,而media内部封装的为libmeida.so模块。且音频采集有AudioRecord和MediaRecord,不同之处在于...
2019-11-08 16:44:36 488
原创 android创建so和调用流程
原因:由于需要将混音模块封装成android的.so,故在此记录一下有关so的创建和流程调用概况:通过JNI编写生成.so文件,通过.so文件进行内部方法的调用.JNI:java native interface,是native编程接口,它允许在java虚拟机内运行java代码与其他编程语言(一般C/C++)模块进行交互。JNI调用原因:1:标准java类库中不支持应用程序所需的功...
2019-11-06 16:59:55 579
原创 yuv图像拼接
原因:有人问过说yuv如何拼接,当时只是说对应内存进行拷贝,没有充分考虑数据的类型,故在此编写测试程序进行验证概况:不同的数据源,找到对应的yuv数据,然后进行对应拷贝。测试源数据:YUV420P(又分为YU12和YV12),plane平面模式,y,u,v分量分别存放不同平面。首先是所有Y值,然后是所有V值,最后是所有U值.YUV420SP(NV12和NV21),two-plane...
2019-11-05 14:07:30 2222 2
原创 预处理编译汇编链接
原因:今天生成工程文件时突然发现有些细节忘却,故在此做一记录概况:编译过程就是把文本形式源代码翻译成机器语言形式的目标文件的过程,链接过程就是把目标文件和用到的库文件进行组织形成最终可执行代码的过程。编译过程分为:编译和汇编,而编译又可以分为预处理阶段和编译阶段。预处理阶段:将根据已放置在文件中的预处理指令来修改源文件的内容,比如#include指令,它把头文件的内容添加到cpp...
2019-11-04 18:22:04 347
原创 webrtc_noise_suppression
原因:由于APM中涉及到去噪模块,故在此进行简单调用和原理分析概况:通过对信号的初始噪声估计得出一个语音/噪声概率函数,然后通过该函数估计出每帧数据的噪声,然后使用维纳滤波器将噪声进行抑制。故重点为噪声估计的准确性。而噪声估计依赖于语音/噪声概率函数,而语音/噪声概率函数是通过使用映射函数将每帧的信号分类特征映射到一个概率值而得出。每帧的分类特征包括:频谱平坦度,频谱差异,LRT均值特征。...
2019-11-01 15:42:44 887
原创 webrtc_module_audio_conference_mixer
原因:由于需要进行基于webrtc的混音模块封装,故在此进行简单调用。概述:通过将webrtc_module_audio_conference_mixer模块的摘出,编写测试代码实现conference_mixer模块的调用,内部混音流程与之前博客分析一致调用伪代码如下:通过实现AudioMixerOutputRecevicer和MixerParticipant类,实现数据的填充和接收....
2019-10-31 16:56:04 388
原创 webrtc_module_audio_mixer
原因:由于需要将webrtc_module_audio_mixer模块进行封装,故在此进行调用分析概况:通过内部代码可以看出webrtc_module_audio_mixer内部实现为首先将pcm进行halfgain处理,然后进行pcm对应累加,通过LimitMixedAudio将mixed的数据进行平滑处理然后进行简单的pcm扩大2倍.重点为Audioprocessing中的processS...
2019-10-30 16:18:50 615
原创 回声消除简单分析
原因:由于需要对webRTC源码中audio_processing模块中回声消除验证,故在此进行模块分析。概况:通过将audio_processing模块单独调用,通过wavapi进行播放和采集用于测试回声消除模块。回声消除介绍:实时语音通话中,子所以会产生回声的原因是A通话者的声音被麦克风采集后通过网络发送到远端B,远端B扬声器播放出来的声音又被麦克风进行采集后通过网络发送给A,由...
2019-10-29 17:04:28 852 2
obs monitor_capture
2019-03-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人