Browse Source

合成版本上线

Steven 1 year ago
parent
commit
d7ad53037a
18 changed files with 242 additions and 143 deletions
  1. 4 4
      KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj
  2. 1 1
      KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m
  3. 2 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAQRecordManager.h
  4. 16 10
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAQRecordManager.m
  5. 1 2
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAccompanyWebViewController.m
  6. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m
  7. 34 0
      KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSVideoRecordManager.m
  8. 18 18
      KulexiuForTeacher/KulexiuForTeacher/Common/Define/KSDomain.h
  9. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Common/LoadingManager/KSProgressLoadingView.m
  10. 17 6
      KulexiuForTeacher/KulexiuForTeacher/Common/MediaMerge/AudioMerge/KSMediaMergeView.m
  11. 17 16
      KulexiuForTeacher/KulexiuForTeacher/Common/MediaMerge/MediaEditor/KSMediaEditor.m
  12. 2 1
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Extension/NSString+Extension.m
  13. 37 76
      KulexiuForTeacher/KulexiuForTeacher/Common/Tools/KSUploadManager.m
  14. 38 5
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/Controller/KSVideoCropViewController.m
  15. 0 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/Controller/MineWorksViewController.m
  16. 1 1
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/View/KSVideoImageSlider.m
  17. 4 0
      KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/View/VideoCoverChooseView.xib
  18. 48 0
      KulexiuForTeacher/Pods/Pods.xcodeproj/project.pbxproj

+ 4 - 4
KulexiuForTeacher/KulexiuForTeacher.xcodeproj/project.pbxproj

@@ -9672,7 +9672,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = KulexiuForTeacher/KulexiuForTeacher.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1.5.3;
+				CURRENT_PROJECT_VERSION = 1.5.4.1;
 				DEVELOPMENT_TEAM = B2AP53HHTU;
 				ENABLE_BITCODE = NO;
 				ENABLE_MODULE_VERIFIER = YES;
@@ -9718,7 +9718,7 @@
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/SocialLibraries/QQ",
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/UMSocialSDKPlugin",
 				);
-				MARKETING_VERSION = 1.5.3;
+				MARKETING_VERSION = 1.5.4;
 				MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
 				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17";
 				OTHER_LDFLAGS = (
@@ -9873,7 +9873,7 @@
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_ENTITLEMENTS = KulexiuForTeacher/KulexiuForTeacher.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1.5.3;
+				CURRENT_PROJECT_VERSION = 1.5.4.1;
 				DEVELOPMENT_TEAM = B2AP53HHTU;
 				ENABLE_BITCODE = NO;
 				ENABLE_MODULE_VERIFIER = YES;
@@ -9919,7 +9919,7 @@
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/SocialLibraries/QQ",
 					"$(PROJECT_DIR)/KulexiuForTeacher/Common/ThirdPart/UMSocialSDK/share/share_ios_6.10.4/UMSocialSDKPlugin",
 				);
-				MARKETING_VERSION = 1.5.3;
+				MARKETING_VERSION = 1.5.4;
 				MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
 				MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++17";
 				OTHER_LDFLAGS = (

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/AppDelegate.m

@@ -176,7 +176,7 @@
 }
 
 - (void)registerSDK {
-    NSString *universalLinkUrl = [NSString stringWithFormat:@"%@%@",hostURL,@"/teacherApp/"];
+    NSString *universalLinkUrl = [NSString stringWithFormat:@"%@%@",@"https://online.colexiu.com",@"/teacherApp/"];
     [WXApi registerApp:@"wx149a928c415c137a" universalLink:universalLinkUrl];
 }
 

+ 2 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAQRecordManager.h

@@ -17,6 +17,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 - (void)audioRecord:(KSAQRecordManager *)audioRecord didRecordAudioData:(void *)data length:(UInt32)length;
 
+- (void)recordDidStart:(NSTimeInterval)time;
+
 @end
 
 @interface KSAQRecordManager : NSObject

+ 16 - 10
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAQRecordManager.m

@@ -8,6 +8,7 @@
 
 #import "KSAQRecordManager.h"
 #import <AVFoundation/AVFoundation.h>
+#import "NSDate+Extension.h"
 
 static const int kNumberBuffers = 3;
 
@@ -21,7 +22,6 @@ static const int kNumberBuffers = 3;
 @property (nonatomic, assign) double sampleTime;
 @property (nonatomic, assign) double sampleRate;
 
-
 @end
 
 @implementation KSAQRecordManager
@@ -148,6 +148,11 @@ static const int kNumberBuffers = 3;
         OSStatus status = AudioQueueStart(self.audioQueue, NULL);
         if (status == noErr) {
             self.isRunning = YES;
+            NSDate *date = [NSDate date];
+            NSTimeInterval inteveral = [date timeIntervalSince1970];
+            if (self.delegate && [self.delegate respondsToSelector:@selector(recordDidStart:)]) {
+                [self.delegate recordDidStart:inteveral*1000];
+            }
         }
     });
 }
@@ -189,7 +194,6 @@ static const int kNumberBuffers = 3;
     }
 }
 
