Parcourir la source

优化音频合成播放对齐

Pq il y a 1 an
Parent
commit
b0955bc71f

+ 52 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/bean/MusicMergeConfigBean.java

@@ -0,0 +1,52 @@
+package com.cooleshow.musicmerge.bean;
+
+/**
+ * Author by pq, Date on 2023/11/24.
+ */
+public class MusicMergeConfigBean {
+    private int offset;
+    private int originalVolume;
+    private int accompanyVolume;
+    private int defaultDelay;
+    private int evaluateDelay;
+
+    public int getEvaluateDelay() {
+        return evaluateDelay;
+    }
+
+    public void setEvaluateDelay(int evaluateDelay) {
+        this.evaluateDelay = evaluateDelay;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }
+
+    public int getOriginalVolume() {
+        return originalVolume;
+    }
+
+    public void setOriginalVolume(int originalVolume) {
+        this.originalVolume = originalVolume;
+    }
+
+    public int getAccompanyVolume() {
+        return accompanyVolume;
+    }
+
+    public void setAccompanyVolume(int accompanyVolume) {
+        this.accompanyVolume = accompanyVolume;
+    }
+
+    public int getDefaultDelay() {
+        return defaultDelay;
+    }
+
+    public void setDefaultDelay(int defaultDelay) {
+        this.defaultDelay = defaultDelay;
+    }
+}

+ 3 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/constants/MusicMergeConfig.java

