Webrtc支持HEVC之Mediasoup SDP协商编码流程(三)

一、SDP校验

1、服务端的rtp能力配置

文件位置:cst-medias-server/core/config.js

具体内容:moduls.export-mediasoup-routerOpitions-mediaCodeces

注意事项:对于音视频codec,clinet只会使用第一个识别到的codec,因此需要把配置的编码器放到同类型的第一位

2、客户端解析服务端rtp能力

// 通过信令像服务端请求Codec编码器信息
......
// 导入codec信息
MediaSoupClient->Load
// 加载codec信息,获取到端上支持的编码器类型
Device::Load
{// 解析并修改codec信息,缺失字段填入默认值ortc::validateRtpCapabilities(routerRtpCapabilities);// 获取rtp能力,包括配置的音视频codec能力(会显示所有能支持的codec能力),auto nativeRtpCapabilities = Handler::GetNativeRtpCapabilities(peerConnectionOptions);// 通过sdp协商,获取到支持的rtp能力// 匹配到远端和本机支持的rtp能力// 音频"mimeType": "audio/opus",// 视频"mimeType": "video/H264"、"mimeType": "video/VP8"、"mimeType": "video/VP9"this->extendedRtpCapabilities =ortc::getExtendedRtpCapabilities(nativeRtpCapabilities, routerRtpCapabilities);// 是否支持音视频则用this->canProduceByKind["audio"] = ortc::canSend("audio", this->extendedRtpCapabilities);this->canProduceByKind["video"] = ortc::canSend("video", this->extendedRtpCapabilities);// 获取接受rtp能力,codec和extendedRtpCapabilities一致this->recvRtpCapabilities = ortc::getRecvRtpCapabilities(this->extendedRtpCapabilities);
}

(1)、mediasoup获取rtp能力

  • 创建一个PeerConnection,

  • 通过PeerConnection::AddTransceiver,添加音频和视频

  • 并通过PeerConnection::CreateOffer,获取SDP信息

  • 通过 Sdp::Utils::extractRtpCapabilities解析sdp获取到codce、fecMechanisms、headerExtensions能力

(2)、webrtc获取SDP-Codec信息

// mediasoup
PeerConnection::CreateOffer
// 创建offer
SdpOfferAnswerHandler::CreateOffer
SdpOfferAnswerHandler::DoCreateOffer
// 获取headerExtensions
SdpOfferAnswerHandler::GetOptionsForOffer
// 主要是封装
WebRtcSessionDescriptionFactory::CreateOffer
MediaSessionDescriptionFactory::CreateOffer
{
....
// 获取codec的能力---这里面获取的codec有点多
MediaSessionDescriptionFactory::GetCodecsForOffer
...
// 遍历上面支持的MediaDescriptionOptions
// 添加音频编码器
AddAudioContentForOffer
{
// 通过不同类型的direction,获取到不同的编码器,并且和传入的编码器进行匹配
GetAudioCodecsForOffer
// 把编码器插入offer之中
CreateMediaContentOffer
// 插入编码器
offer->AddCodecs(codecs);
// 最终codec存放的位置为
SessionDescription-->ContentInfo->AudioContentDescription->MediaContentDescriptionImpl<AudioCodec>
}// 添加视频编码器
AddVideoContentForOffer
{
// 逻辑和音频一样,最终codec存放的位置为
SessionDescription-->ContentInfo->VideoContentDescription->MediaContentDescriptionImpl<VideoCodec>
}
}

(3)、编码器获取

// 创建PeerConnection时
PeerConnectionFactory::CreatePeerConnectionOrError
// 初始化PeerConnection
PeerConnection::Initialize
// 创建SdpOfferAnswerHandler
SdpOfferAnswerHandler::Create
// 初始化SdpOfferAnswerHandler
SdpOfferAnswerHandler::Initialize
// 创建WebRtcSessionDescriptionFactory
webrtc_session_desc_factory_ = std::make_unique<WebRtcSessionDescriptionFactory>
// 创建MediaSessionDescriptionFactory
MediaSessionDescriptionFactory()
{...// 初始化音视频编码器audio_send_codecs_ = media_engine->voice().send_codecs();audio_recv_codecs_ = media_engine->voice().recv_codecs();video_send_codecs_ = media_engine->video().send_codecs(rtx_enabled);video_recv_codecs_ = media_engine->video().recv_codecs(rtx_enabled);// 编码器分类ComputeAudioCodecsIntersectionAndUnion();ComputeVideoCodecsIntersectionAndUnion();
}// 获取视频编码器
WebRtcVideoEngine::send_codecs
// 获取默认支持的codec
GetPayloadTypesAndDefaultCodecs
{// 获取支持的编码器BuiltinVideoEncoderFactory::GetSupportedFormats// 获取支持的编码器---配置在internal_encoder_factory.ccInternalEncoderFactory::GetSupportedFormats
}

