KSYGPUStreamerKit+bgp.m 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // KSYGPUBgmStreamerKit.m
  3. // KSYStreamer
  4. //
  5. // Created by jiangdong on 28/12/16.
  6. // Copyright © 2016 ksyun. All rights reserved.
  7. //
  8. #import <objc/runtime.h>
  9. #import "KSYGPUStreamerKit+bgp.h"
  10. #define weakObj(o) __weak typeof(o) o##Weak = o;
  11. // 这里背景图片放在原本摄像头图层的下方, 图层index为1
  12. static const NSInteger kBgpIdx = 1;
  13. @implementation KSYGPUStreamerKit(bgp)
  14. - (KSYGPUPicture*)bgPic {
  15. return objc_getAssociatedObject(self, _cmd);
  16. }
  17. - (void)setBgPic:(KSYGPUPicture *)bgPic {
  18. objc_setAssociatedObject(self, @selector(bgPic), bgPic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  19. }
  20. - (void)updateDimensions {
  21. UIInterfaceOrientation ori = [[UIApplication sharedApplication] statusBarOrientation];
  22. CGSize preSz, strSz;
  23. if (UIInterfaceOrientationIsPortrait(ori)) {
  24. preSz.width = MIN(self.previewDimension.width, self.previewDimension.height);
  25. preSz.height = MAX(self.previewDimension.width, self.previewDimension.height);
  26. strSz.width = MIN(self.streamDimension.width, self.streamDimension.height);
  27. strSz.height = MAX(self.streamDimension.width, self.streamDimension.height);
  28. }
  29. else {
  30. preSz.width = MAX(self.previewDimension.width, self.previewDimension.height);
  31. preSz.height = MIN(self.previewDimension.width, self.previewDimension.height);
  32. strSz.width = MAX(self.streamDimension.width, self.streamDimension.height);
  33. strSz.height = MIN(self.streamDimension.width, self.streamDimension.height);
  34. }
  35. [self.vPreviewMixer forceProcessingAtSize:preSz];
  36. [self.vStreamMixer forceProcessingAtSize:strSz];
  37. self.gpuToStr.outputSize = strSz;
  38. }
  39. - (void)updateBgpImage:(UIImage*)img {
  40. self.gpuToStr.targetFps = self.videoFPS;
  41. self.vPreviewMixer.masterLayer = kBgpIdx;
  42. self.vStreamMixer.masterLayer = kBgpIdx;
  43. [self.vPreviewMixer clearPicOfLayer:kBgpIdx];
  44. [self.vStreamMixer clearPicOfLayer:kBgpIdx];
  45. self.bgPic = [[KSYGPUPicture alloc] initWithImage:img andOutputSize:img.size];
  46. [self.bgPic addTarget:self.vPreviewMixer atTextureLocation:kBgpIdx];
  47. [self.bgPic addTarget:self.vStreamMixer atTextureLocation:kBgpIdx];
  48. [self setRect:CGRectMake(-2.0, -2.0, 0.0, 0.0) ofLayer:kBgpIdx]; // 居中放置背景图片
  49. [self setOrientaion:img.imageOrientation ofLayer:kBgpIdx];
  50. self.gpuToStr.bAutoRepeat = NO; // 为了图片内容刷新, 先停止输出上一帧画面
  51. weakObj(self);
  52. [self.bgPic processImageWithCompletionHandler:^{
  53. if (selfWeak.streamerBase.isStreaming) {
  54. selfWeak.gpuToStr.bAutoRepeat = YES; // 图片内容更新完毕, 开始输出画面
  55. }
  56. }];
  57. }
  58. - (void)startBgpPreview:(UIView*)bgView {
  59. dispatch_async(dispatch_get_main_queue(), ^() {
  60. [bgView addSubview:self.preview];
  61. self.preview.frame = bgView.bounds;
  62. [self.preview layoutSubviews];
  63. [self updateDimensions];
  64. [self.vPreviewMixer addTarget:self.preview];
  65. [self.vStreamMixer addTarget:self.gpuToStr];
  66. self.gpuToStr.bAutoRepeat = NO; // 为了图片内容刷新, 先停止输出上一帧画面
  67. weakObj(self);
  68. [self.bgPic processImageWithCompletionHandler:^{
  69. if (selfWeak.streamerBase.isStreaming) {
  70. selfWeak.gpuToStr.bAutoRepeat = YES; // 图片内容更新完毕, 开始输出画面
  71. }
  72. }];
  73. });
  74. [self startAudioCap];
  75. }
  76. - (BOOL)startBgpStream:(NSURL*)url {
  77. if (self.streamerBase.streamState == KSYStreamStateIdle ||
  78. self.streamerBase.streamState == KSYStreamStateError) {
  79. self.gpuToStr.bAutoRepeat = YES;
  80. [self.streamerBase startStream:url]; //启动推流
  81. return YES;
  82. }
  83. return NO;
  84. }
  85. - (void)stopBgpStream {
  86. self.gpuToStr.bAutoRepeat = NO;
  87. [self.streamerBase stopStream];
  88. }
  89. @end