@@ -10,7 +10,10 @@ public class MusicMergeConfig {
     public static final String OFFSET_KEY="offset";
     public static final String ORIGINALVOLUME_KEY="originalVolume";
     public static final String ACCOMPANYVOLUME_KEY="accompanyVolume";
+    public static final String DEFAULTDELAY_KEY = "defaultDelay";
+    public static final String EVALUATEDELAY_KEY = "evaluateDelay";
 
+    public static final String DELAY_FOR_CURRENT_CACHE_KEY = "delayForCurrent";
     public static final int MAX_THUMBNAIL_COUNT = 10;
 
     public static int getMaxWidthForThumbWidth() {

+ 34 - 5
musicMerge/src/main/java/com/cooleshow/musicmerge/player/CustomPlayer.java

@@ -3,6 +3,7 @@ package com.cooleshow.musicmerge.player;
 import android.content.Context;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
+import android.media.PlaybackParams;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
@@ -79,6 +80,7 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
 
     public void setVolume(float volume) {
         if (mPlayer != null) {
+            LOG.i("setVolume:" + volume + "hasPrepared:" + hasPrepared);
             mPlayer.setVolume(volume, volume);
         }
     }
@@ -120,7 +122,7 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return -1;
+        return 0;
     }
 
 
@@ -136,10 +138,9 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
         if (isStoped) {
             return;
         }
-
         // release()会释放player、将player置空,所以这里需要判断一下
         if (null != mPlayer && hasPrepared) {
-            LOG.i(TAG, "expectPosition:" + expectPosition);
+            LOG.i(TAG, "start expectPosition:" + expectPosition);
             if (expectPosition < 0) {
                 sendDelayPlayMsg(Math.abs(expectPosition));
                 return;
@@ -153,6 +154,24 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
 //        }
     }
 
+    public void setSpeed(float speed) {
+        if (speed < 0.5 || speed > 2.0f) {
+            return;
+        }
+        try {
+            if (mPlayer != null) {
+                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
+                    PlaybackParams playbackParams = mPlayer.getPlaybackParams();
+                    LOG.i("pq", "setSpeed:" + speed);
+                    playbackParams.setSpeed(speed);
+                    mPlayer.setPlaybackParams(playbackParams);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     public void pause() {
         if (null != mPlayer && hasPrepared) {
             mPlayer.pause();
@@ -161,7 +180,7 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
 
     public void resume() {
         if (null != mPlayer && hasPrepared) {
-            LOG.i(TAG, "expectPosition:" + expectPosition);
+            LOG.i(TAG, "resume expectPosition:" + expectPosition);
             if (expectPosition < 0) {
                 sendDelayPlayMsg(Math.abs(expectPosition));
                 return;
@@ -180,11 +199,21 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
         this.expectPosition = expectPosition;
     }
 
+    public void resetToPrepare() {
+        if (expectPosition == 0) {
+            seekTo(0);
+        } else {
+            seekTo(expectPosition);
+        }
+    }
+
     public void seekTo(int position) {
         this.expectPosition = position;
+        LOG.i(TAG, "seekTo expectPosition:" + expectPosition);
         if (mPlayer == null) {
             return;
         }
+        mHandler.removeMessages(RESUME_PLAY_MSG_WHAT);
         LOG.i(TAG, "seekTo getTotal:" + getTotal());
         if (position > getTotal()) {
             position = getTotal();
@@ -205,6 +234,7 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
     }
 
     private void sendDelayPlayMsg(int delay) {
+        LOG.i(TAG,"sendDelayPlayMsg:"+delay);
         Message obtain = Message.obtain();
         obtain.what = RESUME_PLAY_MSG_WHAT;
         mHandler.removeMessages(RESUME_PLAY_MSG_WHAT);
@@ -251,7 +281,6 @@ public class CustomPlayer implements MediaPlayer.OnErrorListener, MediaPlayer.On
     public void onPrepared(MediaPlayer mp) {
         hasPrepared = true; // 准备完成后回调到这里
         sendProgressMsg();
-        start();
         if (onEventListener != null) {
             onEventListener.onPrepared(getTotal());
         }

+ 135 - 18
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/MusicHandleActivity.java

@@ -23,12 +23,15 @@ import android.widget.FrameLayout;
 import android.widget.SeekBar;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
 import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.constanst.UploadConstants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.FileUtils;
 import com.cooleshow.base.utils.GlideUtils;
+import com.cooleshow.base.utils.GsonUtils;
+import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.MyFileUtils;
 import com.cooleshow.base.utils.NumberUtils;
@@ -43,6 +46,7 @@ import com.cooleshow.base.widgets.dialog.CommonConfirmDialog2;
 import com.cooleshow.musicmerge.R;
 import com.cooleshow.musicmerge.bean.MusicDataBean;
 import com.cooleshow.musicmerge.bean.MusicInfoBean;
+import com.cooleshow.musicmerge.bean.MusicMergeConfigBean;
 import com.cooleshow.musicmerge.callback.ResultCallback;
 import com.cooleshow.musicmerge.contract.MusicFileHandleContract;
 import com.cooleshow.musicmerge.databinding.AcMusicHandleLayoutBinding;
@@ -69,6 +73,8 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     public static final int REQUEST_CODE_LOCAL = 0x19;
     public static final int REQUEST_CODE_LOCAL_VIDEO_COVER = 0x20;
     public static final int REQUEST_CODE_VIDEO_COVER = 0x29;
+
+    public static final int MAX_ADJUSTMENT = 10;
     private CustomPlayer player1;
     private CustomPlayer player2;
     private String accompanyUrl;
@@ -99,6 +105,10 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     private static final int MAX_PROGRESS = 100;
     private int currentStep = 0;
 
+    private int firstPlayDuration = 0;
+    private int secondPlayDuration = 0;
+    private int defaultDelay = 0;//此字段用于录音文件前面缓冲以及设备延迟造成的空白延迟字段
+    private int evaluateDelay = 0;//此字段记录给IOS使用
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -119,6 +129,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         mSettingFragment = new MusicHandleSettingFragment();
         Bundle bundle = new Bundle();
         bundle.putString("accompanyUrl", accompanyUrl);
+        bundle.putInt("defaultDelay", defaultDelay);
         mSettingFragment.setArguments(bundle);
         getSupportFragmentManager().beginTransaction().replace(R.id.fl_setting, mSettingFragment).commitAllowingStateLoss();
     }
@@ -165,6 +176,8 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         mRecordId = getIntent().getStringExtra("recordId");
         worksId = getIntent().getStringExtra("worksId");
         imgCover = getIntent().getStringExtra("coverImg");
+        defaultDelay = getIntent().getIntExtra("defaultDelay", 0);
+        evaluateDelay = getIntent().getIntExtra("evaluateDelay", 0);
 
         loadCover();
         if (TextUtils.isEmpty(mRecordId)) {
@@ -397,7 +410,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
     }
 
     private void toNotify(String url) {
-        String configJson = mSettingFragment.getConfigJson();
+        String configJson = mSettingFragment.getConfigJson(defaultDelay, evaluateDelay);
         MusicInfoBean value = mViewModel.getMusicInfoLiveData().getValue();
         String videoCover = "";
         String cover = imgCover;
@@ -417,7 +430,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
     private void toNotifyDraft(String url) {
         if (mSettingFragment != null) {
-            String configJson = mSettingFragment.getConfigJson();
+            String configJson = mSettingFragment.getConfigJson(defaultDelay, evaluateDelay);
             presenter.saveDraft(mRecordId, url, accompanyUrl, imgCover, configJson);
         }
     }
@@ -459,8 +472,10 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
-                        LOG.i("progressPercent:" + progressPercent);
-                        toUpdateLoadingText(getCurrentProgress(progressPercent), getString(R.string.video_merge_tip));
+                        if (currentStep == 0) {//这个进度有延迟,可能不准确,如果到了下一个步骤了就不再触发更新
+                            LOG.i("progressPercent:" + progressPercent);
+                            toUpdateLoadingText(getCurrentProgress(progressPercent), getString(R.string.video_merge_tip));
+                        }
                     }
                 });
             }
@@ -518,8 +533,10 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
-                        LOG.i("progressPercent:" + progressPercent);
-                        toUpdateLoadingText(getCurrentProgress(progressPercent), getString(R.string.audio_merge_tip));
+                        if (currentStep == 0) {//这个进度有延迟,可能不准确,如果到了下一个步骤了就不再触发更新
+                            LOG.i("progressPercent:" + progressPercent);
+                            toUpdateLoadingText(getCurrentProgress(progressPercent), getString(R.string.audio_merge_tip));
+                        }
                     }
                 });
             }
@@ -544,7 +561,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         int cu = player1.getCu();
         LOG.i("pq", "cu:" + cu);
         LOG.i("pq", "currentOffsetValue:" + value);
-        int seekResult2 = cu - value;
+        int seekResult2 = countAccompanyPosition(cu);
         LOG.i("pq", "seekResult2:" + seekResult2);
         player2.seekTo(seekResult2);
     }
@@ -554,14 +571,19 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         float percent = progress * 1.0f / viewBinding.seekPlay.getMax();
         int seekResult = (int) (player1.getTotal() * percent);
         LOG.i("pq", "seekResult:" + seekResult);
-        int currentOffsetValue = mSettingFragment.getCurrentOffsetValue();
-        LOG.i("pq", "currentOffsetValue:" + currentOffsetValue);
-        int seekResult2 = seekResult - currentOffsetValue;
+        int seekResult2 = countAccompanyPosition(seekResult);
         LOG.i("pq", "seekResult2:" + seekResult2);
         player1.seekTo(seekResult);
         player2.seekTo(seekResult2);
     }
 
+    private int countAccompanyPosition(int recordPosition) {
+        int currentOffsetValue = mSettingFragment.getCurrentOffsetValue();
+        LOG.i("pq", "currentOffsetValue:" + currentOffsetValue);
+        int exceptPosition = recordPosition + currentOffsetValue;
+        return exceptPosition;
+    }
+
     private void initPlayer() {
         player1 = new CustomPlayer("luzhi");
         player2 = new CustomPlayer("伴奏");
@@ -571,6 +593,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
                 if (!checkActivityExist()) {
                     return;
                 }
+                toShowDelay();
                 String s = TimeUtils.msToTime(progress);
                 viewBinding.tvCurrentProgress.setText(s);
                 int maxProgress = viewBinding.seekPlay.getMax();
@@ -583,10 +606,10 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
                 if (!checkActivityExist()) {
                     return;
                 }
+                firstPlayDuration = duration;
                 String s = TimeUtils.msToTime(duration);
                 viewBinding.tvTotalProgress.setText(s);
-                setVolume();
-                updatePlayStatus();
+                toRealPlay();
             }
 
             @Override
@@ -626,8 +649,10 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
 
             @Override
             public void onPrepared(int duration) {
+                secondPlayDuration = duration;
                 String s = TimeUtils.msToTime(duration);
                 viewBinding.tvTotalProgress2.setText(s);
+                toRealPlay();
             }
 
             @Override
@@ -647,6 +672,46 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         });
     }
 
