KSYGPUPipStreamerKit.m 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. //
  2. // KSYGPUPipStreamerKit.m
  3. // KSYStreamer
  4. //
  5. // Created by jaingdong on 28/12/16.
  6. // Copyright © 2016 ksyun. All rights reserved.
  7. //
  8. #import "KSYGPUPipStreamerKit.h"
  9. #define CASE_RETURN( ENU ) case ENU : {return @#ENU;}
  10. #define weakObj(o) __weak typeof(o) o##Weak = o;
  11. @interface KSYGPUPipStreamerKit (){
  12. NSLock * _quitLock; // ensure capDev closed before dealloc
  13. }
  14. @end
  15. @implementation KSYGPUPipStreamerKit
  16. - (instancetype) initWithDefaultCfg {
  17. self = [super initWithDefaultCfg];
  18. _bgPicLayer = 0;
  19. _pipLayer = 1;
  20. _pipTrack = 2;
  21. _yuvInput = nil;
  22. _player = nil;
  23. _bgPic = nil;
  24. return self;
  25. }
  26. @synthesize bgPicRect = _bgPicRect;
  27. - (CGRect) bgPicRect {
  28. return [self.vPreviewMixer getPicRectOfLayer:_bgPicLayer];
  29. }
  30. - (void) setBgPicRect:(CGRect)logoRect{
  31. [self.vPreviewMixer setPicRect:logoRect
  32. ofLayer:_bgPicLayer];
  33. [self.vStreamMixer setPicRect:logoRect
  34. ofLayer:_bgPicLayer];
  35. }
  36. @synthesize pipRect = _pipRect;
  37. - (CGRect) pipRect {
  38. return [self.vPreviewMixer getPicRectOfLayer:_pipLayer];
  39. }
  40. - (void) setPipRect:(CGRect)logoRect{
  41. [self.vPreviewMixer setPicRect:logoRect
  42. ofLayer:_pipLayer];
  43. [self.vStreamMixer setPicRect:logoRect
  44. ofLayer:_pipLayer];
  45. }
  46. @synthesize cameraRect = _cameraRect;
  47. - (CGRect) cameraRect {
  48. return [self.vPreviewMixer getPicRectOfLayer:self.cameraLayer];
  49. }
  50. - (void) setCameraRect:(CGRect)logoRect{
  51. [self.vPreviewMixer setPicRect:logoRect
  52. ofLayer:self.cameraLayer];
  53. [self.vStreamMixer setPicRect:logoRect
  54. ofLayer:self.cameraLayer];
  55. }
  56. //设置图层的位置
  57. -(void) setLayerRect{
  58. self.bgPicRect = CGRectMake(0.0, 0.0, 1.0, 1.0);
  59. self.pipRect = CGRectMake(-1.0, -1.0, 0.0, 0.0);
  60. self.cameraRect = CGRectMake(0.7, 0.7, 0.24, 0.24);
  61. }
  62. -(void)startPipWithPlayerUrl:( NSURL* _Nullable )playerUrl
  63. bgPic:( NSURL* _Nullable )bgUrl
  64. {
  65. if (_player) {
  66. [self stopPip];
  67. }
  68. if(playerUrl) {
  69. [self.aMixer setTrack:_pipTrack enable:YES];
  70. [self.aMixer setMixVolume:1 of:_pipTrack];
  71. BOOL shouldUseHWCodec = YES;
  72. BOOL shouldAutoplay = YES;
  73. BOOL shouldMute = NO;
  74. _yuvInput = [[KSYGPUPicInput alloc] init];
  75. _player = [[KSYMoviePlayerController alloc]initWithContentURL:playerUrl];
  76. _player.videoDecoderMode = shouldUseHWCodec ? MPMovieVideoDecoderMode_Hardware : MPMovieVideoDecoderMode_Software;
  77. _player.shouldAutoplay = shouldAutoplay;
  78. _player.shouldMute = shouldMute;
  79. weakObj(self);
  80. _player.videoDataBlock = ^(CMSampleBufferRef buf){
  81. CVPixelBufferRef pb = CMSampleBufferGetImageBuffer(buf);
  82. [selfWeak.yuvInput forceProcessingAtSize:CGSizeMake(CVPixelBufferGetWidth(pb), CVPixelBufferGetHeight(pb))];
  83. [selfWeak.yuvInput processPixelBuffer:CMSampleBufferGetImageBuffer(buf) time:CMTimeMake(2, 10)];
  84. };
  85. _player.audioDataBlock = ^(CMSampleBufferRef buf){
  86. if ([selfWeak.streamerBase isStreaming]){
  87. [selfWeak.aMixer processAudioSampleBuffer:buf of:selfWeak.pipTrack];
  88. }
  89. };
  90. }
  91. if(bgUrl) {
  92. _bgPic = [[GPUImagePicture alloc] initWithURL:bgUrl];
  93. }
  94. [self setLayerRect];
  95. [self setupPipFilter:self.filter];
  96. [_player prepareToPlay];
  97. }
  98. -(void)stopPip
  99. {
  100. if (_player) {
  101. [_player stop];
  102. _player = nil;
  103. }
  104. _yuvInput = nil;
  105. _bgPic = nil;
  106. [self.aMixer setTrack:_pipTrack enable:NO];
  107. self.cameraRect = CGRectMake(0.0, 0.0, 1.0, 1.0);
  108. [self setupPipFilter:self.filter];
  109. }
  110. - (void) setupPipFilter:(GPUImageOutput<GPUImageInput> *) filter {
  111. if (self.vCapDev == nil) {
  112. return;
  113. }
  114. // 采集的图像先经过前处理
  115. [self.capToGpu removeAllTargets];
  116. GPUImageOutput* src = self.capToGpu;
  117. if (filter) {
  118. [filter removeAllTargets];
  119. [src addTarget:filter];
  120. src = filter;
  121. }
  122. // 组装图层
  123. if (_bgPic){
  124. [self addPic:self.bgPic ToMixerAt:self.bgPicLayer];
  125. }
  126. if (_yuvInput){
  127. [self addPic:self.yuvInput ToMixerAt:self.pipLayer];
  128. }
  129. self.vPreviewMixer.masterLayer = self.cameraLayer;
  130. self.vStreamMixer.masterLayer = self.cameraLayer;
  131. [self addPic:src ToMixerAt:self.cameraLayer];
  132. [self addPic:self.logoPic ToMixerAt:self.logoPicLayer];
  133. [self addPic:self.textPic ToMixerAt:self.logoTxtLayer];
  134. // 混合后的图像输出到预览和推流
  135. [self.vPreviewMixer removeAllTargets];
  136. [self.vPreviewMixer addTarget:self.preview];
  137. [self.vStreamMixer removeAllTargets];
  138. [self.vStreamMixer addTarget:self.gpuToStr];
  139. // 设置镜像
  140. [self setPreviewMirrored:self.previewMirrored];
  141. [self setStreamerMirrored:self.streamerMirrored];
  142. [self setPreviewOrientation:self.previewOrientation];
  143. [self setStreamOrientation:self.streamOrientation];
  144. }
  145. // 添加图层到 vMixer 中
  146. - (void) addPic:(GPUImageOutput*)pic ToMixerAt: (NSInteger)idx{
  147. KSYGPUPicMixer * vMixer[2] = {self.vPreviewMixer, self.vStreamMixer};
  148. if (pic == nil){
  149. for (int i = 0; i<2; ++i) {
  150. [vMixer[i] clearPicOfLayer:idx];
  151. }
  152. return;
  153. }
  154. [pic removeAllTargets];
  155. for (int i = 0; i<2; ++i) {
  156. [pic addTarget:vMixer[i] atTextureLocation:idx];
  157. }
  158. }
  159. - (void)dealloc {
  160. [_quitLock lock];
  161. [self closePipKit];
  162. [_quitLock unlock];
  163. _quitLock = nil;
  164. }
  165. - (void) closePipKit{
  166. if (_player){
  167. [self stopPip];
  168. }
  169. [self resetFilters ];
  170. }
  171. - (void) resetFilters {
  172. _yuvInput = nil;
  173. _bgPic = nil;
  174. _player = nil;
  175. }
  176. /**
  177. @abstract 获取状态对应的字符串
  178. @param stat 状态
  179. */
  180. - (NSString*) getPipStateName : (MPMoviePlaybackState) stat {
  181. switch (stat){
  182. CASE_RETURN(MPMoviePlaybackStateStopped)
  183. CASE_RETURN(MPMoviePlaybackStatePlaying)
  184. CASE_RETURN(MPMoviePlaybackStatePaused)
  185. default: { return @"unknow"; }
  186. }
  187. }
  188. /**
  189. @abstract 获取当前状态对应的字符串
  190. */
  191. - (NSString*) getCurPipStateName {
  192. return [self getPipStateName: _player.playbackState];
  193. }
  194. @end