Skip to content

Commit 14b033b

Browse files
author
zhaoyongqiang
committed
添加画中画功能
1 parent 2e5bcc4 commit 14b033b

13 files changed

Lines changed: 788 additions & 0 deletions

iOS/APIExample/APIExample.xcodeproj/project.pbxproj

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@
136136
A7CA48C424553CF700507435 /* Popover.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A7CA48C224553CF600507435 /* Popover.storyboard */; };
137137
B9C914453E92C7F49C93E1F5 /* Pods_APIExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8551A4BC255CE49B383BC575 /* Pods_APIExample.framework */; };
138138
CBCDE23FB64E60D6A79F3723 /* Pods_Agora_ScreenShare_Extension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09E72C5D1AABD812866E41A6 /* Pods_Agora_ScreenShare_Extension.framework */; };
139+
E728B84728B5FFCB00674A4A /* PictureInPicture.strings in Resources */ = {isa = PBXBuildFile; fileRef = E728B84228B5FFCB00674A4A /* PictureInPicture.strings */; };
140+
E728B84828B5FFCB00674A4A /* PictureInPicture.swift in Sources */ = {isa = PBXBuildFile; fileRef = E728B84428B5FFCB00674A4A /* PictureInPicture.swift */; };
141+
E728B84928B5FFCB00674A4A /* PictureInPicture.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E728B84528B5FFCB00674A4A /* PictureInPicture.storyboard */; };
142+
E728B84C28B6015800674A4A /* AgoraPictureInPictureController.m in Sources */ = {isa = PBXBuildFile; fileRef = E728B84B28B6015800674A4A /* AgoraPictureInPictureController.m */; };
143+
E728B84F28B601A300674A4A /* AgoraSampleBufferRender.m in Sources */ = {isa = PBXBuildFile; fileRef = E728B84E28B601A300674A4A /* AgoraSampleBufferRender.m */; };
144+
E728B85128B60D5B00674A4A /* VideoViewSampleBufferDisplayView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E728B85028B60D5B00674A4A /* VideoViewSampleBufferDisplayView.xib */; };
139145
E74877B328A23B2F00CA2F58 /* SimpleFilter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B10BE0D26AFFFA6002E1373 /* SimpleFilter.framework */; };
140146
E74877B728A23B8B00CA2F58 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74877B628A23B8B00CA2F58 /* NetworkManager.swift */; };
141147
E74877BA28A23C1400CA2F58 /* JSONObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74877B928A23C1400CA2F58 /* JSONObject.swift */; };
@@ -371,6 +377,14 @@
371377
A7CA48C324553CF600507435 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Popover.storyboard; sourceTree = "<group>"; };
372378
BC25C1A6D9E6B8827D095985 /* Pods_SimpleFilter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SimpleFilter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
373379
CC6D08A23527C200339E4FD6 /* Pods-SimpleAudioFilter.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SimpleAudioFilter.release.xcconfig"; path = "Target Support Files/Pods-SimpleAudioFilter/Pods-SimpleAudioFilter.release.xcconfig"; sourceTree = "<group>"; };
380+
E728B84328B5FFCB00674A4A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/PictureInPicture.strings"; sourceTree = "<group>"; };
381+
E728B84428B5FFCB00674A4A /* PictureInPicture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PictureInPicture.swift; sourceTree = "<group>"; };
382+
E728B84628B5FFCB00674A4A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PictureInPicture.storyboard; sourceTree = "<group>"; };
383+
E728B84A28B6015800674A4A /* AgoraPictureInPictureController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AgoraPictureInPictureController.h; sourceTree = "<group>"; };
384+
E728B84B28B6015800674A4A /* AgoraPictureInPictureController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AgoraPictureInPictureController.m; sourceTree = "<group>"; };
385+
E728B84D28B601A300674A4A /* AgoraSampleBufferRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AgoraSampleBufferRender.h; sourceTree = "<group>"; };
386+
E728B84E28B601A300674A4A /* AgoraSampleBufferRender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AgoraSampleBufferRender.m; sourceTree = "<group>"; };
387+
E728B85028B60D5B00674A4A /* VideoViewSampleBufferDisplayView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VideoViewSampleBufferDisplayView.xib; sourceTree = "<group>"; };
374388
E74877B628A23B8B00CA2F58 /* NetworkManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; };
375389
E74877B928A23C1400CA2F58 /* JSONObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONObject.swift; sourceTree = "<group>"; };
376390
E74877C928A2611C00CA2F58 /* ToastView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToastView.swift; sourceTree = "<group>"; };
@@ -538,6 +552,10 @@
538552
57FE7C4726B2D103002D9043 /* CircularBuffer.c */,
539553
57FE7C4926B2D103002D9043 /* CircularBuffer.h */,
540554
036C42B424D2A3C600A59000 /* AgoraMetalShader.metal */,
555+
E728B84D28B601A300674A4A /* AgoraSampleBufferRender.h */,
556+
E728B84E28B601A300674A4A /* AgoraSampleBufferRender.m */,
557+
E728B84A28B6015800674A4A /* AgoraPictureInPictureController.h */,
558+
E728B84B28B6015800674A4A /* AgoraPictureInPictureController.m */,
541559
036C42B324D2A3C600A59000 /* AgoraMetalRender.swift */,
542560
036C42AF24D2955D00A59000 /* AgoraCameraSourcePush.swift */,
543561
03414B5125546C7200AB114D /* AgoraYUVImageSourcePush.h */,
@@ -711,6 +729,7 @@
711729
03B12DA7251125A500E55818 /* VideoView.swift */,
712730
03B12DA9251125B700E55818 /* VideoView.xib */,
713731
03B12DAB251127DC00E55818 /* VideoViewMetal.xib */,
732+
E728B85028B60D5B00674A4A /* VideoViewSampleBufferDisplayView.xib */,
714733
A7847F912458062900469187 /* StatisticsInfo.swift */,
715734
03BCEC4F244938C500ED7177 /* BaseViewController.swift */,
716735
03BCEC752449EB4F00ED7177 /* LogViewController.swift */,
@@ -897,6 +916,7 @@
897916
A75A56D724A0603000D0089E /* Advanced */ = {
898917
isa = PBXGroup;
899918
children = (
919+
E728B84128B5FFCB00674A4A /* PictureInPicture */,
900920
E7899BD62861673600851463 /* CreateDataStream */,
901921
8BE7ABBB279E065000DFBCEF /* FusionCDN */,
902922
8B5E5B4E274CB6640040E97D /* RhythmPlayer */,
@@ -940,6 +960,16 @@
940960
name = "Supporting Files";
941961
sourceTree = "<group>";
942962
};
963+
E728B84128B5FFCB00674A4A /* PictureInPicture */ = {
964+
isa = PBXGroup;
965+
children = (
966+
E728B84228B5FFCB00674A4A /* PictureInPicture.strings */,
967+
E728B84428B5FFCB00674A4A /* PictureInPicture.swift */,
968+
E728B84528B5FFCB00674A4A /* PictureInPicture.storyboard */,
969+
);
970+
path = PictureInPicture;
971+
sourceTree = "<group>";
972+
};
943973
E74877B528A23B8B00CA2F58 /* NetworkManager */ = {
944974
isa = PBXGroup;
945975
children = (
@@ -1130,9 +1160,11 @@
11301160
576EA54825AC3523000B3D79 /* CustomPcmAudioSource.storyboard in Resources */,
11311161
6709B23C2806BB4A000BCC58 /* RawAudioData.storyboard in Resources */,
11321162
033A9F7F252D8B5900BC26E1 /* AudioMixing.storyboard in Resources */,
1163+
E728B84728B5FFCB00674A4A /* PictureInPicture.strings in Resources */,
11331164
033A9F7A252D8B5000BC26E1 /* MediaPlayer.storyboard in Resources */,
11341165
8BE7ABC3279E065000DFBCEF /* FusionCDN.storyboard in Resources */,
11351166
0339D6D224E91B80008739CD /* QuickSwitchChannelVCItem.xib in Resources */,
1167+
E728B84928B5FFCB00674A4A /* PictureInPicture.storyboard in Resources */,
11361168
03BEED0D251CAB9C005E78F4 /* audioeffect.mp3 in Resources */,
11371169
A7CA48C424553CF700507435 /* Popover.storyboard in Resources */,
11381170
03D13BDC2448758B00B599B3 /* LaunchScreen.storyboard in Resources */,
@@ -1161,6 +1193,7 @@
11611193
03D13BD92448758B00B599B3 /* Assets.xcassets in Resources */,
11621194
033A9F6B252D8B3500BC26E1 /* MediaChannelRelay.storyboard in Resources */,
11631195
671BD6B927E1DB2D0076D5E1 /* CustomAudioRender.storyboard in Resources */,
1196+
E728B85128B60D5B00674A4A /* VideoViewSampleBufferDisplayView.xib in Resources */,
11641197
03D13BD72448758900B599B3 /* Main.storyboard in Resources */,
11651198
);
11661199
runOnlyForDeploymentPostprocessing = 0;
@@ -1286,13 +1319,15 @@
12861319
03D13BD42448758900B599B3 /* ViewController.swift in Sources */,
12871320
03F8733224C8696600EDB1A3 /* EntryViewController.swift in Sources */,
12881321
0371D8AE250B4A2C00C0DD61 /* JoinChannelAudio.swift in Sources */,
1322+
E728B84F28B601A300674A4A /* AgoraSampleBufferRender.m in Sources */,
12891323
8B333DA9267B4BC3002A3785 /* SettingsCells.swift in Sources */,
12901324
033A9EFC252D61E200BC26E1 /* CustomVideoRender.swift in Sources */,
12911325
576EA59025AEDD3C000B3D79 /* (null) in Sources */,
12921326
033A9F09252D61FC00BC26E1 /* RTMPStreaming.swift in Sources */,
12931327
6709B23B2806B0EA000BCC58 /* RawAudioData.swift in Sources */,
12941328
033A9EEA252D5F5E00BC26E1 /* JoinMultiChannel.swift in Sources */,
12951329
0339BE64251DCA3B007D4FDD /* GlobalSettings.swift in Sources */,
1330+
E728B84C28B6015800674A4A /* AgoraPictureInPictureController.m in Sources */,
12961331
8407E0942472320800AC5DE8 /* (null) in Sources */,
12971332
8B5E5B50274CB68E0040E97D /* RhythmPlayer.swift in Sources */,
12981333
036C42B524D2A3C600A59000 /* AgoraMetalRender.swift in Sources */,
@@ -1325,6 +1360,7 @@
13251360
03DF1D9024CFC29700DF7151 /* AudioWriteToFile.m in Sources */,
13261361
0339BE6D251DEAFC007D4FDD /* PrecallTest.swift in Sources */,
13271362
8BC751DA273E57C900552265 /* VideoProcess.swift in Sources */,
1363+
E728B84828B5FFCB00674A4A /* PictureInPicture.swift in Sources */,
13281364
5744CE0925BA99FF0099AB66 /* VideoChat.swift in Sources */,
13291365
034C625E2524A06800296ECF /* VoiceChanger.swift in Sources */,
13301366
03D13BD02448758900B599B3 /* AppDelegate.swift in Sources */,
@@ -1679,6 +1715,22 @@
16791715
name = Popover.storyboard;
16801716
sourceTree = "<group>";
16811717
};
1718+
E728B84228B5FFCB00674A4A /* PictureInPicture.strings */ = {
1719+
isa = PBXVariantGroup;
1720+
children = (
1721+
E728B84328B5FFCB00674A4A /* zh-Hans */,
1722+
);
1723+
name = PictureInPicture.strings;
1724+
sourceTree = "<group>";
1725+
};
1726+
E728B84528B5FFCB00674A4A /* PictureInPicture.storyboard */ = {
1727+
isa = PBXVariantGroup;
1728+
children = (
1729+
E728B84628B5FFCB00674A4A /* Base */,
1730+
);
1731+
name = PictureInPicture.storyboard;
1732+
sourceTree = "<group>";
1733+
};
16821734
E7899BD72861673600851463 /* CreateDataStream.strings */ = {
16831735
isa = PBXVariantGroup;
16841736
children = (

iOS/APIExample/APIExample/APIExample-Bridging-Header.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
#import <AgoraRtcKit/AgoraRtcEngineKitEx.h>
1010
#import <AgoraReplayKitExtension/AgoraReplayKitExtension.h>
1111
#import "MediaUtils.h"
12+
#import "AgoraPictureInPictureController.h"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// AgoraPictureInPictureController.h
3+
// APIExample
4+
//
5+
// Created by 胡润辰 on 2022/4/1.
6+
// Copyright © 2022 Agora Corp. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "AgoraSampleBufferRender.h"
11+
#import <AVKit/AVKit.h>
12+
13+
NS_ASSUME_NONNULL_BEGIN
14+
@protocol AgoraPictureInPictureControllerDelegate <NSObject>
15+
16+
@optional
17+
18+
@end
19+
20+
//仅支持IOS15以后
21+
@interface AgoraPictureInPictureController : NSObject
22+
23+
@property (nonatomic, weak) id <AgoraPictureInPictureControllerDelegate>delegate;
24+
25+
@property (nonatomic, strong, readonly) AVPictureInPictureController *pipController;
26+
27+
@property (nonatomic, strong, readonly) AgoraSampleBufferRender *displayView;
28+
29+
- (instancetype)initWithDisplayView:(AgoraSampleBufferRender *)displayView;
30+
31+
@end
32+
33+
NS_ASSUME_NONNULL_END
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
//
2+
// AgoraPictureInPictureController.m
3+
// APIExample
4+
//
5+
// Created by 胡润辰 on 2022/4/1.
6+
// Copyright © 2022 Agora Corp. All rights reserved.
7+
//
8+
9+
#import "AgoraPictureInPictureController.h"
10+
11+
@interface AgoraPictureInPictureController () <AVPictureInPictureSampleBufferPlaybackDelegate>
12+
13+
@property (nonatomic, strong) AVPictureInPictureController *pipController;
14+
15+
@property (nonatomic, strong) AgoraSampleBufferRender *displayView;
16+
17+
@end
18+
19+
@implementation AgoraPictureInPictureController
20+
21+
- (instancetype)initWithDisplayView:(AgoraSampleBufferRender *)displayView {
22+
if (@available(iOS 15.0, *)) {
23+
if ([AVPictureInPictureController isPictureInPictureSupported]) {
24+
self = [super init];
25+
if (self) {
26+
_displayView = displayView;
27+
AVPictureInPictureControllerContentSource *pipControllerContentSource = [[AVPictureInPictureControllerContentSource alloc] initWithSampleBufferDisplayLayer:_displayView.displayLayer playbackDelegate:self];
28+
29+
_pipController = [[AVPictureInPictureController alloc] initWithContentSource:pipControllerContentSource];
30+
}
31+
return self;
32+
}
33+
}
34+
return nil;
35+
}
36+
37+
38+
#pragma mark - <AVPictureInPictureSampleBufferPlaybackDelegate>
39+
40+
- (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController didTransitionToRenderSize:(CMVideoDimensions)newRenderSize {
41+
42+
}
43+
44+
- (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing {
45+
46+
}
47+
48+
- (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController skipByInterval:(CMTime)skipInterval completionHandler:(nonnull void (^)(void))completionHandler {
49+
50+
}
51+
52+
- (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController {
53+
return NO;
54+
}
55+
56+
- (CMTimeRange)pictureInPictureControllerTimeRangeForPlayback:(nonnull AVPictureInPictureController *)pictureInPictureController {
57+
return CMTimeRangeMake(kCMTimeZero, CMTimeMake(INT64_MAX, 1000));
58+
}
59+
60+
@end
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// AgoraSampleBufferRender.h
3+
// APIExample
4+
//
5+
// Created by 胡润辰 on 2022/4/2.
6+
// Copyright © 2022 Agora Corp. All rights reserved.
7+
//
8+
9+
#import <UIKit/UIKit.h>
10+
#import <AVFoundation/AVFoundation.h>
11+
#import <AgoraRtcKit/AgoraRtcEngineKit.h>
12+
13+
NS_ASSUME_NONNULL_BEGIN
14+
15+
@interface AgoraSampleBufferRender : UIView
16+
17+
@property (nonatomic, readonly) AVSampleBufferDisplayLayer *displayLayer;
18+
19+
- (void)reset;
20+
21+
- (void)renderVideoData:(AgoraOutputVideoFrame *_Nonnull)videoData;
22+
23+
@end
24+
25+
NS_ASSUME_NONNULL_END

0 commit comments

Comments
 (0)