+    private void toShowDelay() {
+        int cu = player1.getCu();
+        int cu1 = player2.getCu();
+        int dif = cu1 - cu;
+        String text = "演奏进度:" + cu + "\n伴奏进度:" + cu1 + "\n差值:" + dif;
+        viewBinding.tvDelayText.setText(text);
+        if (!player1.isPlaying()) {
+            return;
+        }
+        LOG.i("pq", "dif:" + dif);
+
+        int expectDelay = dif - mSettingFragment.getCurrentOffsetValue();
+        LOG.i("pq", "expectDelay:" + expectDelay);
+        int difAbs = Math.abs(expectDelay);
+        if (difAbs > MAX_ADJUSTMENT) {
+            float s = difAbs / 1000f;
+            if (expectDelay > 0) {
+                player1.setSpeed(1.0f + s);
+                player2.setSpeed(1.0f - s);
+            } else {
+                player1.setSpeed(1.0f - s);
+                player2.setSpeed(1.0f + s);
+            }
+        } else {
+            player1.setSpeed(1.0f);
+            player2.setSpeed(1.0f);
+        }
+    }
+
+    private void toRealPlay() {
+        if (firstPlayDuration != 0 && secondPlayDuration != 0) {
+            player1.resetToPrepare();
+            player2.resetToPrepare();
+            player1.start();
+            player2.start();
+            setVolume();
+            updatePlayStatus();
+        }
+    }
+
     private void setVolume() {
         if (mSettingFragment != null) {
             float originalVolume = mSettingFragment.getOriginalVolume();
@@ -867,13 +932,12 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         int id = v.getId();
         if (id == R.id.iv_play) {
             if (player1.isPlaying()) {
-                player1.pause();
-                player2.pause();
+                pausePlay();
             } else {
                 player1.resume();
                 player2.resume();
+                updatePlayStatus();
             }
-            updatePlayStatus();
             return;
         }
         if (id == R.id.iv_unfold_sentting) {
@@ -896,6 +960,8 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         if (player1.isPlaying()) {
             player1.pause();
             player2.pause();
+            //暂停的时候需要校准一次,防止定时器触发
+            aligningAccompany(mSettingFragment.getCurrentOffsetValue());
         }
         updatePlayStatus();
     }
@@ -1055,7 +1121,7 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
             accompanyUrl = data.getAccompanyUrl();
             if (mSettingFragment != null) {
                 if (!TextUtils.isEmpty(jsonConfig)) {
-                    mSettingFragment.applyConfig(jsonConfig);
+                    toApplyConfig(jsonConfig);
                 }
                 mSettingFragment.setAccompanyUrl(accompanyUrl);
             }
@@ -1071,6 +1137,17 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
         }
     }
 