-
 - (void)freeAudioQueue {
     dispatch_async(_queue, ^{
         if (self.isRunning) {
@@ -219,15 +223,17 @@ static void inputCallback(void * inUserData,
         return;
     }
     //    printf("recorder enqueue buffer time: %f \n", inStartTime->mSampleTime / recorder.asBasicDesc.mSampleRate);
-    
-    // 将音频数据写入文件
-    if (AudioFileWritePackets(recorder.mAudioFile, false, inBuffer->mAudioDataByteSize, inPacketDescs, recorder.currPacket, &inNumberPacketDescriptions, inBuffer->mAudioData) == noErr) {
-        recorder.currPacket += inNumberPacketDescriptions;
-    }
-    //消费音频数据
-    if ([recorder.delegate respondsToSelector:@selector(audioRecord:didRecordAudioData:length:)]) {
-        [recorder.delegate audioRecord:recorder didRecordAudioData:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize];
+    if (inNumberPacketDescriptions > 0) {
+        // 将音频数据写入文件
+        if (AudioFileWritePackets(recorder.mAudioFile, false, inBuffer->mAudioDataByteSize, inPacketDescs, recorder.currPacket, &inNumberPacketDescriptions, inBuffer->mAudioData) == noErr) {
+            recorder.currPacket += inNumberPacketDescriptions;
+        }
+        //消费音频数据
+        if ([recorder.delegate respondsToSelector:@selector(audioRecord:didRecordAudioData:length:)]) {
+            [recorder.delegate audioRecord:recorder didRecordAudioData:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize];
+        }
     }
+    
     //将buffer给audio queue
     OSStatus status = AudioQueueEnqueueBuffer(recorder.audioQueue, inBuffer, 0, NULL);
     if (status != noErr) {

+ 1 - 2
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSAccompanyWebViewController.m

@@ -539,7 +539,6 @@
                 }
                 if (albumEnable == PREMISSIONTYPE_NO) {
                     [self showAlertWithMessage:@"请开启相册访问权限" type:CHECKDEVICETYPE_CAMREA];
-                    
                 }
             }
             else if ([[parm ks_stringValueForKey:@"api"] isEqualToString:@"closeCamera"]) { // 关闭摄像头
@@ -830,7 +829,7 @@
                     }
                 }
                 else {
-                    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前曲目无mp3伴奏"];
+//                    [LOADING_MANAGER MBShowAUTOHidingInWindow:@"当前曲目无mp3伴奏"];
                     [self configVideoRecord:nil];
                 }
             }

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSBaseWKWebViewController.m

@@ -654,7 +654,7 @@ typedef NS_ENUM(NSInteger, CHOOSETYPE) {
         [LOADING_MANAGER removeCustomLoading];
         NSString *fileUrl = [fileUrlArray lastObject];
         NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:content];
-        [content setValue:fileUrl forKey:@"videoCover"];
+        [dic setValue:fileUrl forKey:@"videoCover"];
         NSMutableDictionary *sendParm = [NSMutableDictionary dictionary];
         [sendParm setValue:@"videoCrop" forKey:@"api"];
         [sendParm setValue:dic forKey:@"content"];

+ 34 - 0
KulexiuForTeacher/KulexiuForTeacher/Common/Base/KSVideoRecordManager.m

@@ -102,6 +102,8 @@
     }
     if ([_captureSession canAddInput:_videoCaptureDeviceInput]) {
         [_captureSession addInput:_videoCaptureDeviceInput];
+        // 设置帧率
+        [self setMaxFrameRate:10 forDevice:_videoCaptureDeviceInput.device];
     }
     else {
         if (self.callback) {
@@ -492,4 +494,36 @@
     }
     return _videoRecordQueue;
 }
+
+- (void)setMaxFrameRate:(Float64)maxFrameRate forDevice:(AVCaptureDevice *)device {
+    @try
+    {
+        NSError *lockError = nil;
+        if ([device lockForConfiguration:&lockError])
+        {
+            NSArray *videoSupportedFrameRateRanges = device.activeFormat.videoSupportedFrameRateRanges;
+            AVFrameRateRange *minFrameRateRange = videoSupportedFrameRateRanges.firstObject;
+            for (AVFrameRateRange *range in device.activeFormat.videoSupportedFrameRateRanges)
+            {
+                if (range.minFrameRate < minFrameRateRange.minFrameRate)
+                {
+                    minFrameRateRange = range;
+                }
+            }
+            CMTime minFrameDuration = CMTimeMake(1, maxFrameRate);
+            //超出范围就取默认值
+            if (maxFrameRate < minFrameRateRange.minFrameRate || maxFrameRate > minFrameRateRange.maxFrameRate)
+            {
+                minFrameDuration = kCMTimeInvalid;
+            }
+            device.activeVideoMinFrameDuration = minFrameDuration;
+            [device unlockForConfiguration];
+            NSLog(@"OnboardingScan--打印帧数最小: %@, 最大:%@", @((int32_t)device.activeVideoMinFrameDuration.timescale).stringValue, @((int32_t)device.activeVideoMaxFrameDuration.timescale).stringValue);
+        }
+    } @catch (NSException *exception) {
+
+     } @finally {
+
+    }
+}
 @end

+ 18 - 18
KulexiuForTeacher/KulexiuForTeacher/Common/Define/KSDomain.h

@@ -24,15 +24,15 @@
 //#define TXOfflinePushCertificateIDForAPNS (39559)
 
 // 测试环境
-#define hostURL (@"https://test.colexiu.com")
-#define SEALCLASSHOST (@"https://test.colexiu.com/api-classroom")
-#define WEBHOST (@"https://test.colexiu.com/teacher")
-#define SOCKET_URL (@"wss://test.colexiu.com/audioAnalysis")
-#define JSPUSH_ENVIRONMENT (NO)
-#define RCIM_KEY (@"0vnjpoad0jbdz")
-#define SUBMIT_UUID (NO)
-#define CONFIG_TXSDKAPPID (1400805079)
-#define TXOfflinePushCertificateIDForAPNS (39559)
+//#define hostURL (@"https://test.colexiu.com")
+//#define SEALCLASSHOST (@"https://test.colexiu.com/api-classroom")
+//#define WEBHOST (@"https://test.colexiu.com/teacher")
+//#define SOCKET_URL (@"wss://test.colexiu.com/audioAnalysis")
+//#define JSPUSH_ENVIRONMENT (NO)
+//#define RCIM_KEY (@"0vnjpoad0jbdz")
+//#define SUBMIT_UUID (NO)
+//#define CONFIG_TXSDKAPPID (1400805079)
+//#define TXOfflinePushCertificateIDForAPNS (39559)
 
 // 预生产
 //#define hostURL (@"https://ponline.colexiu.com")
@@ -47,15 +47,15 @@
 
 //#else
 
-//#define hostURL (@"https://online.colexiu.com")
-//#define SEALCLASSHOST (@"https://online.colexiu.com/api-classroom")
-//#define WEBHOST (@"https://online.colexiu.com/teacher")
-//#define SOCKET_URL (@"wss://online.colexiu.com/audioAnalysis")
-//#define JSPUSH_ENVIRONMENT (YES)
-//#define RCIM_KEY (@"e5t4ouvpe42pa")
-//#define SUBMIT_UUID (YES)
-//#define CONFIG_TXSDKAPPID (1400799837)
-//#define TXOfflinePushCertificateIDForAPNS (39561)
+#define hostURL (@"https://online.colexiu.com")
+#define SEALCLASSHOST (@"https://online.colexiu.com/api-classroom")
+#define WEBHOST (@"https://online.colexiu.com/teacher")
+#define SOCKET_URL (@"wss://online.colexiu.com/audioAnalysis")
+#define JSPUSH_ENVIRONMENT (YES)
+#define RCIM_KEY (@"e5t4ouvpe42pa")
+#define SUBMIT_UUID (YES)
+#define CONFIG_TXSDKAPPID (1400799837)
+#define TXOfflinePushCertificateIDForAPNS (39561)
 
 //#endif
 

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/LoadingManager/KSProgressLoadingView.m

@@ -74,7 +74,7 @@
 - (void)setProgress:(NSInteger)progress {
     _progress = progress;
     CGFloat width = progress;
-    [self.progressFillImage setImage:[self createGradientImageWithColor:@[HexRGB(0x3CD6F9),HexRGB(0x1CACF1)] rect:CGRectMake(0, 0, width, 8) start:CGPointMake(0.41, 0) end:CGPointMake(0.41, 1)]];
+    [self.progressFillImage setImage:[self createGradientImageWithColor:@[HexRGB(0x44F1D0),HexRGB(0x2DC7AA)] rect:CGRectMake(0, 0, width, 8) start:CGPointMake(0.41, 0) end:CGPointMake(0.41, 1)]];
     self.imageWidth.constant = width;
 }
 

+ 17 - 6
KulexiuForTeacher/KulexiuForTeacher/Common/MediaMerge/AudioMerge/KSMediaMergeView.m

@@ -179,7 +179,7 @@
 }
 
 - (void)downloadFileSource {
-    [LOADING_MANAGER showCustomLoading:@"资源下载中..."];
+    [LOADING_MANAGER showCustomLoading:@"资源下载中"];
     
     [self downloadVideo];
     [self downloadAccompany];
@@ -580,6 +580,8 @@
     switch (type) {
         case PUBLISH_ACTION_PUBLISH:
         {
+            // 暂停播放
+            [self stopPlay];
             self.desc = [NSString isEmptyString:self.publishAlert.publishContainView.textView.text] ? @"我发布了一首演奏作品,快来听听吧~" :self.publishAlert.publishContainView.textView.text;
             if (self.settingImage || self.videoCoverImage) { // 上传图片
                 [self updateWithCoverImage];
@@ -591,13 +593,15 @@
             break;
         case PUBLISH_ACTION_CHOOSEIMG:
         {
+            // 暂停播放
+            [self stopPlay];
             // 调用相册
             self.mediaManager = [[KSMediaManager alloc] init];
             self.mediaManager.mediaType = MEDIATYPE_PHOTO;
             self.mediaManager.maxPhotoNumber = 1;
             self.mediaManager.baseCtrl = [self findViewController];
 
-            self.mediaManager.needCropImage = YES;
+            self.mediaManager.needCropImage = NO;
             MJWeakSelf;
             [self.mediaManager noAlertCallback:^(NSString * _Nullable videoUrl, NSMutableArray * _Nullable imageArray, NSMutableArray * _Nullable imageAsset) {
                 // 裁剪
@@ -617,6 +621,8 @@
             break;
         case PUBLISH_ACTION_VIDEOCOVER: // 视频封面
         {
+            // 暂停播放
+            [self stopPlay];
             self.isChooseVideoCover = YES;
             // 调用相册
             self.mediaManager = [[KSMediaManager alloc] init];
@@ -644,6 +650,8 @@
             break;
         case PUBLISH_ACTION_VIDEOCROP:
         {
+            // 暂停播放
+            [self stopPlay];
             KSVideoCropViewController *ctrl = [[KSVideoCropViewController alloc] init];
             [ctrl configWithVideoPath:self.videoUrl];
             UIViewController *baseCtrl = [self findViewController];
@@ -651,6 +659,7 @@
             [ctrl chooseCropImageCallback:^(UIImage * _Nonnull cropImage) {
                 [weakSelf displayCoverImage:cropImage];
             }];
+            ctrl.modalPresentationStyle = UIModalPresentationFullScreen;
             [baseCtrl.navigationController presentViewController:ctrl animated:YES completion:nil];
         }
             break;
@@ -676,6 +685,8 @@
 }
 
 - (void)uploadMusicCover {
+    NSString *tips = self.isVideoPlay ? @"视频合成中" : @"音频合成中";
+    [LOADING_MANAGER showProgressLoading:tips progress:0];
 
     if (self.settingImage) {
         NSData *imgData = [UIImage turnsImaegDataByImage:self.settingImage];
@@ -731,10 +742,10 @@
     CGFloat progress = 1.0/3;
     CGFloat rate = 1.0/3;
     if (self.isVideoPlay) {
-        [LOADING_MANAGER showProgressLoading:@"视频合成中..." progress:0];
+        [LOADING_MANAGER showProgressLoading:@"视频合成中" progress:0];
         
         [KSMediaEditor mixVideoWithRecordAudio:self.recordUrl recordVolume:self.recordPlayer.volume bgAudio:self.bgAudioUrl bgAudioVolume:self.bgPlayer.volume offsetTime:self.offsetTime videoUrlStr:self.videoUrl completion:^(NSString * _Nonnull outPath, BOOL isSuccess, NSString * _Nonnull desc) {
-            [LOADING_MANAGER showProgressLoading:@"视频合成中..." progress:progress];
+            [LOADING_MANAGER showProgressLoading:@"视频合成中" progress:progress];
             // 保存文件到指定文件夹
             if (isSuccess) {
                 self.filePath = outPath;
@@ -753,11 +764,11 @@
         }];
     }
     else {
-        [LOADING_MANAGER showProgressLoading:@"音频合成中..." progress:0];
+        [LOADING_MANAGER showProgressLoading:@"音频合成中" progress:0];
         NSInteger realOffsetTime = self.offsetTime;
         [KSMediaEditor mixRecordAudio:self.recordUrl recordVolume:self.recordPlayer.volume bgAudio:self.bgAudioUrl bgAudioVolume:self.bgPlayer.volume offsetTime:realOffsetTime completion:^(NSString * _Nonnull outPath, BOOL isSuccess, NSString * _Nonnull desc) {
             // 保存文件到指定文件夹
-            [LOADING_MANAGER showProgressLoading:@"音频合成中..." progress:progress];
+            [LOADING_MANAGER showProgressLoading:@"音频合成中" progress:progress];
 
             if (isSuccess) {
                 self.filePath = outPath;

+ 17 - 16
KulexiuForTeacher/KulexiuForTeacher/Common/MediaMerge/MediaEditor/KSMediaEditor.m

@@ -100,6 +100,12 @@
     session.outputFileType = outputFileType;
     session.shouldOptimizeForNetworkUse = YES;
     session.audioMix = audioMix;
+    if ([outputFileType isEqualToString:AVFileTypeQuickTimeMovie]) {
+        AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset];
+        videoComposition.frameDuration = CMTimeMake(1, 10);
+        videoComposition.renderSize = CGSizeMake(1280, 720);
+        session.videoComposition = videoComposition;
+    }
     
     [session exportAsynchronouslyWithCompletionHandler:^{
         dispatch_async(dispatch_get_main_queue(), ^{
@@ -194,41 +200,36 @@
     
     // 录音
     AVURLAsset *recordAsset = [AVURLAsset assetWithURL:recordUrl];
-    float recordDuration = CMTimeGetSeconds(recordAsset.duration);
     // 音频轨道
     AVMutableCompositionTrack *recordCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
 
     // 伴奏
     AVURLAsset *bgAudioAssest = [AVURLAsset assetWithURL:bgAudioUrl];
-    float bgAudioDuration = CMTimeGetSeconds(bgAudioAssest.duration);
     AVMutableCompositionTrack *bgAudioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
     
     CMTime offsetCTTime = CMTimeMake(labs(offsetTime), 1000);
-    CMTime duration = recordDuration > bgAudioDuration ? bgAudioAssest.duration : recordAsset.duration;
-    
-    // 如果时长超过视频的时长
-    if (CMTimeGetSeconds(duration) > videoDuration) {
-        duration = videoAsset.duration;
-    }
     
     // 合成
     AVAssetTrack *recordAssetTrack = [[recordAsset tracksWithMediaType:AVMediaTypeAudio] firstObject];
     AVAssetTrack *bgAudioAssetTrack = [[bgAudioAssest tracksWithMediaType:AVMediaTypeAudio] firstObject];
     
     // 录音文件
-    [recordCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, recordAsset.duration) ofTrack:recordAssetTrack atTime:kCMTimeZero error:nil];
+    CMTime recordCMTime = recordAsset.duration.value > videoAsset.duration.value ? videoAsset.duration : recordAsset.duration;
+    [recordCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, recordCMTime) ofTrack:recordAssetTrack atTime:kCMTimeZero error:nil];
+    
     // 伴奏文件
-    CMTime bgTime = kCMTimeZero;
-    if (bgAudioDuration >= offsetTime/1000.0 + recordDuration) {
-        bgTime = recordAsset.duration;
-    }
-    else {
-        bgTime = bgAudioAssest.duration;
-    }
+    CMTime bgTime = bgAudioAssest.duration.value > videoAsset.duration.value ? videoAsset.duration : bgAudioAssest.duration;
+    
     if (offsetTime > 0) {
+        if (bgTime.value + offsetCTTime.value > videoAsset.duration.value) {
+            bgTime.value = videoAsset.duration.value - offsetCTTime.value;
+        }
         [bgAudioCompositionTrack insertTimeRange:CMTimeRangeMake(offsetCTTime, bgTime) ofTrack:bgAudioAssetTrack atTime:kCMTimeZero error:nil];
     }
     else {
+        if (bgTime.value + offsetCTTime.value > videoAsset.duration.value) {
+            bgTime.value = videoAsset.duration.value - offsetCTTime.value;
+        }
         [bgAudioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, bgTime) ofTrack:bgAudioAssetTrack atTime:offsetCTTime error:nil];
     }
     

+ 2 - 1
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/Extension/NSString+Extension.m

@@ -235,7 +235,8 @@
 
 // url encoding
 - (NSString *)getUrlEndcodeString {
-    return [self stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];;
+    NSString *url = [self stringByRemovingPercentEncoding];
+    return [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];;
 }
 
 

+ 37 - 76
KulexiuForTeacher/KulexiuForTeacher/Common/Tools/KSUploadManager.m

@@ -11,17 +11,9 @@
 
 @interface KSUploadManager ()<QCloudSignatureProvider>
 
-@property (nonatomic, copy) KSUploadSuccess successCallback;
-
-@property (nonatomic, copy) KSUploadFailer faliureCallback;
-
-@property (nonatomic, copy) KSUploadProgress uploadProgress;
-
-@property (nonatomic, strong) NSString *videoLinkUrl;
 
 @property (assign, nonatomic) long long fileSize;
 
-
 // 腾讯cos bucket name
 @property (nonatomic, strong) NSString *cosBucketName;
 
@@ -56,13 +48,12 @@
     [QCloudCOSTransferMangerService registerDefaultCOSTransferMangerWithConfiguration:configuration];
 }
 
-// 默认配置
-- (void)configCilentBucket {
-    self.cosBucketName = @"daya-online-1303457149";
+- (void)configBucketName:(NSString *)bucketName {
+
 }
 
-- (void)configBucketName:(NSString *)bucketName {
-    
+- (void)configCilentBucket {
+    self.cosBucketName = @"daya-online-1303457149";
 }
 
 // 上传改造 添加目录 /yyyyMM/dd/文件名
@@ -77,38 +68,27 @@
 }
 
 - (void)uploadImage:(NSData *)imageData fileName:(NSString *)fileName successCallback:(KSUploadSuccess)success faliure:(KSUploadFailer)faliure {
-    if (success) {
-        self.successCallback = success;
-    }
-    if (faliure) {
-        self.faliureCallback = faliure;
-    }
+
     NSString *folderString = [self getDayFolder];
     NSString *uploadFileName = [NSString stringWithFormat:@"%@%@%@_%@%@%@",FILE_DOMAIN,folderString,[NSDate getCurrentTimestampFor64], UserDefault(UIDKey), fileName,[UIImage typeForImageData:imageData]];
-    
+
     [self uploadFileToOssWithSource:uploadFileName fileData:imageData progress:^(int64_t bytesWritten, int64_t totalBytes) {
         
     } successCallback:^(NSString *fileUrl) {
         NSMutableArray *fileUrlArray = [NSMutableArray array];
         [fileUrlArray addObject:fileUrl];
-        if (self.successCallback) {
-            self.successCallback(fileUrlArray);
+        if (success) {
+            success(fileUrlArray);
         }
     } faliure:^{
-        if (self.faliureCallback) {
-            self.faliureCallback(nil, @"上传文件失败");
+        if (faliure) {
+            faliure(nil, @"上传文件失败");
         }
     }];
 }
 
 - (void)mutilUploadImage:(NSMutableArray *)fileDataArray fileName:(NSString *)fileName successCallback:(KSUploadSuccess)success faliure:(KSUploadFailer)faliure {
-    if (success) {
-        self.successCallback = success;
-    }
-    if (faliure) {
-        self.faliureCallback = faliure;
-    }
-    
+
     NSString *folderString = [self getDayFolder];
     NSMutableArray *fileNameArray = [NSMutableArray array];
     if (fileDataArray.count > 1) {
@@ -123,11 +103,10 @@
         NSString *uploadFileName = [NSString stringWithFormat:@"%@%@%@_%@%@%@",FILE_DOMAIN,folderString,[NSDate getCurrentTimestampFor64], UserDefault(UIDKey), fileName,[UIImage typeForImageData:fileData]];
         [fileNameArray addObject:uploadFileName];
     }
-    [self MutilUploadFile:fileNameArray fileDataArray:fileDataArray successArray:[NSMutableArray array] failArray:[NSMutableArray array] fileIndex:0];
-    
+    [self MutilUploadFile:fileNameArray fileDataArray:fileDataArray successArray:[NSMutableArray array] failArray:[NSMutableArray array] fileIndex:0 successCallback:success faliure:faliure];
 }
 
-- (void)MutilUploadFile:(NSMutableArray *)fileNameArray fileDataArray:(NSMutableArray *)fileDataArray successArray:(NSMutableArray *)successArray failArray:(NSMutableArray *)failArray fileIndex:(NSInteger)fileIndex {
+- (void)MutilUploadFile:(NSMutableArray *)fileNameArray fileDataArray:(NSMutableArray *)fileDataArray successArray:(NSMutableArray *)successArray failArray:(NSMutableArray *)failArray fileIndex:(NSInteger)fileIndex successCallback:(KSUploadSuccess)successCallback faliure:(KSUploadFailer)faliureCallback {
     if (fileIndex >= fileNameArray.count) {
         return;
     }
@@ -140,10 +119,10 @@
         NSMutableArray *success = [NSMutableArray arrayWithArray:successArray];
         [success addObject:fileUrl];
         if (fileIndex == fileNameArray.count - 1) {
-            [self finishMutilUpload:success failArray:failArray];
+            [self finishMutilUpload:success failArray:failArray successCallback:successCallback faliure:faliureCallback];
         }
         else {
-            [self MutilUploadFile:fileNameArray fileDataArray:fileDataArray successArray:success failArray:failArray fileIndex:fileIndex+1];
+            [self MutilUploadFile:fileNameArray fileDataArray:fileDataArray successArray:success failArray:failArray fileIndex:fileIndex+1 successCallback:successCallback faliure:faliureCallback];
         }
         
     } faliure:^{
@@ -153,84 +132,68 @@
         [failerArray addObject:desc];
         
         if (fileIndex == fileNameArray.count - 1) {
-            [self finishMutilUpload:successArray failArray:failArray];
+            [self finishMutilUpload:successArray failArray:failerArray successCallback:successCallback faliure:faliureCallback];
         }
         else {
-            [self MutilUploadFile:fileNameArray fileDataArray:fileDataArray successArray:successArray failArray:failerArray fileIndex:fileIndex+1];
+            [self MutilUploadFile:fileNameArray fileDataArray:fileDataArray successArray:successArray failArray:failerArray fileIndex:fileIndex+1 successCallback:successCallback faliure:faliureCallback];
         }
     }];
 }
 
-- (void)finishMutilUpload:(NSMutableArray *)successArray failArray:(NSMutableArray *)array {
+- (void)finishMutilUpload:(NSMutableArray *)successArray failArray:(NSMutableArray *)array successCallback:(KSUploadSuccess)successCallback faliure:(KSUploadFailer)faliureCallback {
     if (successArray.count > 0) {
-        if (self.successCallback) {
-            self.successCallback([successArray copy]);
+        if (successCallback) {
+            successCallback([successArray copy]);
         }
     }
     else {
-        if (self.faliureCallback) {
-            self.faliureCallback(nil,@"上传文件失败");
+        if (faliureCallback) {
+            faliureCallback(nil,@"上传文件失败");
         }
     }
 }
 
 
 - (void)videoUpload:(NSData *)fileData fileName:(NSString *)fileName fileSuffix:(NSString *)fileSuffix progress:(KSUploadProgress)uploadProgress successCallback:(KSUploadSuccess)success faliure:(KSUploadFailer)faliure {
-    if (success) {
-        self.successCallback = success;
-    }
-    if (faliure) {
-        self.faliureCallback = faliure;
-    }
-    if (uploadProgress) {
-        self.uploadProgress = uploadProgress;
-    }
+
     NSString *folderString = [self getDayFolder];
     NSString *uploadFileName = [NSString stringWithFormat:@"%@%@%@_%@%@%@",FILE_DOMAIN,folderString,[NSDate getCurrentTimestampFor64], UserDefault(UIDKey),fileName,fileSuffix];
 
     [self uploadFileToOssWithSource:uploadFileName fileData:fileData progress:^(int64_t bytesWritten, int64_t totalBytes) {
-        if (self.uploadProgress) {
-            self.uploadProgress(bytesWritten, totalBytes);
+        if (uploadProgress) {
+            uploadProgress(bytesWritten, totalBytes);
         }
     } successCallback:^(NSString *fileUrl) {
         NSMutableArray *fileUrlArray = [NSMutableArray array];
         [fileUrlArray addObject:fileUrl];
-        if (self.successCallback) {
-            self.successCallback(fileUrlArray);
+        if (success) {
+            success(fileUrlArray);
         }
     } faliure:^{
-        if (self.faliureCallback) {
-            self.faliureCallback(nil, @"上传文件失败");
+        if (faliure) {
+            faliure(nil, @"上传文件失败");
         }
     }];
 }
 
 - (void)uploadFile:(NSData *)fileData fileName:(NSString *)fileName fileSuffix:(NSString *)fileSuffix progress:(KSUploadProgress)uploadProgress successCallback:(KSUploadSuccess)success faliure:(KSUploadFailer)faliure {
-    if (success) {
-        self.successCallback = success;
-    }
-    if (faliure) {
-        self.faliureCallback = faliure;
-    }
-    if (uploadProgress) {
-        self.uploadProgress = uploadProgress;
-    }
+
     NSString *folderString = [self getDayFolder];
     NSString *uploadFileName = [NSString stringWithFormat:@"%@%@%@_%@%@%@",FILE_DOMAIN,folderString,[NSDate getCurrentTimestampFor64],UserDefault(UIDKey), fileName,fileSuffix];
     
     [self uploadFileToOssWithSource:uploadFileName fileData:fileData progress:^(int64_t bytesWritten, int64_t totalBytes) {
-        if (self.uploadProgress) {
-            self.uploadProgress(bytesWritten, totalBytes);
+        if (uploadProgress) {
+            uploadProgress(bytesWritten, totalBytes);
         }
     } successCallback:^(NSString *fileUrl) {
         NSMutableArray *fileUrlArray = [NSMutableArray array];
         [fileUrlArray addObject:fileUrl];
-        if (self.successCallback) {
-            self.successCallback(fileUrlArray);
+        if (success) {
+            success(fileUrlArray);
         }
     } faliure:^{
-        if (self.faliureCallback) {
-            self.faliureCallback(nil, @"上传文件失败");
+        if (faliure) {
+            faliure(nil, @"上传文件失败");
         }
     }];
 }
@@ -297,9 +260,7 @@
         }
     } faliure:^(NSError * _Nonnull error) {
         continueBlock(nil, nil);
-        if (self.faliureCallback) {
-            self.faliureCallback(error, @"获取文件签名失败");
-        }
     }];
 }
+
 @end

+ 38 - 5
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/Controller/KSVideoCropViewController.m

@@ -79,6 +79,11 @@
 - (void)downloadUrl {
     [LOADING_MANAGER showCustomLoading:@"视频下载中..."];
     [KSNetworkingManager downloadFileRequestWithFileUrl:self.remoteUrl progress:^(int64_t bytesRead, int64_t totalBytes) {
+        NSInteger progress = (NSInteger)(bytesRead*1.0 / totalBytes) * 100;
+        NSString *tipsString = [NSString stringWithFormat:@"文件下载中\n%zd%%",progress];
+        dispatch_main_async_safe(^{
+            [LOADING_MANAGER showCustomLoading:tipsString];
+        });
     } success:^(NSURL * _Nonnull fileUrl) {
         [self configImageWallWithPath:fileUrl];
     } faliure:^(NSError * _Nonnull error) {
@@ -92,10 +97,26 @@
 }
 
 - (void)configUI {
+    [self.scrollView removeFromSuperview];
+    self.view.backgroundColor = HexRGB(0x000000);
     self.ks_prefersNavigationBarHidden = YES;
     [self.view addSubview:self.displayImage];
+    CGFloat imageWidth = KLandscapeWidth;
+    CGFloat imageHeight = KLandscapeHeight;
+    if (imageHeight > imageWidth / 16 * 9) {
+        imageWidth = KLandscapeWidth;
+        imageHeight = imageWidth / 16 * 9;
+    }
+    else if (imageWidth > imageHeight / 9 * 16) {
+        imageHeight = KLandscapeHeight;
+        imageWidth = imageHeight / 9 * 16;
+    }
+    
     [self.displayImage mas_makeConstraints:^(MASConstraintMaker *make) {
-        make.left.right.top.bottom.mas_equalTo(self.view);
+        make.centerX.mas_equalTo(self.view.mas_centerX);
+        make.centerY.mas_equalTo(self.view.mas_centerY);
+        make.width.mas_equalTo(imageWidth);
+        make.height.mas_equalTo(imageHeight);
     }];
     CGFloat height = 84.0f;
     [self.view addSubview:self.imageSlider];
@@ -243,17 +264,25 @@
                 [weakSelf backAction];
             }
             else {
+                [weakSelf sureChooseAction];
                 
-                if (weakSelf.callback) {
-                    weakSelf.callback(weakSelf.displayImage.image);
-                }
-                [weakSelf backAction];
             }
         }];
     }
     return _navView;
 }
 
+- (void)sureChooseAction {
+    if (self.displayImage.image == nil) {
+        [LOADING_MANAGER MBShowAUTOHidingInWindow:@"请选择视频封面"];
+        return;
+    }
+    if (self.callback) {
+        self.callback(self.displayImage.image);
+    }
+    [self backAction];
+}
+
 
 - (void)backAction {
     
@@ -262,6 +291,10 @@
         [self changeOrientation:NO];
     }
 }
+
+- (void)dealloc {
+    NSLog(@"----");
+}
 /*
 #pragma mark - Navigation
 

+ 0 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/Controller/MineWorksViewController.m

@@ -96,7 +96,6 @@
 
 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
-    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
     [self refreshAllPage];
 }
 

+ 1 - 1
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/View/KSVideoImageSlider.m

@@ -80,7 +80,7 @@
 }
 
 - (void) setKnodFrames {
-    _knobWidth = 128;
+    _knobWidth = self.bounds.size.height / 9 * 16;
     _knobHeight = self.bounds.size.height;
     _useableTrackLength = self.bounds.size.width - _knobWidth;
     

+ 4 - 0
KulexiuForTeacher/KulexiuForTeacher/Module/Mine/Works/View/VideoCoverChooseView.xib

@@ -19,6 +19,10 @@
                     <subviews>
                         <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="videoMerge_cover" translatesAutoresizingMaskIntoConstraints="NO" id="Yfw-f3-ca2">
                             <rect key="frame" x="0.0" y="0.0" width="290" height="136"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="290" id="Y3x-VJ-rHI"/>
+                                <constraint firstAttribute="height" constant="136" id="lI1-dt-PmD"/>
+                            </constraints>
                             <userDefinedRuntimeAttributes>
                                 <userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
                                     <real key="value" value="10"/>

+ 48 - 0
KulexiuForTeacher/Pods/Pods.xcodeproj/project.pbxproj

@@ -1505,6 +1505,18 @@
 		BBFC886BE411643AB497EFBE521E8051 /* TUISearchDataProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 1955579F6E0D378795DD6870C24BF2AA /* TUISearchDataProvider.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
 		BC0D261DD177DBE4F45A2F3739CB8BE9 /* RACEXTRuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CDA8BE1DEA2E64B4749032C82E55542 /* RACEXTRuntimeExtensions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
 		BC1EDD9E04A0BADA5B6044EA69BFF1B2 /* KS3UploadPartRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 31C2326A03FDB0CF4DB999E463BF880D /* KS3UploadPartRequest.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
+		BC4F92A42B024FA500152321 /* TXLiveShareMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4F92A02B024FA400152321 /* TXLiveShareMessage.m */; };
+		BC4F92A52B024FA500152321 /* TXLiveShareMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4F92A12B024FA400152321 /* TXLiveShareMessage.h */; };
+		BC4F92A62B024FA500152321 /* TXChatMusicMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4F92A22B024FA500152321 /* TXChatMusicMessage.m */; };
+		BC4F92A72B024FA500152321 /* TXChatMusicMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4F92A32B024FA500152321 /* TXChatMusicMessage.h */; };
+		BC4F92B02B024FCA00152321 /* TXShareLiveCellContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4F92A82B024FC900152321 /* TXShareLiveCellContentView.m */; };
+		BC4F92B12B024FCA00152321 /* TXChatMusicShareCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4F92A92B024FC900152321 /* TXChatMusicShareCell.m */; };
+		BC4F92B22B024FCA00152321 /* TXChatMusicShareCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4F92AA2B024FC900152321 /* TXChatMusicShareCell.h */; };
+		BC4F92B32B024FCA00152321 /* TXLiveShareCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4F92AB2B024FC900152321 /* TXLiveShareCell.m */; };
+		BC4F92B42B024FCA00152321 /* TXShareMusicCellContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4F92AC2B024FC900152321 /* TXShareMusicCellContentView.h */; };
+		BC4F92B52B024FCA00152321 /* TXShareMusicCellContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = BC4F92AD2B024FC900152321 /* TXShareMusicCellContentView.m */; };
+		BC4F92B62B024FCA00152321 /* TXLiveShareCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4F92AE2B024FC900152321 /* TXLiveShareCell.h */; };
+		BC4F92B72B024FCA00152321 /* TXShareLiveCellContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4F92AF2B024FC900152321 /* TXShareLiveCellContentView.h */; };
 		BC7E44A4D37A2D3F12B5591BF89C156F /* TUIFileViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E8D606FA830351B606766A97D478C51B /* TUIFileViewController.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		BCC1FA5B68BCA0938ADCA00D436CBC64 /* JXCategoryImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D53317D547383F4ECCC33E6ACADED7 /* JXCategoryImageView.h */; settings = {ATTRIBUTES = (Project, ); }; };
 		BCFCF49801DD5812B6D6934246E16A7D /* WhiteDisplayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A00F46E86BB828261B83EAC5030C4A02 /* WhiteDisplayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
@@ -4144,6 +4156,18 @@
 		BC17307A1284BCB6E6D416C41C59DB15 /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.m; sourceTree = "<group>"; };
 		BC34DB6723936B3314523FBCB9D063C7 /* TUIMessageMultiChooseView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TUIMessageMultiChooseView.h; path = TUIChat/UI_Classic/Chat/TUIMessageMultiChooseView.h; sourceTree = "<group>"; };
 		BC4BA595379E7429DB8B325A89C1B841 /* RSKInternalUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSKInternalUtility.h; path = RSKImageCropper/RSKInternalUtility.h; sourceTree = "<group>"; };
+		BC4F92A02B024FA400152321 /* TXLiveShareMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXLiveShareMessage.m; path = "../../../../../桌面文件/klx腾讯IM注册消息/Message/TXLiveShareMessage.m"; sourceTree = "<group>"; };
+		BC4F92A12B024FA400152321 /* TXLiveShareMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXLiveShareMessage.h; path = "../../../../../桌面文件/klx腾讯IM注册消息/Message/TXLiveShareMessage.h"; sourceTree = "<group>"; };
+		BC4F92A22B024FA500152321 /* TXChatMusicMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXChatMusicMessage.m; path = "../../../../../桌面文件/klx腾讯IM注册消息/Message/TXChatMusicMessage.m"; sourceTree = "<group>"; };
+		BC4F92A32B024FA500152321 /* TXChatMusicMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXChatMusicMessage.h; path = "../../../../../桌面文件/klx腾讯IM注册消息/Message/TXChatMusicMessage.h"; sourceTree = "<group>"; };
+		BC4F92A82B024FC900152321 /* TXShareLiveCellContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXShareLiveCellContentView.m; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXShareLiveCellContentView.m"; sourceTree = "<group>"; };
+		BC4F92A92B024FC900152321 /* TXChatMusicShareCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXChatMusicShareCell.m; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXChatMusicShareCell.m"; sourceTree = "<group>"; };
+		BC4F92AA2B024FC900152321 /* TXChatMusicShareCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXChatMusicShareCell.h; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXChatMusicShareCell.h"; sourceTree = "<group>"; };
+		BC4F92AB2B024FC900152321 /* TXLiveShareCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXLiveShareCell.m; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXLiveShareCell.m"; sourceTree = "<group>"; };
+		BC4F92AC2B024FC900152321 /* TXShareMusicCellContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXShareMusicCellContentView.h; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXShareMusicCellContentView.h"; sourceTree = "<group>"; };
+		BC4F92AD2B024FC900152321 /* TXShareMusicCellContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TXShareMusicCellContentView.m; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXShareMusicCellContentView.m"; sourceTree = "<group>"; };
+		BC4F92AE2B024FC900152321 /* TXLiveShareCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXLiveShareCell.h; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXLiveShareCell.h"; sourceTree = "<group>"; };
+		BC4F92AF2B024FC900152321 /* TXShareLiveCellContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TXShareLiveCellContentView.h; path = "../../../../../桌面文件/klx腾讯IM注册消息/View/TXShareLiveCellContentView.h"; sourceTree = "<group>"; };
 		BC58CE941FBE3064C578FEF8EF2274E9 /* amrFileCodec.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = amrFileCodec.mm; path = TUIChat/VoiceConvert/amrFileCodec.mm; sourceTree = "<group>"; };
 		BC6F263ACADA79EAE2F97348E9D805D7 /* mz_compat.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = mz_compat.c; path = SSZipArchive/minizip/mz_compat.c; sourceTree = "<group>"; };
 		BC8298BA9F4C54AA5E229DEA81D26013 /* RACStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACStream.m; path = ReactiveObjC/RACStream.m; sourceTree = "<group>"; };
@@ -5265,6 +5289,10 @@
 				BB04F58A750B7D17A3E9B2F1C305199C /* TUILinkCellData.m */,
 				E57812CB9BEAB4012DFE50CF1F8B01DD /* TUIOrderCellData.h */,
 				E399E7FA1D04B8798F1249C159DDDE06 /* TUIOrderCellData.m */,
+				BC4F92A32B024FA500152321 /* TXChatMusicMessage.h */,
+				BC4F92A22B024FA500152321 /* TXChatMusicMessage.m */,
+				BC4F92A12B024FA400152321 /* TXLiveShareMessage.h */,
+				BC4F92A02B024FA400152321 /* TXLiveShareMessage.m */,
 			);
 			name = Custom;
 			sourceTree = "<group>";
@@ -8536,6 +8564,14 @@
 				E2ABAA4CDAEBFB9BE62385C7AF1EF57E /* TUILinkCell.m */,
 				9A7BFF430CF2243BD491DCFC1B7C13DE /* TUIOrderCell.h */,
 				81317B19B5879AD6C456C94C9ED715BF /* TUIOrderCell.m */,
+				BC4F92AA2B024FC900152321 /* TXChatMusicShareCell.h */,
+				BC4F92A92B024FC900152321 /* TXChatMusicShareCell.m */,
+				BC4F92AE2B024FC900152321 /* TXLiveShareCell.h */,
+				BC4F92AB2B024FC900152321 /* TXLiveShareCell.m */,
+				BC4F92AF2B024FC900152321 /* TXShareLiveCellContentView.h */,
+				BC4F92A82B024FC900152321 /* TXShareLiveCellContentView.m */,
+				BC4F92AC2B024FC900152321 /* TXShareMusicCellContentView.h */,
+				BC4F92AD2B024FC900152321 /* TXShareMusicCellContentView.m */,
 			);
 			name = Custom;
 			sourceTree = "<group>";
@@ -9865,11 +9901,14 @@
 				D08B6C20F4841E26976B6FC0B5BFA9B3 /* TUIChatDataProvider.h in Headers */,
 				6901CAAB179521CBD976971A6C090601 /* TUIChatDefine.h in Headers */,
 				70924931FE2602BBEBC8215E2086E786 /* TUIChatExtensionObserver.h in Headers */,
+				BC4F92B42B024FCA00152321 /* TXShareMusicCellContentView.h in Headers */,
 				0897B80395BD6B7B9DE134BDEB2A79A0 /* TUIChatFlexViewController.h in Headers */,
+				BC4F92B72B024FCA00152321 /* TXShareLiveCellContentView.h in Headers */,
 				777AE7F7D7A565595D6AA3C12B69FDC8 /* TUIChatMediaDataProvider.h in Headers */,
 				545BB1507CD6FFD33A2246C253460924 /* TUIChatModifyMessageHelper.h in Headers */,
 				113510B7B9BAEA333CD2BF3F0F58E0C1 /* TUIChatObjectFactory.h in Headers */,
 				25BDBA75F88B25FA0BB7E6C84F56BDC9 /* TUIChatPopActionsView.h in Headers */,
+				BC4F92B22B024FCA00152321 /* TXChatMusicShareCell.h in Headers */,
 				8952A2E3857A9E4E781893BCADCAC124 /* TUIChatPopContextController.h in Headers */,
 				B44B162A6C4ADAE23440D09BDE078DCB /* TUIChatPopContextRecentView.h in Headers */,
 				4A594CD69F549FBC9F7AE0201B37F704 /* TUIChatPopEmojiView.h in Headers */,
@@ -9934,6 +9973,7 @@
 				0BA46E04CBF49C1B99104D9D8F3C1A6B /* TUIMessageProgressManager.h in Headers */,
 				2595847B3493FA9CCE34F162D34E50F9 /* TUIMessageReadViewController.h in Headers */,
 				A58938BC077F46204C4EA18EA229FC57 /* TUIMessageSearchDataProvider.h in Headers */,
+				BC4F92A72B024FA500152321 /* TXChatMusicMessage.h in Headers */,
 				DBDF2540CC27C58582E9447EDB64145E /* TUIMoreView.h in Headers */,
 				D7262B4A35D3ABE4194BEFF811A13A9E /* TUIMotionManager.h in Headers */,
 				8A4932DC78340F92AABFABEF99DE136E /* TUIMovieManager.h in Headers */,
@@ -9952,10 +9992,12 @@
 				DC2932D6A8AC1C5338C8F30FEC91C831 /* TUITextMessageCell.h in Headers */,
 				37DE9F10CDB049CF4A3ADC40BBF1365F /* TUITextMessageCellData.h in Headers */,
 				7FFC55A7F1BFC19EBFADCFA11C2E4FDC /* TUITextReplyQuoteView.h in Headers */,
+				BC4F92A52B024FA500152321 /* TXLiveShareMessage.h in Headers */,
 				B4C3C9A88B016A0940BA65026F8357F4 /* TUITextReplyQuoteViewData.h in Headers */,
 				A1DAE44AF674D08FFE6BE5908294BEF9 /* TUITypingStatusCellData.h in Headers */,
 				63869C7A5976C25FCF3A6D98DE6C37AE /* TUIVideoCollectionCell.h in Headers */,
 				F28FE7B587EE775F09340D0F787602DC /* TUIVideoMessageCell.h in Headers */,
+				BC4F92B62B024FCA00152321 /* TXLiveShareCell.h in Headers */,
 				8B20E740A120BC935D21607CBDBFC9D6 /* TUIVideoMessageCellData.h in Headers */,
 				18AF494630ADD9E25D9A88278FDC57CA /* TUIVideoReplyQuoteView.h in Headers */,
 				C0910552DF03EEF98F1CBE1599EF6E46 /* TUIVideoReplyQuoteViewData.h in Headers */,
@@ -11658,6 +11700,7 @@
 				71DAFE7FD20515022909694A1084C669 /* EMVoiceConverter.mm in Sources */,
 				2277F6775BD4302A01488A25BA2F58D1 /* TUIAIDenoiseSignatureManager.m in Sources */,
 				008A671B1E841382B1CB4F89CC4A219B /* TUIAudioRecorder.m in Sources */,
+				BC4F92B02B024FCA00152321 /* TXShareLiveCellContentView.m in Sources */,
 				C41036070B730A9CC6EF54866263570B /* TUIBaseChatViewController.m in Sources */,
 				1116691716B2330264BC7F2604913079 /* TUIBaseMessageController.m in Sources */,
 				C98CDCDC7088846FF8B27C032C370AD8 /* TUIC2CChatViewController.m in Sources */,
@@ -11687,6 +11730,7 @@
 				27D21E1B503D861DFC43853998329A5F /* TUIChatPopMenu.m in Sources */,
 				0DFE265017E3B0C2D5E0401E5D38768F /* TUIChatPopRecentView.m in Sources */,
 				CE27EBC962F3EAA7C8ABE47D3234CDC6 /* TUIChatService.m in Sources */,
+				BC4F92A42B024FA500152321 /* TXLiveShareMessage.m in Sources */,
 				DB9F65EE81BD082128E448A2C09DE9CD /* TUIChatSmallTongueView.m in Sources */,
 				E688FD19741D16B4E7EDEDF4B907EBFC /* TUICircleLodingView.m in Sources */,
 				BE0D269F5FF48EA8089D7FD8FB3E17CF /* TUICloudCustomDataTypeCenter.m in Sources */,
@@ -11716,7 +11760,9 @@
 				C3B3FD1CB84BA85FBE9077197F17B02C /* TUIInputController.m in Sources */,
 				1B8282D64A5A9B51AD1D4EFA55E4BADD /* TUIInputMoreCell.m in Sources */,
 				89C86EB7790DEE0F3FBE4386F36E41C4 /* TUIInputMoreCellData.m in Sources */,
+				BC4F92B12B024FCA00152321 /* TXChatMusicShareCell.m in Sources */,
 				22D6C9674A2CAC045F81A88A0C1B372A /* TUIJoinGroupMessageCell.m in Sources */,
+				BC4F92A62B024FA500152321 /* TXChatMusicMessage.m in Sources */,
 				7FB59612A29F79223136DB0E14DF966E /* TUIJoinGroupMessageCellData.m in Sources */,
 				81FF9B7403E7D023F202B086E1F7D8EC /* TUILinkCell.m in Sources */,
 				3FA52345F97BB82E9DF895B21DD06706 /* TUILinkCellData.m in Sources */,
@@ -11741,6 +11787,7 @@
 				1860F78C26219E06E814B789FDCBA2AB /* TUIMessageItem.m in Sources */,
 				53CFB0101226D88AA41EDFB62044586A /* TUIMessageMediaDataProvider.m in Sources */,
 				44BEF10B043179E0D2A34B4612206D4E /* TUIMessageMultiChooseView.m in Sources */,
+				BC4F92B32B024FCA00152321 /* TXLiveShareCell.m in Sources */,
 				0CAA0A1DD9D1A42F501DFDA84C47D252 /* TUIMessageProgressManager.m in Sources */,
 				F95F241BFB93AD8227BE96F0BEF6D600 /* TUIMessageReadViewController.m in Sources */,
 				2C7FCC397864E6AB56F61816A44123ED /* TUIMessageSearchDataProvider.m in Sources */,
@@ -11756,6 +11803,7 @@
 				EE24FC92C3F32BC82A77803E0717EF53 /* TUIReplyMessageCellData.m in Sources */,
 				6593C64BE9CA983C0604909038CF36AB /* TUIReplyPreviewBar.m in Sources */,
 				4C080268C01D91A6B7D5E4BE3E21F367 /* TUIReplyPreviewData.m in Sources */,
+				BC4F92B52B024FCA00152321 /* TXShareMusicCellContentView.m in Sources */,
 				E3E638A13C97960206257F937B7576D9 /* TUIReplyQuoteView.m in Sources */,
 				C66C5695E939EBD07487634B57D7387F /* TUIReplyQuoteViewData.m in Sources */,
 				70060CD8CD001B8548755C54502C9C1D /* TUIResponderTextView.m in Sources */,