当前位置: 首页 > news >正文

成都访问公司网站wordpress文章怎么加分享

成都访问公司网站,wordpress文章怎么加分享,ps线下培训班一般学费多少,企业运营策划公司一、库集成 首先#xff0c;确保在你的 Podfile 中添加依赖#xff1a; pod GoogleWebRTC然后执行 pod install 安装库。 二、代码示例 2.1、权限配置#xff1a;在 Info.plist 中添加摄像头、麦克风权限 !-- 需要在 Info.plist 中添加以下权限 -- keyNSCam…一、库集成 首先确保在你的 Podfile 中添加依赖 pod GoogleWebRTC然后执行 pod install 安装库。 二、代码示例 2.1、权限配置在 Info.plist 中添加摄像头、麦克风权限 !-- 需要在 Info.plist 中添加以下权限 -- keyNSCameraUsageDescription/key string需要访问摄像头进行视频通话/string keyNSMicrophoneUsageDescription/key string需要访问麦克风进行语音通话/string keyNSAppTransportSecurity/key dictkeyNSAllowsArbitraryLoads/keytrue/ /dict2.2、代码 核心类ocWebRTCManager.m #import WebRTCManager.h #import AVFoundation/AVFoundation.hinterface WebRTCManager () property (nonatomic, strong) RTCPeerConnectionFactory *factory; property (nonatomic, strong) RTCVideoTrack *localVideoTrack; property (nonatomic, strong) RTCAudioTrack *localAudioTrack; property (nonatomic, strong) RTCVideoRendererAdapter *localRenderer; endimplementation WebRTCManager- (instancetype)initWithDelegate:(idWebRTCManagerDelegate)delegate {self [super init];if (self) {_delegate delegate;[self setupPeerConnectionFactory];[self setupPeerConnection];}return self; }// 初始化 PeerConnection 工厂 - (void)setupPeerConnectionFactory {RTCInitializeSSL();_factory [[RTCPeerConnectionFactory alloc] init]; }// 配置并创建 PeerConnection - (void)setupPeerConnection {RTCConfiguration *config [[RTCConfiguration alloc] init];config.iceServers [[[RTCIceServer alloc] initWithURLStrings:[stun:stun.l.google.com:19302]]];RTCOfferAnswerOptions *offerAnswerOptions [[RTCOfferAnswerOptions alloc] init];offerAnswerOptions.offerToReceiveAudio YES;offerAnswerOptions.offerToReceiveVideo YES;RTCMediaConstraints *constraints [[RTCMediaConstraints alloc] initWithMandatoryConstraints:[] optionalConstraints:[]];_peerConnection [_factory peerConnectionWithConfiguration:config constraints:constraints delegate:self]; }// 初始化本地媒体流 - (void)setupLocalStreamWithVideoView:(UIView *)videoView {// 请求音视频权限[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {dispatch_async(dispatch_get_main_queue(), ^{if (granted) {[self createLocalMediaStream];[self setupLocalVideoRender:videoView];} else {NSLog(需要摄像头权限才能使用视频功能);}});}]; }// 创建本地媒体流 - (void)createLocalMediaStream {_localStream [_factory mediaStreamWithStreamId:localStream];// 创建音频轨道RTCAudioSource *audioSource [_factory audioSourceWithConstraints:[self defaultMediaConstraints]];_localAudioTrack [_factory audioTrackWithSource:audioSource trackId:audio0];[_localStream addAudioTrack:_localAudioTrack];// 创建视频轨道RTCVideoSource *videoSource [_factory videoSourceWithConstraints:[self videoConstraints]];_localVideoTrack [_factory videoTrackWithSource:videoSource trackId:video0];[_localStream addVideoTrack:_localVideoTrack];// 将本地流添加到 PeerConnection[_peerConnection addStream:_localStream]; }// 设置本地视频渲染 - (void)setupLocalVideoRender:(UIView *)videoView {RTCMTLVideoView *rendererView [[RTCMTLVideoView alloc] init];rendererView.frame videoView.bounds;rendererView.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;[videoView addSubview:rendererView];_localRenderer [[RTCVideoRendererAdapter alloc] initWithRenderer:rendererView];[_localVideoTrack addRenderer:_localRenderer]; }// 创建 Offer - (void)createOffer {RTCOfferAnswerConstraints *constraints [[RTCOfferAnswerConstraints alloc] init];constraints.mandatoryConstraints [[[RTCPair alloc] initWithKey:OfferToReceiveAudio value:true],[[RTCPair alloc] initWithKey:OfferToReceiveVideo value:true]];[_peerConnection createOfferWithConstraints:constraints completionHandler:^(RTCSessionDescription * _Nullable sdp, NSError * _Nullable error) {if (error) {NSLog(创建 Offer 失败: %, error.localizedDescription);return;}[self.peerConnection setLocalDescriptionWithSessionDescription:sdp completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(设置本地描述失败: %, error.localizedDescription);return;}// 这里应该将 sdp 发送给信令服务器NSString *offerString [self sessionDescriptionToString:sdp];NSLog(生成 Offer: %, offerString);// [self.signalingClient sendOffer:offerString];}];}]; }// 处理远程 Offer - (void)handleRemoteOffer:(NSString *)offer {RTCSessionDescription *remoteSDP [self stringToSessionDescription:offer type:RTCSdpTypeOffer];[_peerConnection setRemoteDescriptionWithSessionDescription:remoteSDP completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(设置远程 Offer 失败: %, error.localizedDescription);return;}// 创建 Answer[self createAnswer];}]; }// 创建 Answer - (void)createAnswer {RTCOfferAnswerConstraints *constraints [[RTCOfferAnswerConstraints alloc] init];[_peerConnection createAnswerWithConstraints:constraints completionHandler:^(RTCSessionDescription * _Nullable sdp, NSError * _Nullable error) {if (error) {NSLog(创建 Answer 失败: %, error.localizedDescription);return;}[self.peerConnection setLocalDescriptionWithSessionDescription:sdp completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(设置本地 Answer 失败: %, error.localizedDescription);return;}// 将 Answer 发送给信令服务器NSString *answerString [self sessionDescriptionToString:sdp];NSLog(生成 Answer: %, answerString);// [self.signalingClient sendAnswer:answerString];}];}]; }// 处理远程 Answer - (void)handleRemoteAnswer:(NSString *)answer {RTCSessionDescription *remoteSDP [self stringToSessionDescription:answer type:RTCSdpTypeAnswer];[_peerConnection setRemoteDescriptionWithSessionDescription:remoteSDP completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(设置远程 Answer 失败: %, error.localizedDescription);}}]; }// 处理远程 ICE 候选者 - (void)handleRemoteICECandidate:(NSString *)candidate {NSDictionary *candidateDict [NSJSONSerialization JSONObjectWithData:[candidate dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];if (!candidateDict) return;RTCIceCandidate *iceCandidate [[RTCIceCandidate alloc] initWithSdpMLineIndex:[candidateDict[sdpMLineIndex] integerValue]sdpMid:candidateDict[sdpMid]sdp:candidateDict[sdp]];[_peerConnection addIceCandidate:iceCandidate completionHandler:^(NSError * _Nullable error) {if (error) {NSLog(添加远程 ICE 候选者失败: %, error.localizedDescription);}}]; }// 断开连接 - (void)disconnect {[_peerConnection close];_peerConnection nil;[_localStream removeAllAudioTracks];[_localStream removeAllVideoTracks];_localStream nil; }#pragma mark - RTCPeerConnectionDelegate// 收到远程媒体流 - (void)peerConnection:(RTCPeerConnection *)peerConnection didAddStream:(RTCMediaStream *)stream {NSLog(收到远程媒体流);if ([self.delegate respondsToSelector:selector(didReceiveRemoteStream:)] stream) {[self.delegate didReceiveRemoteStream:stream];} }// 生成 ICE 候选者 - (void)peerConnection:(RTCPeerConnection *)peerConnection didGenerateIceCandidate:(RTCIceCandidate *)candidate {NSDictionary *candidateDict {sdpMLineIndex: (candidate.sdpMLineIndex),sdpMid: candidate.sdpMid ?: ,sdp: candidate.sdp};NSData *jsonData [NSJSONSerialization dataWithJSONObject:candidateDict options:0 error:nil];NSString *candidateString [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];// 将 ICE 候选者发送给信令服务器NSLog(生成 ICE 候选者: %, candidateString);// [self.signalingClient sendICECandidate:candidateString]; }#pragma mark - 工具方法// 媒体约束配置 - (RTCMediaConstraints *)defaultMediaConstraints {return [[RTCMediaConstraints alloc] initWithMandatoryConstraints:[] optionalConstraints:[]]; }// 视频约束配置 - (RTCMediaConstraints *)videoConstraints {return [[RTCMediaConstraints alloc] initWithMandatoryConstraints:[[[RTCPair alloc] initWithKey:maxWidth value:1280],[[RTCPair alloc] initWithKey:maxHeight value:720],[[RTCPair alloc] initWithKey:maxFrameRate value:30]] optionalConstraints:[]]; }// 将 SessionDescription 转换为字符串 - (NSString *)sessionDescriptionToString:(RTCSessionDescription *)sdp {NSDictionary *dict {type: [self sdpTypeToString:sdp.type],sdp: sdp.sdp};NSData *jsonData [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; }// 将字符串转换为 SessionDescription - (RTCSessionDescription *)stringToSessionDescription:(NSString *)string type:(RTCSdpType)type {NSData *data [string dataUsingEncoding:NSUTF8StringEncoding];NSDictionary *dict [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];return [[RTCSessionDescription alloc] initWithType:type sdp:dict[sdp]]; }// SDP 类型转换 - (NSString *)sdpTypeToString:(RTCSdpType)type {switch (type) {case RTCSdpTypeOffer: return offer;case RTCSdpTypeAnswer: return answer;case RTCSdpTypePrAnswer: return pranswer;case RTCSdpTypeRollback: return rollback;default: return ;} }end调用OCViewController.m #import ViewController.h #import WebRTC/WebRTC.hinterface ViewController () property (nonatomic, strong) WebRTCManager *rtcManager; property (nonatomic, strong) UIView *localVideoView; property (nonatomic, strong) UIView *remoteVideoView; property (nonatomic, strong) UIButton *connectButton; endimplementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor UIColor.whiteColor;[self setupUI];[self setupWebRTC]; }- (void)setupUI {// 本地视频视图_localVideoView [[UIView alloc] init];_localVideoView.backgroundColor UIColor.lightGrayColor;_localVideoView.translatesAutoresizingMaskIntoConstraints NO;[self.view addSubview:_localVideoView];// 远程视频视图_remoteVideoView [[UIView alloc] init];_remoteVideoView.backgroundColor UIColor.darkGrayColor;_remoteVideoView.translatesAutoresizingMaskIntoConstraints NO;[self.view addSubview:_remoteVideoView];// 连接按钮_connectButton [UIButton buttonWithType:UIButtonTypeSystem];[_connectButton setTitle:建立连接 forState:UIControlStateNormal];[_connectButton addTarget:self action:selector(connectButtonTapped) forControlEvents:UIControlEventTouchUpInside];_connectButton.translatesAutoresizingMaskIntoConstraints NO;[self.view addSubview:_connectButton];// 布局[NSLayoutConstraint activateConstraints:[// 本地视频右上角小窗口[_localVideoView topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor constant:20],[_localVideoView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-20],[_localVideoView.widthAnchor constraintEqualToConstant:120],[_localVideoView.heightAnchor constraintEqualToConstant:180],// 远程视频全屏[_remoteVideoView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor],[_remoteVideoView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],[_remoteVideoView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],[_remoteVideoView.bottomAnchor constraintEqualToAnchor:self.connectButton.topAnchor constant:-20],// 连接按钮[_connectButton.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor constant:-20],[_connectButton.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor],[_connectButton.widthAnchor constraintEqualToConstant:120],[_connectButton.heightAnchor constraintEqualToConstant:44]]]; }- (void)setupWebRTC {_rtcManager [[WebRTCManager alloc] initWithDelegate:self];[_rtcManager setupLocalStreamWithVideoView:self.localVideoView]; }- (void)connectButtonTapped {[_rtcManager createOffer]; }#pragma mark - WebRTCManagerDelegate// 处理收到的远程流 - (void)didReceiveRemoteStream:(RTCMediaStream *)stream {dispatch_async(dispatch_get_main_queue(), ^{// 渲染远程视频if (stream.videoTracks.count 0) {RTCVideoTrack *remoteVideoTrack stream.videoTracks[0];RTCMTLVideoView *rendererView [[RTCMTLVideoView alloc] init];rendererView.frame self.remoteVideoView.bounds;rendererView.autoresizingMask UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;[self.remoteVideoView addSubview:rendererView];[remoteVideoTrack addRenderer:[[RTCVideoRendererAdapter alloc] initWithRenderer:rendererView]];}}); }- (void)dealloc {[_rtcManager disconnect]; }end代码说明 这个示例实现了 iOS 平台上基于 WebRTC 的基本音视频推拉流功能主要包含以下部分 WebRTCManager核心管理类负责 初始化 WebRTC 相关组件处理本地音视频流的捕获和预览管理 PeerConnection 连接处理 SDP 交换和 ICE 候选者 ViewController界面控制器负责 创建本地和远程视频的预览视图处理用户交互如建立连接渲染远程视频流 三、使用说明 这个示例缺少信令服务器的实现你需要自己搭建一个信令服务器 在实际使用中需要将代码中注释掉的信令发送部分替换为实际的网络请求 代码中的 STUN 服务器使用了 Google 的公共服务器生产环境中建议使用自己的 STUN/TURN 服务器 四、扩展建议 添加错误处理和重连机制实现多人通话功能添加视频质量控制实现屏幕共享功能添加音频 /video 开关控制 这个示例仅仅提供了基础的推拉流框架你可以根据实际需求进行扩展和优化。
http://www.zqtcl.cn/news/550974/

