美文网首页
进程间Socket通讯

进程间Socket通讯

作者: Cocojiang | 来源:发表于2021-05-28 16:50 被阅读0次

进程之间通讯代码使用方法.

第一步.

16221891079368.jpg


解压,添加到项目.必须也勾选扩展

第二步 SampleHandler 这个文件中,添加如下代码

#import <AgoraRtcKit/AgoraRtcEngineKit.h>
#import "RongRTCBufferUtil.h"

@interface SampleHandler ()
@property(nonatomic , strong) RongRTCClientSocket *clientSocket;
@property (nonatomic, assign) size_t w;
@property (nonatomic, assign) size_t h;
@property (nonatomic,assign) AgoraVideoRotation rotate;
@property (nonatomic,assign)NSTimeInterval lastSendTs;
@property (nonatomic,)CMSampleBufferRef  bufferCopy;
@property (nonatomic,weak) NSTimer *bufferTimer;
@end

懒加载

- (RongRTCClientSocket *)clientSocket {
    if (!_clientSocket) {
        _clientSocket = [[RongRTCClientSocket alloc] init];
        [_clientSocket createCliectSocket:(int)_w height:(int)_h];
    }
    return _clientSocket;
}

在此方法里

- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
 //判断是视频的话.调用下面的方法.进行编码通讯.
}
- (void)sendData:(CMSampleBufferRef)sampleBuffer{
    if (_w == 0 || _h == 0) {
        CVPixelBufferRef buffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        _w = CVPixelBufferGetWidth(buffer);
        _h = CVPixelBufferGetHeight(buffer);
    }
    [self.clientSocket encodeBuffer:sampleBuffer];

}

第三步在主APP的控制器内调用

@property (nonatomic, strong) RongRTCServerSocket *screenServerSocket;

懒加载


-(RongRTCServerSocket *)screenServerSocket{
    if (!_screenServerSocket) {
        RongRTCServerSocket *socket = [[RongRTCServerSocket alloc] init];
        socket.delegate = self;
        _screenServerSocket = socket;
    }
    return _screenServerSocket;
}

下面是代理方式.就能收到扩展过来的buffer了,是解码过的.

-(void)VZdidProcessSampleBuffer:(CVPixelBufferRef)cvPixelBufferRef andWith:(CMTime)time{
    if (self.isScreen) {
        DebugLog(@"%@",cvPixelBufferRef);
        [self.screenVideos.consumer consumePixelBuffer:cvPixelBufferRef withTimestamp:time rotation:self.currerRotation];
    }
}
-(void)startPushOrStopPush:(BOOL)isStart{
    self.isScreen = isStart;
}

接到扩展启动的时候APP调用的方法.

- (void)screenStartAction {
    ///第一种方法实现的地方
    
    if (!_screenServerSocket) {
        CGFloat W = (MIN(ScreenWidth, ScreenHeight)) * UIScreen.mainScreen.scale;
        CGFloat H = MAX(ScreenWidth, SCREEN_HEIGHT) * UIScreen.mainScreen.scale;
        [self.screenServerSocket createServerSocket:W height:H];
    }
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.rtcEngine muteAllRemoteAudioStreams:YES];
        [self.rtcEngine muteAllRemoteVideoStreams:YES];
        [self.rtcEngine setVideoSource:self.screenVideos];
    });

RongRTCServerSocketProtocol 这就是代理..

再贴上ScreenVideoSouces


#import <Foundation/Foundation.h>
#import <AgoraRtcKit/AgoraRtcEngineKit.h>

@protocol VZScreenShareVideoDelegate <NSObject>
-(void)startPushOrStopPush:(BOOL)isStart;
@end

NS_ASSUME_NONNULL_BEGIN

@interface VZScreenShareVideo : NSObject <AgoraVideoSourceProtocol>
@property (nonatomic,weak) id<VZScreenShareVideoDelegate> delegate;        

@end

NS_ASSUME_NONNULL_END

#import "VZScreenShareVideo.h"
@implementation VZScreenShareVideo
@synthesize consumer;

-(BOOL)shouldInitialize{
    return YES;
}
- (AgoraVideoBufferType)bufferType{
    return AgoraVideoBufferTypePixelBuffer;
};
-(AgoraVideoContentHint)contentHint{
    return AgoraVideoContentHintNone;
}
- (AgoraVideoCaptureType)captureType{
    return AgoraVideoCaptureTypeScreen;
}
- (void)shouldDispose {

}
- (void)shouldStart {
    if (self.delegate) {
        [self.delegate startPushOrStopPush:YES];
    }
}
- (void)shouldStop {
    if (self.delegate) {
        [self.delegate startPushOrStopPush:NO];
    }
}

相关文章

  • 进程间Socket通讯

    进程之间通讯代码使用方法. 第一步. 解压,添加到项目.必须也勾选扩展 第二步 SampleHandler 这个文...

  • android进程间通讯(3)--使用socket

    android进程间通讯(3)–使用Socket 前言:本文记录android进程间通讯的另一种通讯方式–Sock...

  • Unix domain socket

    一、 概述UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC)...

  • 055android的socket unix域通讯

    android中也有unix域的socket 通讯,也是一个很不错的,进程间通讯的机制,可参看如下的链接,需要de...

  • Binder机制

    Binder Binder是什么?进程间通讯机制Binder共享内存Socket性能需要拷贝一次无需拷贝需要拷贝两...

  • Android Binder

    进程间通讯 1. 操作系统的进程间通讯 进程间通讯 根据名字描述就是进程之间的信息交换进程间的互斥和同步 由于交换...

  • Linux网络编程之Socket初探

    Socket由来 Socket 的英文原意就是“孔”或“插座”,现在,作为 BSD UNIX 的进程通讯机制,取其...

  • 进程间通讯

    一、进程间通讯的方式进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和...

  • 进程间通讯

    进程间通讯原理 现代操作系统的运行模式都是在保护模式。进程运行在虚拟内存中,进程之间相互隔离,进程成为了操作系统分...

  • 进程间通讯

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道、FIFO、消息队列)同步(互斥量、...

网友评论

      本文标题:进程间Socket通讯

      本文链接:https://www.haomeiwen.com/subject/dwissltx.html