二、客户端创建编码器

1、创建通道

// 信令请求,获取transport相关信息
......
// 创建通道
TransportManager::CreateSendTransport
Device::CreateSendTransport
// 创建发生通道
SendTransport
{	 // 解析音频、视频rtp能力(官方代码只会获取一个extendedRtpCapabilities第一个编码器)ortc::getSendingRtpParameters("audio", *extendedRtpCapabilities)ortc::getSendingRtpParameters("video", *extendedRtpCapabilities)
}

2、创建Producer

// 信令,请求producer信息
......
// 利用前面创建出来的通道,组建RtpEncodingParameters,创建producer
SendTransport::Produce
// 这里会进行sdp协商, offer来自peerconnction->CreateOffer
SendHandler::Send
{......// 创建offerpc->CreateOffer(options);......// 设置offerpc->SetLocalDescription(PeerConnection::SdpType::OFFER, offer);......// local sdpauto localSdp       = this->pc->GetLocalDescription();// 解析成objectauto localSdpObject = sdptransform::parse(localSdp);// 获取offer 需要的对应媒体信息json& offerMediaObject = localSdpObject["media"][mediaSectionIdx.idx];// 这里获取的只有ssrc、rtx、flexfexauto newEncodings = Sdp::Utils::getRtpEncodings(offerMediaObject);// 把前面设置的RtpEncodingParameters 编码器参数填入newEncodings编码器。fillJsonRtpEncodingParameters(newEncodings.front(), encodings->front());// 指定objectsendingRtpParameters["encodings"] = newEncodings;// 获取第一个编码器类型auto mimeType = sendingRtpParameters["codecs"][0]["mimeType"].get<std::string>();// 配置设置远端sdpthis->remoteSdp->send// 获取answerauto answer = this->remoteSdp->GetSdp();// 设置answer,注意此时的SDP信息中,只存在一个编码器信息this->pc->SetRemoteDescription(PeerConnection::SdpType::ANSWER, answer);
}

3、创建编码器

Webrtc支持HEVC之编解码器创建(二)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows上进行git初始化时报错:fatal: unknown write failure on standard output

一、报错描述 1、git init命令一般是在命令行&#xff0c;切换到项目的根目录后执行 2、如果是windows的系统&#xff0c;我们粘贴路径时&#xff0c;需要进行转义命令行才能识别&#xff0c; 也就是像我下面写的 D:\\Users\\...3、报错信息进行解读 一般情况下&#xff0c;…

Pytorch-Lighting使用教程(MNIST为例)

一、pytorch-lighting简介 1.1 pytorch-lighting是什么 pytorch-lighting&#xff08;简称pl&#xff09;&#xff0c;基于 PyTorch 的框架。它的核心思想是&#xff0c;将学术代码&#xff08;模型定义、前向 / 反向、优化器、验证等&#xff09;与工程代码&#xff08;for-…

C++学习之避免使用野指针

现有结构体struct_a和struct_b&#xff0c;其中struct_b中包含struct_a指针作为成员变量。先基于struct_a定义一个变量a_ptr&#xff0c;之后定义一个struct_b指针变量b_ptr&#xff0c;并将a_ptr赋值给b_ptr中的struct_a类型变量。之后释放b_ptr&#xff0c; 那么a_ptr指向的内…

红队内网攻防渗透:内网渗透之windows内网权限提升技术:工具篇

红队内网攻防渗透 1. 内网权限提升技术1.1 windows内网权限提升技术--工具篇1.1.1 Web到Win系统提权-平台&语言&用户1.1.1.1 Web搭建平台差异1.1.1.2 Web语言权限差异1.1.1.3 系统用户权限差异1.1.2 Web到Win系统提权-Windows 2012宝塔面板-哥斯拉1.1.2.1 环境条件:1.…

Anthropic公司CEO谈AI发展:Cluade安全超过商业利益

Anthropic公司今年3月发布的超越GPT-4模型Claude3 opus&#xff0c;成功吸引了大量GPT-4用户“叛变”。 作为OpenAI的头号劲敌&#xff0c;Claude3发布方Anthropic公司的联合创始人兼CEO&#xff0c;达里奥阿莫迪&#xff08;DarioAmodei&#xff09;承诺&#xff1a;在能够制…

生信分析进阶4 - 比对结果的FLAG和CIGAR信息含义与BAM文件指定区域提取

BAM文件时存储比对数据的常用格式&#xff0c;可用于短reads和长reads数据。BAM是二进制压缩格式&#xff0c;SAM文件为其纯文本格式&#xff0c;CRAM为BAM的高压缩格式&#xff0c;IO效率相比于BAM略差&#xff0c;但是占用存储空间更小。 1. BAM文件的比对信息 BAM的核心信…

用c语言实现通讯录