相关文章:

  • 网站开发价格预算成都必去的地方排行榜
  • 鹤岗做网站企业建立网站主要包括那些流程
  • 如何进网站出口外贸是做什么的
  • 网站制作北京网站建设公司哪家好一个人 建设网站
  • 百度网站是什么阿里云免费网站建设
  • 网站建设平台源码攻击网站步骤
  • 注册了网站之后怎么设计深圳开发app
  • 国外网站搭建平台移动互联网公司
  • 做网络私活的网站网站开发的人
  • 数据分析网站开发四川手机网站设计方案
  • 什么是网络营销的方法莱州网站建设关键字排名优化网络托管微信代运营
  • 雅虎网站收录提交入口怎么看网站谁做的
  • 青浦专业做网站免费网站软件大全
  • joomla 网站图标六安市城市建设档案馆网站
  • 郑州 公司网站制作win10 wordpress安装
  • html5网站有哪些网站建设部分费用会计科目
  • 网站域名备案 更改吗深圳新站优化
  • 房产网站门户系统免费网站免费无遮挡
  • 用国外网站 图片做自媒体seo诊断a5
  • 广州市南沙建设局网站优改网logo设计
  • 网站建设亿玛酷知名公司网站首页如何做
  • 教育网站 php网络服务公司
  • net域名做网站怎么样建站公司 转型经验
  • 赣州网站建设哪家公司好上海市建设安全协会网站
  • 网站排名优化软件有哪些西宁网站建设官网
  • 支付宝手机网站签约迪庆公司网站开发方法
  • 唐山网站关键词优化网站开发公司推荐
  • 福建响应式网站制作市工商局网站建设情况
  • 深圳网站运营托管罗伯特清崎说的网络营销是什么
  • 太仓市质监站网址百度关键字推广费用