+    private void toApplyConfig(String jsonConfig) {
+        try {
+            MusicMergeConfigBean musicMergeConfigBean = GsonUtils.fromJson(jsonConfig, MusicMergeConfigBean.class);
+            defaultDelay = musicMergeConfigBean.getDefaultDelay();
+            evaluateDelay = musicMergeConfigBean.getEvaluateDelay();
+            mSettingFragment.applyConfig(musicMergeConfigBean);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     @Override
     public void saveWorksDraftSuccess() {
         if (!checkActivityExist()) {
@@ -1085,12 +1162,52 @@ public class MusicHandleActivity extends BaseMVPActivity<AcMusicHandleLayoutBind
             mHandler.postDelayed(new Runnable() {
                 @Override
                 public void run() {
-                    hideLoading();
+                    if (isNeedTip()) {
+                        showOtherTipDialog();
+                    }
                 }
-            }, 1500);
+            }, 500);
         }
     }
 
+    private boolean isNeedTip() {
+        //云教练进来的需要提示 作品草稿过来的不需要
+        return TextUtils.isEmpty(worksId);
+    }
+
+    private void showOtherTipDialog() {
+        CommonConfirmDialog2 commonConfirmDialog = new CommonConfirmDialog2(this);
+        commonConfirmDialog.setWidth(SizeUtils.dp2px(387));
+        commonConfirmDialog.show();
+        commonConfirmDialog.setTitle("提示");
+        commonConfirmDialog.setContent("已成功保存到草稿,草稿7天未发布\n将自动清理。");
+        commonConfirmDialog.setCancelText("确认");
+        commonConfirmDialog.setConfirmText("查看草稿");
+        commonConfirmDialog.setOnCancelClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                commonConfirmDialog.dismiss();
+            }
+        });
+        commonConfirmDialog.setOnConfirmClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                commonConfirmDialog.dismiss();
+                //从首页个人中心跳转我的作品
+                JumpUtils.jumpMain(4);
+                goMyWorks();
+            }
+        });
+
+    }
+
+    private void goMyWorks() {
+        ARouter.getInstance().build(RouterPath.Homework.MY_WORK)
+                .withInt(Constants.MAIN_PAGE_SELECT_POTION_KEY, 1)
+                .navigation();
+        finish();
+    }
+
     private void showToastViewAndFinish(String tip, boolean isReCallBack) {
         //测试lyr提出提示要在当前面提示,所以给出延迟finish
 //        viewBinding.tvToastView.setText(tip);

+ 27 - 12
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/MusicHandleSettingFragment.java

@@ -15,6 +15,7 @@ import com.alibaba.android.arouter.launcher.ARouter;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.fragment.BaseFragment;
 import com.cooleshow.base.utils.FileUtils;
+import com.cooleshow.base.utils.LOG;
 import com.cooleshow.base.utils.MyFileUtils;
 import com.cooleshow.base.utils.PermissionUtils;
 import com.cooleshow.base.utils.ThreadUtils;
@@ -22,11 +23,13 @@ import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.helper.GlideEngine;
 import com.cooleshow.base.widgets.DialogUtil;
 import com.cooleshow.musicmerge.R;
+import com.cooleshow.musicmerge.bean.MusicMergeConfigBean;
 import com.cooleshow.musicmerge.constants.MusicMergeConfig;
 import com.cooleshow.musicmerge.databinding.FgMusicHandleSettingLayoutBinding;
 import com.cooleshow.musicmerge.helper.MixHelper;
 import com.cooleshow.musicmerge.viewmodel.MusicMergeViewModel;
 import com.cooleshow.musicmerge.widget.UploadCoverTipDialog;
+import com.cooleshow.usercenter.helper.UserHelper;
 import com.luck.picture.lib.PictureSelector;
 import com.luck.picture.lib.config.PictureConfig;
 import com.luck.picture.lib.config.PictureMimeType;
@@ -43,7 +46,7 @@ import androidx.lifecycle.ViewModelProvider;
  */
 public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettingLayoutBinding> implements View.OnClickListener {
     public static final int MAX_OFFSET_SECTION = 1200;
-    public static final int MIN_OFFSET_SECTION = MAX_OFFSET_SECTION / 2 / 6 / 5;//这里算出来要是10的整数倍
+    public static final int MIN_OFFSET_SECTION = MAX_OFFSET_SECTION / 2 / 6 / 10;//最好是10的整数倍
     public static final int ACCOMPANY_TYPE = 1;
     public static final int RECORD_TYPE = 2;
     private String accompanyUrl;
@@ -51,6 +54,9 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
 
     private OnEventListener mEventListener;
     private MusicMergeViewModel mViewModel;
+    private int defaultDelay = 0;
+    private int evaluateDelay = 0;
+
 
     private Runnable mRunnable = new Runnable() {
         @Override
@@ -85,8 +91,10 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
     @Override
     protected void initData() {
         accompanyUrl = getArguments().getString("accompanyUrl");
+        defaultDelay = getArguments().getInt("defaultDelay", 0);
         initViewModel();
         initListener();
+        formatProgress();
     }
 
     private void initViewModel() {
@@ -363,7 +371,7 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
     }
 
     private void toMix(boolean isNeedNotify) {
-        int i = getOffsetValue();
+        int i = -getCurrentOffsetValue();//取负值是因为合成的时候需要针对伴奏文件做处理
         float recordFileVolume = getSeekVolume();
         float accompanyFileVolume = getAccompanySeekVolume();
         if (mEventListener != null) {
@@ -374,9 +382,9 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
     private int formatProgress() {
         int lastValue = getOffsetValue();
         if (lastValue > 0) {
-            mViewBinding.tvOffsetResult.setText("已为您对齐演奏伴奏,演奏提前" + lastValue + "毫秒");
+            mViewBinding.tvOffsetResult.setText("已为您对齐演奏伴奏,演奏延后" + lastValue + "毫秒");
         } else if (lastValue < 0) {
-            mViewBinding.tvOffsetResult.setText("已为您对齐演奏伴奏,演奏延后" + Math.abs(lastValue) + "毫秒");
+            mViewBinding.tvOffsetResult.setText("已为您对齐演奏伴奏,演奏提前" + Math.abs(lastValue) + "毫秒");
         } else {
             mViewBinding.tvOffsetResult.setText("演奏伴奏没有对齐?试试调整这里");
         }
@@ -411,7 +419,8 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
     }
 
     public int getCurrentOffsetValue() {
-        return getOffsetValue();
+        LOG.i("pq","getCurrentOffsetValue:"+getOffsetValue()+"--defaultDelay:"+defaultDelay);
+        return getOffsetValue() + defaultDelay;
     }
 
     public float getOriginalVolume() {
@@ -424,14 +433,14 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
         return value;
     }
 
-    public String getConfigJson() {
+    public String getConfigJson(int defaultDelay,int evaluateDelay) {
         if (isDetached()) {
             return "";
         }
         if (!isAdded()) {
             return "";
         }
-        int currentOffsetValue = getCurrentOffsetValue();
+        int currentOffsetValue = getOffsetValue();
         int originalVolume = mViewBinding.seekVolume.getProgress();
         int accompanyVolume = mViewBinding.seekVolume2.getProgress();
         JSONObject jsonObject = new JSONObject();
@@ -439,6 +448,8 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
             jsonObject.put(MusicMergeConfig.OFFSET_KEY, currentOffsetValue);
             jsonObject.put(MusicMergeConfig.ORIGINALVOLUME_KEY, originalVolume);
             jsonObject.put(MusicMergeConfig.ACCOMPANYVOLUME_KEY, accompanyVolume);
+            jsonObject.put(MusicMergeConfig.DEFAULTDELAY_KEY, defaultDelay);
+            jsonObject.put(MusicMergeConfig.EVALUATEDELAY_KEY, evaluateDelay);
             return jsonObject.toString();
         } catch (JSONException e) {
             e.printStackTrace();
@@ -450,14 +461,18 @@ public class MusicHandleSettingFragment extends BaseFragment<FgMusicHandleSettin
         mEventListener = eventListener;
     }
 
-    public void applyConfig(String jsonConfig) {
+    public void applyConfig(MusicMergeConfigBean configBean) {
         try {
-            JSONObject jsonObject = new JSONObject(jsonConfig);
-            int offset = jsonObject.optInt(MusicMergeConfig.OFFSET_KEY, 0);
-            int originalVolume = jsonObject.optInt(MusicMergeConfig.ORIGINALVOLUME_KEY, 100);
-            int accompanyVolume = jsonObject.optInt(MusicMergeConfig.ACCOMPANYVOLUME_KEY, 100);
+            this.defaultDelay = configBean.getDefaultDelay();
+            this.evaluateDelay = configBean.getEvaluateDelay();
+            int offset = configBean.getOffset();
+            int originalVolume = configBean.getOriginalVolume();
+            int accompanyVolume = configBean.getAccompanyVolume();
             int progressFromOffsetValue = getProgressFromOffsetValue(offset);
             mViewBinding.seekBarOffset.setProgress(progressFromOffsetValue);
+            if(offset == 0){
+                formatProgress();//当前seekbar进度为0不会触发onProgressChanged,所以手动触发
+            }
             mViewBinding.seekVolume.setProgress(originalVolume);
             mViewBinding.seekVolume2.setProgress(accompanyVolume);
 

+ 8 - 0
musicMerge/src/main/java/com/cooleshow/musicmerge/ui/work/MyWorkActivity.java

@@ -7,6 +7,7 @@ import android.view.View;
 import android.widget.TextView;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.Utils;
@@ -34,6 +35,8 @@ public class MyWorkActivity extends BaseMVPActivity<AcMyWorkLayoutBinding, MyWor
     private MyWorkPublishFragment mPublishFragment;
     private MyWorkDraftFragment mDraftFragment;
 
+    private int mSelectPosition;
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -49,6 +52,7 @@ public class MyWorkActivity extends BaseMVPActivity<AcMyWorkLayoutBinding, MyWor
     @Override
     public void initData() {
         super.initData();
+        mSelectPosition = getIntent().getIntExtra(Constants.MAIN_PAGE_SELECT_POTION_KEY, 0);
         initListener();
         TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(viewBinding.tabLayout, viewBinding.viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
             @Override
@@ -65,6 +69,10 @@ public class MyWorkActivity extends BaseMVPActivity<AcMyWorkLayoutBinding, MyWor
         workPagerAdapter.setData(fragments);
         viewBinding.viewPager.setAdapter(workPagerAdapter);
         tabLayoutMediator.attach();
+
+        if (mSelectPosition != 0 && mSelectPosition < fragments.size()) {
+            viewBinding.viewPager.setCurrentItem(mSelectPosition, false);
+        }
     }
 
     private void initListener() {

BIN
musicMerge/src/main/res/drawable-xhdpi/bg_offset_progress.png


BIN
musicMerge/src/main/res/drawable-xxhdpi/bg_offset_progress.png


+ 8 - 0
musicMerge/src/main/res/layout/ac_music_handle_layout.xml

@@ -334,4 +334,12 @@
         android:background="@drawable/shape_toast"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
+
+    <TextView
+        android:visibility="visible"
+        android:id="@+id/tv_delay_text"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_20"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 7 - 7
musicMerge/src/main/res/layout/fg_music_handle_setting_layout.xml

@@ -157,7 +157,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="20dp"
-        android:text="奏对齐"
+        android:text="奏对齐"
         android:textColor="@color/color_131415"
         android:textSize="@dimen/sp_14"
         app:layout_constraintLeft_toLeftOf="@+id/tv_title2"
@@ -186,8 +186,8 @@
         android:layout_marginEnd="6dp"
         android:layout_marginStart="6dp"
         android:adjustViewBounds="true"
-        android:paddingStart="10.5px"
-        android:paddingEnd="10.5px"
+        android:paddingStart="10.25px"
+        android:paddingEnd="10.25px"
         android:src="@drawable/bg_offset_progress"
         app:layout_constraintBottom_toBottomOf="@+id/iv_reduce"
         app:layout_constraintTop_toTopOf="@+id/iv_reduce"
@@ -208,11 +208,11 @@
         android:background="@null"
         android:maxHeight="4dp"
         android:progress="300"
-        android:paddingStart="10.5px"
-        android:paddingEnd="10.5px"
+        android:paddingStart="10.25px"
+        android:paddingEnd="10.25px"
         android:progressDrawable="@color/transparent"
         android:splitTrack="false"
-        android:thumbOffset="10.5px"
+        android:thumbOffset="10.25px"
         android:thumb="@drawable/icon_offset_seekbar_thumb"
         android:visibility="visible" />
 
@@ -254,7 +254,7 @@
         android:layout_marginBottom="14dp"
         android:textSize="@dimen/sp_10"
         android:textColor="@color/color_777777"
-        android:text="保存"
+        android:text="保存草稿"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         android:drawableTop="@drawable/icon_save"