目录 静态简易通讯录 代码&#xff1a; 功能模块展示&#xff1a; 设计思路&#xff1a; 动态简易通讯录&#xff08;本质顺序表&#xff09; 代码&#xff1a; 扩容模块展示&#xff1a; 设计思路&#xff1a; 文件版本通讯录 代码&#xff1a; 文件模块展示&#x…

pas编程语言:深度剖析与实用技巧

pas编程语言&#xff1a;深度剖析与实用技巧 在编程的浩瀚海洋中&#xff0c;pas编程语言以其独特的魅力和深厚的内涵吸引着众多编程爱好者。然而&#xff0c;其复杂性和深度也常常让人望而生畏。本文将从四个方面、五个方面、六个方面和七个方面对pas编程语言进行深入剖析&am…

SJ705C安全帽高温预处理箱

一、仪器用途 安全帽高温预处理箱是我公司根据安全帽新国家标准检测试验要求而自主设计研发制造。是安全帽检测前做高温预处理的专用设备。 二、仪器特征 1、有PID自整定温度控制仪&#xff0c;控制准确。 2、数显计时、计温器。 3、石英灯管加热系统;。 …

【数据结构】单链表-->详细讲解,后赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前面已经介绍顺序表&#xff0c;顺序表存在一定的局限性&#xff0c;空间管理上存在一定的缺陷&#xff0c;今天介绍新的存储结构单链表。 前言&#xff1a; 单链表是一种基本的数据结构&#xff0c;它由一系列节点组成&a…

HTML网页滚动条使用整理_网页滚动条使用详解

一、HTML 网页滚动条 HTML Document 滚动条,自动出现; 当网页内容超出浏览器可视宽度或者高度,滚动条自动出现; 不同浏览器滚动条样式效果不同。 二、Css 修改滚动条样式 Css 伪元素控制进度条_Css控制滚动条_Css ::-webkit-scrollbar整理 三、Js监听滚动条,触底加载事…

Android 调试桥_ADB命令

Android 调试桥 ADB全称 【Android Debug Bridge】 是Android SDK中的一个命令行工具&#xff0c;adb命令可以直接操作管理Android模拟器或真实的Android设备&#xff08;手机&#xff09; ADB的工作原理 启动一个 adb 客户端时&#xff0c;此客户端首先检查是否有已运行的 …

python zip()函数(将多个可迭代对象的元素配对,创建一个元组的迭代器)zip_longest()

文章目录 Python zip() 函数深入解析基本用法函数原型基础示例 处理不同长度的迭代器高级用法多个迭代器使用 zip() 与 dict()解压序列 注意事项内存效率&#xff1a;zip() 返回的是一个迭代器&#xff0c;这意味着直到迭代发生前&#xff0c;元素不会被消耗。这使得 zip() 特别…

自然语言处理基础知识入门(六) GPT模型详解

GPT 前言一、GPT模型1.1 为什么采用Decoder模块&#xff1f;1.2 为什么不使用Encoder模块&#xff1f; 二、 模型训练2.1 预训练阶段2.2 半监督微调 总结 前言 在之前的章节中&#xff0c;深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进…

[数据集][目标检测][数据集][目标检测]智能手机检测数据集VOC格式5447张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;5447 标注数量(xml文件个数)&#xff1a;5447 标注类别数&#xff1a;1 标注类别名称:["phone"] 每个类别标注的框数&#xff…

2024年华为OD机试真题-执行时长-Python-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执…

Qt程序错误“QObject::connect: Cannot queue arguments of type ‘QTextCursor’”的解决方法

背景&#xff1a; 在Qt的线程中调用QTexiEdit控件的append&#xff08;QString&#xff09;或insertPlainText&#xff08;QString&#xff09;&#xff0c;线程首次执行会报错 “QObject::connect: Cannot queue arguments of type ‘QTextCursor”&#xff0c;销毁该线程&a…

Pytorch中Tensor的类型对应表

Data typedtypeCPU tensorGPU tensor32位浮点数torch.float32 or torch.floattorch.FloatTensortorch.cuda.FloatTensor64位浮点数torch.float64 or torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor16位浮点数torch.float16 or torch.halftorch.HalfTensortorch.cuda.H…

Flutter 中的 SliverWithKeepAliveWidget 小部件:全面指南

Flutter 中的 SliverWithKeepAliveWidget 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverWithKeepAliveWidget 是一…

宝塔Linux面板-Docker管理(2024详解)

上一篇文章《宝塔Linux可视化运维面板-详细教程2024》,详细介绍了宝塔Linux面板的详细安装和配置方法。本文详细介绍使用Linux面板管理服务器Docker环境。 目录 1、安装Docker 1.1 在线安装 ​编辑 1.2 手动安装 1.3 运行状态 1.4 镜像加速 2 应用商店 3 总览 4 容器 …