目录
1,自定义摄像头分辨率
2,码率限制
3,调整编码器顺序
4,Mesh模型多方通话
5,Janus框架分析
6,Janus Web源码分析
7,Janus Android源码分析
8,基于Janus实现会议系统
自定义摄像头分辨率
一、videocapture类的介绍
1、Class for video capturing from video files, image sequences or cameras.
2、The class provides C++ API for capturing video from cameras or for reading video files and image sequences.
二、参数设置函数 set() 函数的使用
1、代码
//
#include "cartoon.h"
int main()
{
VideoCapture capture(0);
if (!capture.isOpened()) { //判断能够打开摄像头
cout<<"can not open the camera"<<endl;
cin.get();
exit(1);
}
capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
int count=0;
while (1) {
Mat frame;
capture>>frame; //载入图像
if (frame.empty()) { //判断图像是否载入
cout<<"can not load the frame"<<endl;
} else {
count++;
if (count == 1) {
cout<<frame.cols<<" "<<frame.rows<<endl;
}
imshow("camera", frame);
char c=waitKey(30); //延时30毫秒
if (c == 27) //按ESC键退出
break;
}
}
}
//
码率控制算法
码率控制算法根据视频应用要求与目的的不同可分为以下两种,
第一种
是恒定比特率 CBR(constant bitrate)的码率控制算法, CBR 的输入不仅要有视频源, 还要另外设置一个目标比特率。它能够动态地调节量化参数,主要依据是不同视频的内容复杂度差异、网络带宽的不同和解码缓冲区的大小等, 使得在给定的码率限制下, 图像的质量最佳。编码过程中, CBR 的码率围绕着目标码率基本不变。
第二种
是可变比特率 VBR( variable bitrate) 的码率控制算法, VBR 的输入当然也要包括视频源, 此外还要设置量化参数 QP。输出的比特率会在一定范围内变化, 原因有很多, 比如实际视频序列中的图像内容复杂度的差异, 又比如运动的快慢不同等, 所以在传输信道有波动的条件下常常使用 VBR 算法。
调整编码器顺序
一、视频编码格式初始配置
webrtcmediaengineinternalencoderfactory.cc
按照Push顺序,优先选取第一个编解码格式。
二、视频分辨率初始配置
webrtcpcvideocapturertracksource.cc
选取的原则是,在kVideoFormats里面找参数与kDefaultFormat默认值最接近的一组参数,作为本端的编码能力。
三、视频码率默认值
webrtcmediaenginewebrtcvideoengine.cc
EncoderStreamFactory::CreateEncoderStreams
四、默认QP、帧率最大值配置
webrtcmediaenginewebrtcvideoengine.cc
static const int kDefaultQpMax = 56;
const int kDefaultVideoMaxFramerate = 60;
五、使能SRTP
webrtcsrcwebrtcapipeerconnectioninterface.h
disable_encryption = true 取消SRTP
disable_encryption = false 开启SRTP
配置密钥:
bool Conductor::CreatePeerConnection(bool dtls)配置是否生成密钥。
六、生效新的帧率码率流程
在webrtc里面函数实现如下:
->VideoStreamEncoder::EncodeVideoFrame->VideoSender::AddVideoFrame----
在这个函数中读取全局变量encoder_params_,判断是否需要调整视频参数。->VideoSender::SetEncoderParameters
->VCMGenericEncoder::SetEncoderParameters
->H264EncoderImpl::SetRateAllocation---传递新的帧率码率到编码器。
七、H264打包模式
codec.cc VideoCodec::SetDefaultParameters
Janus框架分析
模块结构
本文介绍的Janus版本为0.6.0。
上图是Janus主要的模块结构,有一些通用工具模块这里没有列出。
媒体模块
Janus不是简单转发WebRTC的媒体流,还有一定的控制能力,因此需要支持WebRTC的媒体能力,其媒体功能包含以下基本模块:
ICE:打洞,负责与Peer的连通,Janus可以部署在NAT后面,使用了libnice;
DTLS:UDP版的TLS,就是加密的UDP,WebRTC用来传递SRTP的密钥,使用了OpenSSL/BoringSSL;
RTP/RTCP:提供RTP/RTCP封/解包的接口,需要发送一些WebRTC支持的RTCP包,例如FIR、PLI、RR等;
SRTP:加密的RTP,开启后WebRTC传输的RTP负载都是加密的;
SDP:提供SDP封/解包的接口,用于协商媒体的协议,可以用SDP对WebRTC的一些功能进行设定;
SCTP:WebRTC的数据通道使用的协议,就是加上了流控的UDP,可以传输任意数据。
信令模块
除了媒体协议,Janus还要提供信令交互的协议,传统的信令协议有SIP、XMPP等,Janus上的信令应用协议可以定制,底层主要的传输协议有
HTTP(s);
WebSocket(s);
MQTT;
NanoMsg;
RabbitMQ。
其中WebSocket使用了libwebsockets,HTTP使用了libmicrohttpd。
Janus Web源码分析
总结;需要资料的可以关注+私信‘资料’可以送大家 一起学习
对于自然界中的音频信号,如果转换成数字信号,进行音频编码,那么只能无限接近,不可能百分百还原。所以说实际上任何信号转换成数字信号都会“有损”。但是在计算机应用中,能够达到最高保真水平的就是PCM编码。因此,PCM约定俗成了无损编码。我们而习惯性的把MP3列入有损音频编码范畴,是相对PCM编码的。强调编码的相对性的有损和无损