直播源码技术屏幕共享功能
Posted bogokj-bugukj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直播源码技术屏幕共享功能相关的知识,希望对你有一定的参考价值。
随着科技的发展,直播也在迅速的发展,不管是在学校还是娱乐中,直播都可以为我们提供帮助。那大家有没有这样的一个问题,就是如果我是一位老师,在教室里用手机直播讲课,但我想将我的直播课在身后的大屏幕上也显示出来,又或是,我在家里用手机去看直播,但我感觉用手机看不过瘾想让他在电视上同步播放,那该怎么办那?这就要用到我们日常生活中常见且常用的一个功能:屏幕共享!
一、直播屏幕共享功能的定义以及作用
直播屏幕共享功能是指在一个屏幕直播对单个或者多个屏幕进行实时控制,使这个屏幕的直播内容在单个或多个屏幕中进行显示。它的作用有很多,比如对于上课来说老师开启直播课手机电脑投影仪都能共享投放,让学生实时实地的看到老师的直播共享课;又比如像我第一段说的在家里用手机看直播时,感觉屏幕太小,可以共享在电视上。这都是直播屏幕共享的作用。
二、直播屏幕共享功能的实现(部分代码)
首先请求屏幕共享功能,填写ID等信息
之后用到我前面讲过的直播源码推拉流技术
采集屏幕共享摄像头麦克风推流,在拉流进行播放
最后采集屏幕共享摄像头麦克风流,屏幕共享成功
三、总结:
这样我们就实现了直播源码技术屏幕共享功能,这个功能也是开发直播app平台的重要功能之一,大家如果还有什么不懂可以问我,我会为大家继续分享开发直播平台app的知识。
iOS ReplayKit 屏幕共享,屏幕直播实现
使用replayKit iOS12 之后相关 api 完成系统/app 内 屏幕采集直播视频数据, 采用 socket进行进程间Broadcast Unload Extension 向 宿主 app 传输数据, 后台保活持续采集屏幕数据, 摄像头采集, 数据编码解码
编译环境 Xcode14.2, iOS12
- 系统屏幕数据采集
- app 内屏幕共享
- 使用socket 由 Broadcast Unload Extension 向宿主 app 传输数据
- 视频解码
- 程序永久保活
- 创建 framework 供 Broadcast Unload Extension 和宿主 app 调用共用类
文章目录
1. 第一步创建 Broadcast Unload Extension
步骤: File -> new -> Target
创建好之后生成 一个扩展 App, 自动生成如图的一个 sampleHandr类
- (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo
// User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
// 宿主 app开始直播屏幕的时候这里会走一次
// 设置 socket
// 其中 FIAgoraSampleHandlerSocketManager这个类可以看 Demo 的实现
[[FIAgoraSampleHandlerSocketManager sharedManager] setUpSocket];
- (void)broadcastPaused
// User has requested to pause the broadcast. Samples will stop being delivered.
- (void)broadcastResumed
// User has requested to resume the broadcast. Samples delivery will resume.
- (void)broadcastFinished
// User has requested to finish the broadcast.
// 实时采集数据
- (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType
switch (sampleBufferType)
case RPSampleBufferTypeVideo:
// Handle video sample buffer
// 发送视频数据导宿主 App
[[FIAgoraSampleHandlerSocketManager sharedManager] sendVideoBufferToHostApp:sampleBuffer];
break;
case RPSampleBufferTypeAudioApp:
// Handle audio sample buffer for app audio
break;
case RPSampleBufferTypeAudioMic:
// Handle audio sample buffer for mic audio
break;
default:
break;
2. FIAgoraSampleHandlerSocketManager 关于数据传输的类 都放到一个framework 当中
- 步骤: File -> new -> Target 创建 framework, 如图 1
- 创建好之后在宿主 app 和 extension 分别引用, 如图 2
3. 宿主 App
- 手动启动直播
- 需要永久保活
- 监测数据回调
- 编码
- 推流
- 初始化开启直播的按钮
// 设置系统的广播 Picker 视图
- (void)setupSystemBroadcastPickerView
// 兼容 iOS12 或更高的版本
if (@available(iOS 12.0, *))
self.broadcastPickerView = [[RPSystemBroadcastPickerView alloc] initWithFrame:CGRectMake(50, 200, 100, 100)];
self.broadcastPickerView.preferredExtension = @"summerxx.com.screen-share-ios.broadcast-extension";
self.broadcastPickerView.backgroundColor = UIColor.cyanColor;
self.broadcastPickerView.showsMicrophoneButton = NO;
[self.view addSubview:self.broadcastPickerView];
// 改变系统提供的按钮的 UI, 这里有个风险, 以后可能会失效, 暂时用没有什么问题
UIButton *startButton = [UIButton buttonWithType:UIButtonTypeCustom];
startButton.frame = CGRectMake(50, 310, 100, 100);
startButton.backgroundColor = UIColor.cyanColor;
[startButton setTitle:@"开启摄像头" forState:UIControlStateNormal];
[startButton setTitleColor:UIColor.blackColor forState:UIControlStateNormal];
[startButton addTarget:self action:@selector(startAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:startButton];
- 保活
监听
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didEnterBackGround) name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(willEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
- (void)willEnterForeground
// 这里具体可看 Demo
[[FJDeepSleepPreventerPlus sharedInstance] stop];
- (void)didEnterBackGround
[[FJDeepSleepPreventerPlus sharedInstance] start];
- 数据回调
__weak __typeof(self) weakSelf = self;
[FIAgoraClientBufferSocketManager sharedManager].testBlock = ^(NSString * testText, CMSampleBufferRef sampleBuffer)
// 进行视频编码
[weakSelf.h264code encodeSampleBuffer:sampleBuffer H264DataBlock:^(NSData * data)
NSLog(@"%@", data);
// 编码后可进行推流流程
];
;
到此就基本结束了
其中 数据传输的方式, 还可以用 App Group 的方式 我也实现了
Demo App Group
https://github.com/summerxx27/ReplayKitShareScreen
Demo socket 实现数据传输
https://github.com/summerxx27/ReplayKitShareScreen-socket
以上是关于直播源码技术屏幕共享功能的主要内容,如果未能解决你的问题,请参考以下文章