|
@@ -11,7 +11,6 @@
|
|
|
#import <KSToolLibrary/KSMediaEditor.h>
|
|
|
#import "KSPlayerView.h"
|
|
|
#import "KSPlayerSliderView.h"
|
|
|
-#import <CloudAccompanyLibrary/kSNewPlayer.h>
|
|
|
#import "KSVideoPlayerView.h"
|
|
|
#import "KSAudioPlayAnimationView.h"
|
|
|
#import "KSNewAlertView.h"
|
|
@@ -25,7 +24,9 @@
|
|
|
#import "KSUMShareManager.h"
|
|
|
#import "KSLogManager.h"
|
|
|
|
|
|
-@interface KSMediaMergeView ()<kSNewPlayerManagerDelegate,KSVideoPlayerViewDelegate,RSKImageCropViewControllerDelegate,RSKImageCropViewControllerDataSource>
|
|
|
+#import "KSMergeEnginePlayer.h"
|
|
|
+
|
|
|
+@interface KSMediaMergeView ()<KSMergeEnginePlayerDelegate,KSVideoPlayerViewDelegate,RSKImageCropViewControllerDelegate,RSKImageCropViewControllerDataSource>
|
|
|
|
|
|
@property (nonatomic, strong) KSAudioAnimationView *animationView;
|
|
|
|
|
@@ -43,15 +44,12 @@
|
|
|
|
|
|
@property (nonatomic, strong) KSPlayerSliderView *playControlView;
|
|
|
|
|
|
-@property (nonatomic, strong) kSNewPlayer *bgPlayer;
|
|
|
-
|
|
|
-@property (nonatomic, strong) kSNewPlayer *recordPlayer;
|
|
|
+@property (nonatomic, strong) KSMergeEnginePlayer *mergePlayer;
|
|
|
|
|
|
@property (nonatomic, assign) BOOL isPause;
|
|
|
|
|
|
@property (nonatomic, strong) NSString *filePath;
|
|
|
|
|
|
-
|
|
|
@property (nonatomic, assign) NSInteger originalOffset;
|
|
|
|
|
|
@property (nonatomic, strong) KSVideoPlayerView *videoView;
|
|
@@ -112,9 +110,6 @@
|
|
|
|
|
|
@property (nonatomic, assign) CGFloat bgPlayerRate;
|
|
|
|
|
|
-@property (nonatomic, assign) NSInteger addTime;
|
|
|
-
|
|
|
-//@property (nonatomic, strong) UILabel *offsetTimeLabel;
|
|
|
|
|
|
@property (nonatomic, assign) NSInteger evaluateDelay;
|
|
|
|
|
@@ -133,9 +128,7 @@
|
|
|
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;
|
|
|
}
|
|
@@ -174,17 +167,19 @@
|
|
|
self.videoUrl = videoUrl;
|
|
|
self.bgAudioUrl = bgAudioUrl;
|
|
|
self.recordUrl = recordUrl;
|
|
|
- self.defaultDelay = -offsetTime; // default delay = evaluate delay
|
|
|
- self.evaluateDelay = -offsetTime; // 播放延迟和收音延迟
|
|
|
+ self.defaultDelay = offsetTime; // default delay = evaluate delay
|
|
|
+ self.evaluateDelay = offsetTime; // 播放延迟和收音延迟
|
|
|
self.originalOffset = 0;
|
|
|
[self.contrlView configWithOffsetTime:0];
|
|
|
self.contrlView.hideBackView = NO;
|
|
|
[self configUI];
|
|
|
- [self configPlayer];
|
|
|
+ [self modifyBgSpeed:self.bgAudioUrl callback:^{
|
|
|
+ [self configPlayer];
|
|
|
+ }];
|
|
|
}
|
|
|
|
|
|
- (void)configRemoteVideoUrl:(NSString *)remoteVideoUrl bgAudioUrl:(NSString *)remoteBgAudioUrl recordUrl:(NSString *)remoteRecrodUrl jsonConfig:(NSString *)jsonConfig callback:(DraftEditCallback)callback {
|
|
|
- self.addTime = 0;
|
|
|
+
|
|
|
if (callback) {
|
|
|
self.draftCallback = callback;
|
|
|
}
|
|
@@ -201,14 +196,23 @@
|
|
|
|
|
|
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"]; // 播放延迟和收音延迟
|
|
|
+ NSInteger defaultDelay = [self.preJsonDic ks_integerValueForKey:@"defaultDelay"];
|
|
|
+ NSInteger evaluateDelay = [self.preJsonDic ks_integerValueForKey:@"evaluateDelay"];
|
|
|
+ self.defaultDelay = labs(defaultDelay);
|
|
|
+ self.evaluateDelay = labs(evaluateDelay); // 播放延迟和收音延迟
|
|
|
+ if ([[self.preJsonDic allKeys] containsObject:@"speedRate"]) {
|
|
|
+ self.musicSpeed = [self.preJsonDic ks_floatValueForKey:@"speedRate"];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ self.musicSpeed = 1.0f;
|
|
|
+ }
|
|
|
self.offsetTime = self.originalOffset;
|
|
|
[self.contrlView configWithOffsetTime:self.originalOffset];
|
|
|
self.contrlView.hideBackView = YES;
|
|
|
[self downloadFileSource];
|
|
|
}
|
|
|
|
|
|
+
|
|
|
- (void)downloadFileSource {
|
|
|
[LOADING_MANAGER showCustomLoading:@"资源下载中"];
|
|
|
|
|
@@ -236,6 +240,21 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 修改文件速度
|
|
|
+- (void)modifyBgSpeed:(NSURL *)musicUrl callback:(void(^)(void))callback {
|
|
|
+ if (self.musicSpeed != 1) {
|
|
|
+ [KSMediaEditor modifyAudioFileSpeed:musicUrl rate:self.musicSpeed completion:^(NSString * _Nonnull outPath, BOOL isSuccess, NSString * _Nonnull desc) {
|
|
|
+ if (isSuccess) {
|
|
|
+ self.bgAudioUrl = [NSURL fileURLWithPath:outPath];
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+ }];
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
- (void)downloadAudio {
|
|
|
if (![NSString isEmptyString:self.remoteRecrodUrl]) {
|
|
|
dispatch_group_enter(self.requestGroup);
|
|
@@ -257,8 +276,11 @@
|
|
|
[KSNetworkingManager downloadFileRequestWithFileUrl:self.remoteBgAudioUrl progress:^(int64_t bytesRead, int64_t totalBytes) {
|
|
|
|
|
|
} success:^(NSURL * _Nonnull fileUrl) {
|
|
|
- dispatch_group_leave(self.requestGroup);
|
|
|
self.bgAudioUrl = fileUrl;
|
|
|
+ [self modifyBgSpeed:self.bgAudioUrl callback:^{
|
|
|
+ dispatch_group_leave(self.requestGroup);
|
|
|
+ }];
|
|
|
+
|
|
|
} faliure:^(NSError * _Nonnull error) {
|
|
|
dispatch_group_leave(self.requestGroup);
|
|
|
|
|
@@ -266,34 +288,29 @@
|
|
|
}
|
|
|
}
|
|
|
- (void)configPlayer {
|
|
|
-
|
|
|
- if (self.bgAudioUrl) {
|
|
|
- [self.bgPlayer preparePlayNativeSongWithPath:self.bgAudioUrl];
|
|
|
- }
|
|
|
|
|
|
- if (self.recordUrl) {
|
|
|
- [self.recordPlayer preparePlayNativeSongWithPath:self.recordUrl];
|
|
|
- }
|
|
|
if (self.isVideoPlay) {
|
|
|
[self.videoView preparePlayNativeVideoWithPath:self.videoUrl];
|
|
|
self.videoView.isMute = YES;
|
|
|
}
|
|
|
+ if (self.bgAudioUrl && self.recordUrl) {
|
|
|
+ [self.mergePlayer prepareNativeSongWithUrl:self.recordUrl bgMusic:self.bgAudioUrl];;
|
|
|
+ }
|
|
|
|
|
|
// 音量同步
|
|
|
NSInteger accompanyVolume = 100;
|
|
|
if ([[self.preJsonDic allKeys] containsObject:@"accompanyVolume"]) {
|
|
|
accompanyVolume = [self.preJsonDic ks_integerValueForKey:@"accompanyVolume"];
|
|
|
}
|
|
|
- self.accompanyVolume = accompanyVolume;
|
|
|
- self.bgPlayer.volume = accompanyVolume / 100.0;
|
|
|
-
|
|
|
NSInteger originalVolume = 100;
|
|
|
if ([[self.preJsonDic allKeys] containsObject:@"originalVolume"]) {
|
|
|
originalVolume = [self.preJsonDic ks_integerValueForKey:@"originalVolume"];
|
|
|
}
|
|
|
+
|
|
|
+ self.accompanyVolume = accompanyVolume;
|
|
|
self.originalVolume = originalVolume;
|
|
|
- self.recordPlayer.volume = originalVolume / 100.0;
|
|
|
-
|
|
|
+
|
|
|
+ [self.mergePlayer changeVolume:accompanyVolume / 100.0 recordVolume:originalVolume / 100.0];
|
|
|
[self.contrlView configRecordVolume:originalVolume bgVolume:accompanyVolume];
|
|
|
}
|
|
|
|
|
@@ -376,9 +393,7 @@
|
|
|
make.left.mas_equalTo(self.mas_left).offset(10);
|
|
|
make.top.mas_equalTo(self.mas_top).offset(10);
|
|
|
}];
|
|
|
-
|
|
|
- [self refreshTotalTime];
|
|
|
-
|
|
|
+
|
|
|
UILabel *songLabel = [[UILabel alloc] init];
|
|
|
songLabel.font = [UIFont systemFontOfSize:16.0f weight:UIFontWeightSemibold];
|
|
|
songLabel.text = [NSString returnNoNullStringWithString:self.songName];
|
|
@@ -390,23 +405,12 @@
|
|
|
make.height.mas_equalTo(22);
|
|
|
make.right.mas_greaterThanOrEqualTo(self.contrlView.mas_left).offset(20);
|
|
|
}];
|
|
|
-
|
|
|
-// 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)refreshTotalTime {
|
|
|
- float totalTime = [self.recordPlayer getTotalDuration];
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
+ [self.mergePlayer changeRecordDelay:realOffsetTime];
|
|
|
+ float totalTime = [self.mergePlayer getTotalTime] / 1000.0;
|
|
|
[self.playControlView configWithDuration:totalTime];
|
|
|
}
|
|
|
|
|
@@ -457,32 +461,17 @@
|
|
|
}
|
|
|
|
|
|
- (void)startPlay {
|
|
|
- self.bgPlayerRate = 1.0;
|
|
|
+
|
|
|
self.playControlView.isPlay = YES;
|
|
|
self.animationView.isPlay = YES;
|
|
|
- NSInteger recordPlayerPosition = self.playControlView.playScheduleTime*1000;
|
|
|
- [self.recordPlayer seekToTimePlay:recordPlayerPosition];
|
|
|
|
|
|
+ NSInteger playPosition = self.playControlView.playScheduleTime*1000;
|
|
|
NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
- NSInteger offsetTime = recordPlayerPosition + realOffsetTime;
|
|
|
- if (offsetTime >= 0) {
|
|
|
- [self.bgPlayer seekToTimePlay:offsetTime];
|
|
|
- }
|
|
|
- else {
|
|
|
- [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];
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
+ [self.mergePlayer changeRecordDelay:realOffsetTime];
|
|
|
+ [self.mergePlayer seekToTimePlay:playPosition];
|
|
|
|
|
|
if (self.isVideoPlay) {
|
|
|
- [self.videoView seekToTimePlay:recordPlayerPosition];
|
|
|
+ [self.videoView seekToTimePlay:playPosition];
|
|
|
}
|
|
|
else {
|
|
|
[self.playAnimationView startAnimation];
|
|
@@ -493,8 +482,8 @@
|
|
|
- (void)stopPlay {
|
|
|
self.animationView.isPlay = NO;
|
|
|
self.playControlView.isPlay = NO;
|
|
|
- [self.bgPlayer puasePlay];
|
|
|
- [self.recordPlayer puasePlay];
|
|
|
+ [self.mergePlayer stopPlay];
|
|
|
+
|
|
|
if (self.isVideoPlay) {
|
|
|
[self.videoView puasePlay];
|
|
|
}
|
|
@@ -518,33 +507,12 @@
|
|
|
break;
|
|
|
case PLAYERTYPE_RATE:
|
|
|
{
|
|
|
- [self.recordPlayer seekOffsetTime:rate*1000];
|
|
|
-
|
|
|
- NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
- NSInteger offsetTime = rate*1000 + realOffsetTime;
|
|
|
- if (offsetTime >= 0) {
|
|
|
- [self.bgPlayer seekOffsetTime:offsetTime];
|
|
|
- }
|
|
|
- else {
|
|
|
- [self.bgPlayer puasePlay];
|
|
|
- if (self.recordPlayer.isPlaying) {
|
|
|
- [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.mergePlayer.isPlaying) {
|
|
|
+ [self.mergePlayer seekToTimePlay:rate*1000];
|
|
|
}
|
|
|
|
|
|
if (self.isVideoPlay) {
|
|
|
+// NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
[self.videoView seekOffsetTime:rate*1000];
|
|
|
}
|
|
|
}
|
|
@@ -554,20 +522,6 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 对齐播放延迟
|
|
|
-- (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]];
|
|
@@ -601,22 +555,22 @@
|
|
|
self.hasModify = YES;
|
|
|
self.accompanyVolume = bgVolume;
|
|
|
self.originalVolume = recordVolume;
|
|
|
-
|
|
|
- self.bgPlayer.volume = bgVolume / 100.0;
|
|
|
- self.recordPlayer.volume = recordVolume / 100.0;
|
|
|
+ [self.mergePlayer changeVolume:bgVolume / 100.0 recordVolume:recordVolume / 100.0];
|
|
|
}
|
|
|
break;
|
|
|
case MERGEACTION_DELAY: // offset
|
|
|
{
|
|
|
self.hasModify = YES;
|
|
|
- if (self.bgPlayer.isPlaying) {
|
|
|
- CMTime time = [self.recordPlayer getCurrentPlayTime];
|
|
|
- NSInteger newDelayTime = CMTimeGetSeconds(time) * 1000 + offsetTime + self.evaluateDelay;
|
|
|
- [self.recordPlayer seekOffsetTime:CMTimeGetSeconds(time) * 1000];
|
|
|
- [self.bgPlayer seekOffsetTime:newDelayTime];
|
|
|
- }
|
|
|
-
|
|
|
self.offsetTime = offsetTime;
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay;
|
|
|
+ if (self.mergePlayer.isPlaying) { // 调整延迟
|
|
|
+
|
|
|
+ [self.mergePlayer seekOffsetTime:realOffsetTime];
|
|
|
+ }
|
|
|
+ if (self.videoView.isPlaying) {
|
|
|
+// [self.videoView seekOffsetTime:realOffsetTime];
|
|
|
+ }
|
|
|
+ [self refreshTotalTime];
|
|
|
}
|
|
|
break;
|
|
|
case MERGEACTION_SAVE: // 保存
|
|
@@ -821,8 +775,10 @@
|
|
|
CGFloat rate = 1.0/3;
|
|
|
if (self.isVideoPlay) {
|
|
|
[LOADING_MANAGER showProgressLoading:@"视频合成中" progress:0];
|
|
|
- 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) {
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay; // 演奏偏移
|
|
|
+ NSInteger adjustOffset = -realOffsetTime;
|
|
|
+
|
|
|
+ [KSMediaEditor mixVideoWithRecordAudio:self.recordUrl recordVolume:self.mergePlayer.recordVolume bgAudio:self.bgAudioUrl bgAudioVolume:self.mergePlayer.bgVolume offsetTime:adjustOffset rate:1 videoUrlStr:self.videoUrl completion:^(NSString * _Nonnull outPath, BOOL isSuccess, NSString * _Nonnull desc) {
|
|
|
[LOADING_MANAGER showProgressLoading:@"视频合成中" progress:progress];
|
|
|
// 保存文件到指定文件夹
|
|
|
if (isSuccess) {
|
|
@@ -843,8 +799,9 @@
|
|
|
}
|
|
|
else {
|
|
|
[LOADING_MANAGER showProgressLoading:@"音频合成中" progress:0];
|
|
|
- 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) {
|
|
|
+ NSInteger realOffsetTime = self.offsetTime + self.evaluateDelay; // 演奏偏移
|
|
|
+ NSInteger adjustOffset = -realOffsetTime;
|
|
|
+ [KSMediaEditor mixRecordAudio:self.recordUrl recordVolume:self.mergePlayer.recordVolume bgAudio:self.bgAudioUrl bgAudioVolume:self.mergePlayer.bgVolume rate:1 offsetTime:adjustOffset completion:^(NSString * _Nonnull outPath, BOOL isSuccess, NSString * _Nonnull desc) {
|
|
|
// 保存文件到指定文件夹
|
|
|
[LOADING_MANAGER showProgressLoading:@"音频合成中" progress:progress];
|
|
|
|
|
@@ -933,116 +890,31 @@
|
|
|
}
|
|
|
|
|
|
- (void)freePlayer {
|
|
|
- if (_bgPlayer) {
|
|
|
- [self.bgPlayer freePlayer];
|
|
|
- }
|
|
|
- if (_recordPlayer) {
|
|
|
- [self.recordPlayer freePlayer];
|
|
|
+ if (_mergePlayer) {
|
|
|
+ [self.mergePlayer freePlayer];
|
|
|
}
|
|
|
if (_videoView) {
|
|
|
[self.videoView freePlayer];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-- (kSNewPlayer *)bgPlayer {
|
|
|
- if (!_bgPlayer) {
|
|
|
- _bgPlayer = [[kSNewPlayer alloc] init];
|
|
|
- _bgPlayer.delegate = self;
|
|
|
- }
|
|
|
- return _bgPlayer;
|
|
|
-}
|
|
|
-
|
|
|
-- (kSNewPlayer *)recordPlayer {
|
|
|
- if (!_recordPlayer) {
|
|
|
- _recordPlayer = [[kSNewPlayer alloc] init];
|
|
|
- _recordPlayer.delegate = self;
|
|
|
+- (KSMergeEnginePlayer *)mergePlayer {
|
|
|
+ if (!_mergePlayer) {
|
|
|
+ _mergePlayer = [[KSMergeEnginePlayer alloc] init];
|
|
|
+ _mergePlayer.delegate = self;
|
|
|
}
|
|
|
- return _recordPlayer;
|
|
|
+ return _mergePlayer;
|
|
|
}
|
|
|
|
|
|
|
|
|
#pragma mark ----- player delegate
|
|
|
|
|
|
- (void)videoPlayerIsReadyPlay:(AVPlayer *)player {
|
|
|
- if (self.bgPlayer.isReady && self.recordPlayer.isReady) {
|
|
|
+ if (self.mergePlayer.isReady) {
|
|
|
[self startPlay];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-- (void)playerIsReadyPlay:(kSNewPlayer *)player {
|
|
|
- if (player == self.recordPlayer) {
|
|
|
- [self refreshTotalTime];
|
|
|
- }
|
|
|
- if (self.isVideoPlay) {
|
|
|
- if (self.bgPlayer.isReady && self.recordPlayer.isReady && self.videoView.isReady) {
|
|
|
- [self startPlay];
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- 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);
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
- (void)videoPlayerOccurError:(AVPlayer *)player {
|
|
|
NSError *error = player.error;
|
|
@@ -1067,36 +939,59 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#pragma mark ------- merge Player delegate
|
|
|
+- (void)updatePlayProgress:(NSInteger)playTime andTotalTime:(NSInteger)totalTime andProgress:(CGFloat)progress currentInterval:(NSTimeInterval)currentInterval inPlayer:(KSMergeEnginePlayer *)player {
|
|
|
+ /*
|
|
|
+ CMTime videoPlayTime = [self.videoView getCurrentPlayTime];
|
|
|
+ NSTimeInterval videoTime = CMTimeGetSeconds(videoPlayTime) * 1000;
|
|
|
+ NSLog(@"----- offset %f ", playTime - videoTime);
|
|
|
+ */
|
|
|
+ dispatch_main_async_safe(^{
|
|
|
+ self.playControlView.playScheduleTime = (NSInteger)(playTime / 1000);
|
|
|
+ });
|
|
|
+}
|
|
|
|
|
|
-- (void)playFinished:(kSNewPlayer *)player {
|
|
|
- if (player == self.recordPlayer) {
|
|
|
-
|
|
|
- [self.recordPlayer puasePlay];
|
|
|
- [self.recordPlayer seekToStart];
|
|
|
-
|
|
|
- [self.bgPlayer puasePlay];
|
|
|
- [self.bgPlayer seekToStart];
|
|
|
-
|
|
|
+- (void)enginePlayerIsReadyPlay:(KSMergeEnginePlayer *)player {
|
|
|
+ dispatch_main_async_safe(^{
|
|
|
+ [self refreshTotalTime];
|
|
|
+ if (self.isVideoPlay) {
|
|
|
+ if (self.videoView.isReady) {
|
|
|
+ [self startPlay];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ [self startPlay];
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+- (void)enginePlayFinished:(KSMergeEnginePlayer *)player {
|
|
|
+ dispatch_main_async_safe(^{
|
|
|
+ [self.mergePlayer stopPlay];
|
|
|
self.animationView.isPlay = NO;
|
|
|
self.playControlView.isPlay = NO;
|
|
|
[self.playAnimationView stopAnimation];
|
|
|
+
|
|
|
[self stopTimer];
|
|
|
+ self.playControlView.playScheduleTime = 0;
|
|
|
+
|
|
|
if (self.isVideoPlay) {
|
|
|
[self.videoView puasePlay];
|
|
|
[self.videoView seekToStart];
|
|
|
}
|
|
|
- }
|
|
|
+
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
-- (void)playerDidError:(kSNewPlayer *)player {
|
|
|
+- (void)enginePlayerDidError:(KSMergeEnginePlayer *)player error:(NSError *)error {
|
|
|
// 播放出现问题
|
|
|
[self stopPlay];
|
|
|
- NSError *error = player.player.error;
|
|
|
if (error) {
|
|
|
NSLog(@"-- error desc - %@", error.description);
|
|
|
NSMutableDictionary *parm = [NSMutableDictionary dictionary];
|
|
|
[parm setValue:UserDefault(UIDKey) forKey:@"userId"];
|
|
|
- [parm setValue:@"KSMediaMergeViewMp3Player" forKey:@"Location"];
|
|
|
+ [parm setValue:@"KSMergeEnginePlayer" forKey:@"Location"];
|
|
|
[parm setValue:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] forKey:@"version"];
|
|
|
[parm setValue:@(error.code) forKey:@"errorCode"];
|
|
|
[parm setValue:error.description forKey:@"errorDesc"];
|
|
@@ -1111,6 +1006,7 @@
|
|
|
|
|
|
}];
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- (KSVideoPlayerView *)videoView {
|