|
@@ -20,6 +20,8 @@
|
|
|
#import "KSMediaManager.h"
|
|
|
#import <RSKImageCropper/RSKImageCropper.h>
|
|
|
#import "KSVideoCropViewController.h"
|
|
|
+#import "KSAudioSessionManager.h"
|
|
|
+
|
|
|
|
|
|
@interface KSMediaMergeView ()<kSNewPlayerManagerDelegate,KSVideoPlayerViewDelegate,RSKImageCropViewControllerDelegate,RSKImageCropViewControllerDataSource>
|
|
|
|
|
@@ -102,6 +104,20 @@
|
|
|
|
|
|
@property (nonatomic, strong) NSString *videoCoverUrl; // 视频封面
|
|
|
|
|
|
+@property (nonatomic, assign) BOOL isOtherLogin;
|
|
|
+
|
|
|
+@property (nonatomic, assign) NSInteger defaultDelay;
|
|
|
+
|
|
|
+@property (nonatomic, assign) CGFloat bgPlayerRate;
|
|
|
+
|
|
|
+@property (nonatomic, assign) NSInteger addTime;
|
|
|
+
|
|
|
+//@property (nonatomic, strong) UILabel *offsetTimeLabel;
|
|
|
+
|
|
|
+@property (nonatomic, assign) NSInteger evaluateDelay;
|
|
|
+
|
|
|
+@property (nonatomic, assign) BOOL fromDraftPage; // 是否从草稿页面进入
|
|
|
+
|
|
|
@end
|
|
|
|
|
|
@implementation KSMediaMergeView
|
|
@@ -110,17 +126,24 @@
|
|
|
self = [super init];
|
|
|
if (self) {
|
|
|
self.hasModify = NO;
|
|
|
+ self.bgPlayerRate = 1.0;
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appEnterBackground) name:@"appEnterBackground" object:nil];
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(otherLogin) name:@"otherLogin" object:nil];
|
|
|
+ self.addTime = 0;
|
|
|
+ [self configAudioSession];
|
|
|
+
|
|
|
}
|
|
|
return self;
|
|
|
}
|
|
|
|
|
|
+- (void)configAudioSession {
|
|
|
+ [[[KSAudioSessionManager alloc] init] configAudioSession:AUDIOCONFIG_PLAYANDRECORD];
|
|
|
+}
|
|
|
+
|
|
|
- (void)otherLogin {
|
|
|
[self stopPlay];
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- (void)appEnterBackground {
|
|
|
[self stopPlay];
|
|
|
}
|
|
@@ -142,13 +165,13 @@
|
|
|
else {
|
|
|
self.isVideoPlay = NO;
|
|
|
}
|
|
|
+ self.fromDraftPage = NO;
|
|
|
self.remoteBgAudioUrl = remoteBgUrl;
|
|
|
self.videoUrl = videoUrl;
|
|
|
self.bgAudioUrl = bgAudioUrl;
|
|
|
self.recordUrl = recordUrl;
|
|
|
- if (offsetTime > 300) {
|
|
|
- offsetTime = 300;
|
|
|
- }
|
|
|
+ self.defaultDelay = -offsetTime; // default delay = evaluate delay
|
|
|
+ self.evaluateDelay = -offsetTime; // 播放延迟和收音延迟
|
|
|
self.originalOffset = 0;
|
|
|
[self.contrlView configWithOffsetTime:0];
|
|
|
self.contrlView.hideBackView = NO;
|
|
@@ -157,6 +180,7 @@
|
|
|
}
|
|
|
|
|
|
- (void)configRemoteVideoUrl:(NSString *)remoteVideoUrl bgAudioUrl:(NSString *)remoteBgAudioUrl recordUrl:(NSString *)remoteRecrodUrl jsonConfig:(NSString *)jsonConfig callback:(DraftEditCallback)callback {
|
|
|
+ self.addTime = 0;
|
|
|
if (callback) {
|
|
|
self.draftCallback = callback;
|
|
|
}
|
|
@@ -166,12 +190,15 @@
|
|
|
else {
|
|
|
self.isVideoPlay = NO;
|
|
|
}
|
|
|
+ self.fromDraftPage = YES;
|
|
|
self.remoteVideoUrl = remoteVideoUrl;
|
|
|
self.remoteBgAudioUrl = remoteBgAudioUrl;
|
|
|
self.remoteRecrodUrl = remoteRecrodUrl;
|
|
|
|
|
|
self.preJsonDic = [jsonConfig mj_JSONObject];
|
|
|
self.originalOffset = [self.preJsonDic ks_integerValueForKey:@"offset"];
|
|
|
+ self.defaultDelay = [self.preJsonDic ks_integerValueForKey:@"defaultDelay"];
|
|
|
+ self.evaluateDelay = [self.preJsonDic ks_integerValueForKey:@"evaluateDelay"]; // 播放延迟和收音延迟
|
|
|
self.offsetTime = self.originalOffset;
|
|
|
[self.contrlView configWithOffsetTime:self.originalOffset];
|
|
|
self.contrlView.hideBackView = YES;
|
|
@@ -323,7 +350,7 @@
|
|
|
make.top.mas_equalTo(self.animationView.mas_top).offset(86);
|
|
|
}];
|
|
|
[self.animationView configWithImageWithUrl:self.coverImage];
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
[self addSubview:self.playControlView];
|
|
@@ -359,7 +386,19 @@
|
|
|
make.height.mas_equalTo(22);
|
|
|
make.right.mas_greaterThanOrEqualTo(self.contrlView.mas_left).offset(20);
|
|
|
}];
|
|
|
- [self startPlay];
|
|
|
+
|
|
|
+// self.offsetTimeLabel = [[UILabel alloc] init];
|
|
|
+// self.offsetTimeLabel.font = [UIFont systemFontOfSize:14.0f weight:UIFontWeightSemibold];
|
|
|
+// self.offsetTimeLabel.textColor = self.isVideoPlay ? HexRGB(0xffffff) : HexRGB(0x131415);
|
|
|
+// [self addSubview:self.offsetTimeLabel];
|
|
|
+// [self.offsetTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
|
+// make.height.mas_equalTo(22);
|
|
|
+// make.centerX.mas_equalTo(self.mas_centerX);
|
|
|
+// make.centerY.mas_equalTo(songLabel.mas_centerY);
|
|
|
+// }];
|
|
|
+
|
|
|
+// [self startPlay];
|
|
|
+ // 缓冲完成后播放
|
|
|
}
|
|
|
|
|
|
- (void)backAction {
|
|
@@ -409,21 +448,27 @@
|
|
|
}
|
|
|
|
|
|
- (void)startPlay {
|
|
|
+ self.bgPlayerRate = 1.0;
|
|
|
self.playControlView.isPlay = YES;
|
|
|
self.animationView.isPlay = YES;
|
|
|
NSInteger recordPlayerPosition = self.playControlView.playScheduleTime*1000;
|
|
|
- NSLog(@"--recordPlayer start---");
|
|
|
[self.recordPlayer seekToTimePlay:recordPlayerPosition];
|
|
|
- NSInteger realOffsetTime = self.offsetTime;
|
|
|
+
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
NSInteger offsetTime = recordPlayerPosition + realOffsetTime;
|
|
|
- if (offsetTime > 0) {
|
|
|
- [self.bgPlayer seekToTimePlay:labs(offsetTime)];
|
|
|
+ if (offsetTime >= 0) {
|
|
|
+ [self.bgPlayer seekToTimePlay:offsetTime];
|
|
|
}
|
|
|
else {
|
|
|
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(labs(offsetTime) * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
|
|
- NSLog(@"--bgPlayer start---");
|
|
|
-
|
|
|
- [self.bgPlayer startPlay];
|
|
|
+ [self.bgPlayer seekToStart];
|
|
|
+ @weakObj(self);
|
|
|
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((labs(offsetTime) + self.addTime) * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
|
|
+ @strongObj(self);
|
|
|
+// NSLog(@"--bgPlayer start---");
|
|
|
+ if (self.playControlView.isPlay == YES) {
|
|
|
+ [self.bgPlayer resumePlay];
|
|
|
+ [self snapPlayerProgress];
|
|
|
+ }
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -465,24 +510,29 @@
|
|
|
case PLAYERTYPE_RATE:
|
|
|
{
|
|
|
[self.recordPlayer seekOffsetTime:rate*1000];
|
|
|
- NSInteger realOffsetTime = self.offsetTime;
|
|
|
-
|
|
|
+
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
NSInteger offsetTime = rate*1000 + realOffsetTime;
|
|
|
- if (offsetTime > 0) {
|
|
|
- [self.bgPlayer seekOffsetTime:labs(offsetTime)];
|
|
|
+ if (offsetTime >= 0) {
|
|
|
+ [self.bgPlayer seekOffsetTime:offsetTime];
|
|
|
}
|
|
|
else {
|
|
|
[self.bgPlayer puasePlay];
|
|
|
if (self.recordPlayer.isPlaying) {
|
|
|
-
|
|
|
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(labs(offsetTime) * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
|
|
- [self.bgPlayer startPlay];
|
|
|
+ [self.bgPlayer seekToStart];
|
|
|
+ @weakObj(self);
|
|
|
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((labs(offsetTime) + self.addTime) * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
|
|
+ @strongObj(self);
|
|
|
+ if (self.playControlView.isPlay == YES) {
|
|
|
+ [self.bgPlayer resumePlay];
|
|
|
+ [self snapPlayerProgress];
|
|
|
+ }
|
|
|
+
|
|
|
});
|
|
|
}
|
|
|
else {
|
|
|
[self.bgPlayer seekToStart];
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
if (self.isVideoPlay) {
|
|
@@ -495,6 +545,21 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 对齐播放延迟
|
|
|
+- (void)snapPlayerProgress {
|
|
|
+ @weakObj(self);
|
|
|
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(500 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
|
|
+ @strongObj(self);
|
|
|
+ if (self.playControlView.isPlay == YES) {
|
|
|
+ CMTime time = [self.recordPlayer getCurrentPlayTime];
|
|
|
+ NSInteger newDelayTime = CMTimeGetSeconds(time) * 1000 + self.offsetTime + self.evaluateDelay;
|
|
|
+ [self.recordPlayer seekOffsetTimeNoPuase:CMTimeGetSeconds(time) * 1000];
|
|
|
+ [self.bgPlayer seekOffsetTime:newDelayTime];
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
- (void)startTimer {
|
|
|
[self.timer setFireDate:[NSDate distantPast]];
|
|
|
}
|
|
@@ -537,7 +602,8 @@
|
|
|
self.hasModify = YES;
|
|
|
if (self.bgPlayer.isPlaying) {
|
|
|
CMTime time = [self.recordPlayer getCurrentPlayTime];
|
|
|
- NSInteger newDelayTime = CMTimeGetSeconds(time) * 1000 + offsetTime;
|
|
|
+ NSInteger newDelayTime = CMTimeGetSeconds(time) * 1000 + offsetTime + self.evaluateDelay;
|
|
|
+ [self.recordPlayer seekOffsetTime:CMTimeGetSeconds(time) * 1000];
|
|
|
[self.bgPlayer seekOffsetTime:newDelayTime];
|
|
|
}
|
|
|
|
|
@@ -546,6 +612,8 @@
|
|
|
break;
|
|
|
case MERGEACTION_SAVE: // 保存
|
|
|
{
|
|
|
+ // 暂停播放
|
|
|
+ [self stopPlay];
|
|
|
[self saveCurrentDraft:NO];
|
|
|
}
|
|
|
break;
|
|
@@ -596,6 +664,7 @@
|
|
|
// 暂停播放
|
|
|
[self stopPlay];
|
|
|
self.isChooseVideoCover = NO;
|
|
|
+
|
|
|
// 调用相册
|
|
|
self.mediaManager = [[KSMediaManager alloc] init];
|
|
|
self.mediaManager.mediaType = MEDIATYPE_PHOTO;
|
|
@@ -688,7 +757,6 @@
|
|
|
- (void)uploadMusicCover {
|
|
|
NSString *tips = self.isVideoPlay ? @"视频合成中" : @"音频合成中";
|
|
|
[LOADING_MANAGER showProgressLoading:tips progress:0];
|
|
|
-
|
|
|
if (self.settingImage) {
|
|
|
NSData *imgData = [UIImage turnsImaegDataByImage:self.settingImage];
|
|
|
NSString *fileName = @"musicCoverImg";
|
|
@@ -744,8 +812,8 @@
|
|
|
CGFloat rate = 1.0/3;
|
|
|
if (self.isVideoPlay) {
|
|
|
[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) {
|
|
|
+ CGFloat offsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
+ [KSMediaEditor mixVideoWithRecordAudio:self.recordUrl recordVolume:self.recordPlayer.volume bgAudio:self.bgAudioUrl bgAudioVolume:self.bgPlayer.volume offsetTime:offsetTime videoUrlStr:self.videoUrl completion:^(NSString * _Nonnull outPath, BOOL isSuccess, NSString * _Nonnull desc) {
|
|
|
[LOADING_MANAGER showProgressLoading:@"视频合成中" progress:progress];
|
|
|
// 保存文件到指定文件夹
|
|
|
if (isSuccess) {
|
|
@@ -766,7 +834,7 @@
|
|
|
}
|
|
|
else {
|
|
|
[LOADING_MANAGER showProgressLoading:@"音频合成中" progress:0];
|
|
|
- NSInteger realOffsetTime = self.offsetTime;
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
[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];
|
|
@@ -885,24 +953,85 @@
|
|
|
|
|
|
|
|
|
#pragma mark ----- player delegate
|
|
|
+
|
|
|
+- (void)videoPlayerIsReadyPlay:(AVPlayer *)player {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+- (void)playerIsReadyPlay:(kSNewPlayer *)player {
|
|
|
+ if (self.bgPlayer.isReady && self.recordPlayer.isReady) {
|
|
|
+ [self startPlay];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
- (void)getSongCurrentTime:(NSInteger)currentTime andTotalTime:(NSInteger)totalTime andProgress:(CGFloat)progress currentInterval:(NSTimeInterval)currentInterval playTime:(NSTimeInterval)playTime inPlayer:(kSNewPlayer *_Nonnull)player {
|
|
|
if (player == self.recordPlayer) {
|
|
|
// NSLog(@"--- ---- ----- %f", playTime);
|
|
|
self.playControlView.playScheduleTime = (NSInteger)(playTime / 1000);
|
|
|
+ NSInteger realOffset = (NSInteger)(CMTimeGetSeconds([self.bgPlayer getCurrentPlayTime]) *1000 - CMTimeGetSeconds([self.recordPlayer getCurrentPlayTime])*1000);
|
|
|
+// NSLog(@" offset ---- %ld" , realOffset);
|
|
|
+ // 如果延迟大于11ms 调整
|
|
|
+ NSInteger expectOffset = self.offsetTime + self.evaluateDelay;
|
|
|
+ NSLog(@"---- expectOffset == %@", [NSString stringWithFormat:@"实际: %ld, 期望偏差 %ld", realOffset, expectOffset]);
|
|
|
+// self.offsetTimeLabel.text = [NSString stringWithFormat:@"实际: %ld, 期望偏差 %ld", realOffset, expectOffset];
|
|
|
+// if (labs(labs(realOffset) - labs(expectOffset)) >= 11) { // 需要调整
|
|
|
+//
|
|
|
+// if (labs(realOffset) < labs(expectOffset)) { // 要扩大差距
|
|
|
+// if (expectOffset > 0) { // 300
|
|
|
+// if (self.bgPlayerRate != 1.02) {
|
|
|
+// self.bgPlayerRate = 1.02;
|
|
|
+// [self.bgPlayer configPlayerRate:1.02];
|
|
|
+// [self.recordPlayer configPlayerRate:0.98];
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else { // expectOffset < 0 -300
|
|
|
+// if (self.bgPlayerRate != 0.98) {
|
|
|
+// self.bgPlayerRate = 0.98;
|
|
|
+// [self.bgPlayer configPlayerRate:0.98];
|
|
|
+// [self.recordPlayer configPlayerRate:1.02];
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else { // 需要减小差距
|
|
|
+// if (realOffset > 0) {
|
|
|
+// if (self.bgPlayerRate != 0.98) {
|
|
|
+// self.bgPlayerRate = 0.98;
|
|
|
+// [self.bgPlayer configPlayerRate:0.98];
|
|
|
+// [self.recordPlayer configPlayerRate:1.02];
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// if (self.bgPlayerRate != 1.02) {
|
|
|
+// self.bgPlayerRate = 1.02;
|
|
|
+// [self.bgPlayer configPlayerRate:1.02];
|
|
|
+// [self.recordPlayer configPlayerRate:0.98];
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// else {
|
|
|
+// if (self.bgPlayerRate != 1.0) {
|
|
|
+// self.bgPlayerRate = 1.0;
|
|
|
+// [self.recordPlayer configPlayerRate:1.0];
|
|
|
+// [self.bgPlayer configPlayerRate:1.0];
|
|
|
+// }
|
|
|
+// }
|
|
|
}
|
|
|
else {
|
|
|
-// NSLog(@"--- ---- bgPlayer ----- %f", playTime);
|
|
|
+// NSLog(@"------- bgPlayer ----- %f", playTime);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- (void)playFinished:(kSNewPlayer *)player {
|
|
|
if (player == self.recordPlayer) {
|
|
|
+
|
|
|
[self.recordPlayer puasePlay];
|
|
|
[self.recordPlayer seekToStart];
|
|
|
|
|
|
[self.bgPlayer puasePlay];
|
|
|
[self.bgPlayer seekToStart];
|
|
|
- self.isPause = NO;
|
|
|
+
|
|
|
self.animationView.isPlay = NO;
|
|
|
self.playControlView.isPlay = NO;
|
|
|
[self.playAnimationView stopAnimation];
|
|
@@ -970,6 +1099,9 @@
|
|
|
[parm setValue:@(self.offsetTime) forKey:@"offset"];
|
|
|
[parm setValue:@(self.originalVolume) forKey:@"originalVolume"];
|
|
|
[parm setValue:@(self.accompanyVolume) forKey:@"accompanyVolume"];
|
|
|
+ [parm setValue:@(self.defaultDelay) forKey:@"defaultDelay"];
|
|
|
+ [parm setValue:@(self.evaluateDelay) forKey:@"evaluateDelay"];
|
|
|
+
|
|
|
self.jsonConfig = [parm mj_JSONString];
|
|
|
[KSNetworkingManager saveMusicMessage:KS_POST jsonConfig:self.jsonConfig img:self.coverImage videoUrl:fileUrl accompanyUrl:self.remoteBgAudioUrl desc:self.desc type:type musicPracticeRecordId:self.recordId videoImg:self.videoCoverUrl success:^(NSDictionary * _Nonnull dic) {
|
|
|
if ([dic ks_integerValueForKey:@"code"] == 200) {
|
|
@@ -984,6 +1116,11 @@
|
|
|
if (needBack) {
|
|
|
[self removeViewTips:NO];
|
|
|
}
|
|
|
+ else { // 从云教练进入 点击保存 显示保存弹窗
|
|
|
+ if (self.fromDraftPage == NO) {
|
|
|
+ [self showSaveDraftTipsAlert];
|
|
|
+ }
|
|
|
+ }
|
|
|
}];
|
|
|
}
|
|
|
}
|
|
@@ -996,6 +1133,27 @@
|
|
|
}];
|
|
|
}
|
|
|
|
|
|
+- (void)showSaveDraftTipsAlert {
|
|
|
+ MJWeakSelf;
|
|
|
+ [self.alertView configTitle:@"提示" descMessage:@"已成功保存到草稿,草稿7天未发布将自动清理。" leftButtonTitle:@"确认" rightButtonTitle:@"查看草稿" leftButtonAction:^{
|
|
|
+
|
|
|
+ } rightButtonAction:^{
|
|
|
+ [weakSelf displayDraft];
|
|
|
+ }];
|
|
|
+ [self.alertView showAlert];
|
|
|
+}
|
|
|
+
|
|
|
+- (void)displayDraft {
|
|
|
+
|
|
|
+ // 跳转到我的作品
|
|
|
+ UIViewController *baseCtrl = [self findViewController];
|
|
|
+ [baseCtrl.navigationController popToRootViewControllerAnimated:YES];
|
|
|
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"DisplayDraft" object:nil];
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
- (void)sendVideoActionWithUrlPath:(NSURL *)fileUrl isFormal:(BOOL)isFormal beginProgress:(CGFloat)beginProgress rate:(CGFloat)rate success:(void (^)(NSString * _Nonnull uploadVideoUrl))success failure:(void (^)(NSString * _Nonnull desc))faliure {
|
|
|
NSString *tips = isFormal ? @"正在上传作品" : @"正在上传草稿";
|
|
|
[LOADING_MANAGER showProgressLoading:tips progress:beginProgress];
|
|
@@ -1034,8 +1192,7 @@
|
|
|
[LOADING_MANAGER showProgressLoading:tips progress:beginProgress];
|
|
|
NSData *fileData = [NSData dataWithContentsOfURL:fileUrl];
|
|
|
NSString *suffix = [NSString stringWithFormat:@".%@",[fileUrl pathExtension]];
|
|
|
- [[KSUploadManager shareInstance] configBucketName:@"klx"];
|
|
|
- [UPLOAD_MANAGER uploadFile:fileData fileName:@"evaluateAudio" fileSuffix:suffix progress:^(int64_t bytesWritten, int64_t totalBytes) {
|
|
|
+ [[KSUploadManager shareInstance] configBucketName:@"klx"]; [UPLOAD_MANAGER uploadFile:fileData fileName:@"evaluateAudio" fileSuffix:suffix progress:^(int64_t bytesWritten, int64_t totalBytes) {
|
|
|
// 显示进度
|
|
|
float progress = (bytesWritten*1.0 / totalBytes) * rate + beginProgress;
|
|
|
dispatch_main_async_safe(^{
|
|
@@ -1197,6 +1354,7 @@
|
|
|
|
|
|
[controller dismissViewControllerAnimated:YES completion:nil];
|
|
|
}
|
|
|
+
|
|
|
/*
|
|
|
// Only override drawRect: if you perform custom drawing.
|
|
|
// An empty implementation adversely affects performance during animation.
|