1:修改点唱房的bug

2:添加公会消息类型
This commit is contained in:
2025-11-22 16:06:32 +08:00
parent 18b1235a80
commit 5eac6d302c
18 changed files with 414 additions and 93 deletions

View File

@@ -374,7 +374,7 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
}
// 检查录音时长是否达到最小要求60秒
if (recordingDuration < 5 * 1000) {
if (recordingDuration < 60 * 1000) {
Toast.makeText(this, "录音时间太短请至少录制60秒", Toast.LENGTH_SHORT).show();
return;
}
@@ -432,7 +432,6 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
}
}
// 停止播放
private void stopPlaying() {
try {
if (mediaPlayer != null) {
@@ -458,6 +457,7 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
updateUI();
}
}
// 停止播放
// 重新录音
private void reRecord() {
@@ -500,11 +500,20 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
// 提交认证
private void submitVerification() {
// 如果有多个录音片段,先处理它们
// 如果有多个录音片段,先合并它们
if (recordingSegments.size() > 1) {
mergeAudioFiles();
// 如果还没有合并文件,先进行合并
if (mergedRecordingFile == null || !mergedRecordingFile.exists()) {
Log.d("SingerVerification", "提交前合并音频片段,共 " + recordingSegments.size() + " 个片段");
mergeAudioFiles();
} else {
Log.d("SingerVerification", "使用已合并的音频文件: " + mergedRecordingFile.getAbsolutePath());
recordingFile = mergedRecordingFile;
}
} else if (recordingSegments.size() == 1) {
// 只有一个片段,直接使用
recordingFile = recordingSegments.get(0);
Log.d("SingerVerification", "使用单个录音片段: " + recordingFile.getAbsolutePath());
}
if (recordingFile == null || !recordingFile.exists()) {
@@ -513,11 +522,13 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
}
// 检查录音时长是否达到最小要求60秒
if (recordingDuration < 5 * 1000) {
if (recordingDuration < 60 * 1000) {
Toast.makeText(this, "录音时间太短请至少录制60秒", Toast.LENGTH_SHORT).show();
return;
}
Log.d("SingerVerification", "提交认证,使用文件: " + recordingFile.getAbsolutePath() +
", 大小: " + recordingFile.length() + " bytes");
MvpPre.uploadFile(recordingFile, 3);
}
@@ -621,7 +632,11 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
handleMergeError(e);
} finally {
cleanupResources(muxer, buffer);
cleanupSegments(processedSegments);
// 修复:延迟删除原始音频片段,确保合并文件已经完全写入且被使用
// 延迟删除,给用户足够时间试听
new Handler().postDelayed(() -> {
cleanupSegments(processedSegments);
}, 30000); // 延迟30秒删除确保用户有足够时间试听
}
}
@@ -646,6 +661,8 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
ByteBuffer buffer, MediaCodec.BufferInfo bufferInfo, long baseTimeUs) throws IOException {
MediaExtractor extractor = new MediaExtractor();
long actualDuration = 0;
long firstSampleTime = Long.MAX_VALUE;
long lastSampleTime = 0;
try {
extractor.setDataSource(segment.getAbsolutePath());
@@ -661,9 +678,18 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
Log.d("SingerVerification", "处理片段: " + segment.getAbsolutePath() +
", 估计时长: " + estimatedDuration + "us, 基准时间: " + baseTimeUs + "us");
long maxSampleTime = 0;
int sampleCount = 0;
// 先读取第一个样本的时间戳,作为片段的起始时间
extractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC);
long firstFrameTime = extractor.getSampleTime();
if (firstFrameTime == -1) {
firstFrameTime = 0;
}
// 重置到文件开头
extractor.seekTo(0, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
while (true) {
int sampleSize = extractor.readSampleData(buffer, 0);
if (sampleSize < 0) {
@@ -672,18 +698,23 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
long sampleTime = extractor.getSampleTime();
if (sampleTime == -1) {
// 如果没有时间戳,使用估计值(不推荐)
// 如果没有时间戳,使用估计值
sampleTime = sampleCount * 1000000 / 44100; // 假设44.1kHz
}
// 记录最大样本时间作为实际持续时间
if (sampleTime > maxSampleTime) {
maxSampleTime = sampleTime;
// 记录第一个和最后一个样本时间
if (firstSampleTime == Long.MAX_VALUE) {
firstSampleTime = sampleTime;
}
lastSampleTime = sampleTime;
// 重新计算时间戳确保每个片段从baseTimeUs开始
// 使用相对时间戳(相对于片段的第一个样本)
long relativeTime = sampleTime - firstFrameTime;
bufferInfo.offset = 0;
bufferInfo.size = sampleSize;
bufferInfo.presentationTimeUs = baseTimeUs + sampleTime;
bufferInfo.presentationTimeUs = baseTimeUs + relativeTime;
bufferInfo.flags = extractor.getSampleFlags();
// 确保时间戳是递增的
@@ -696,10 +727,13 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
sampleCount++;
}
// 修复:使用实际的最大样本时间 + 最后一个样本的持续时间估计
if (maxSampleTime > 0) {
// 添加最后一个样本的估计持续时间假设20ms
actualDuration = maxSampleTime + 20000;
// 计算实际持续时间
if (lastSampleTime > firstSampleTime && firstSampleTime != Long.MAX_VALUE) {
// 使用实际的样本时间差
actualDuration = lastSampleTime - firstSampleTime + 20000; // 添加最后一个样本的估计持续时间
} else if (sampleCount > 0) {
// 如果没有有效的时间戳,使用样本数量估算
actualDuration = sampleCount * 1000000 / 44100; // 假设44.1kHz
} else {
// 如果没有样本,使用格式的估计值
actualDuration = estimatedDuration;
@@ -729,6 +763,7 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
if (mergedRecordingFile != null && mergedRecordingFile.exists() && mergedRecordingFile.length() > 0) {
recordingFile = mergedRecordingFile;
Log.d("SingerVerification", "音频文件合并完成,文件大小: " + mergedRecordingFile.length() + " bytes");
Log.d("SingerVerification", "设置当前播放文件为合并文件: " + mergedRecordingFile.getAbsolutePath());
} else {
Log.e("SingerVerification", "合并文件不存在或为空,使用第一个录音片段");
if (!recordingSegments.isEmpty()) {
@@ -736,8 +771,9 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
}
}
// 清理录音片段列表
recordingSegments.clear();
// 修复:不立即清空录音片段列表,延迟清空以确保合并文件可以被正确使用
// 将在延迟删除片段时清空列表
Log.d("SingerVerification", "保留录音片段列表,将在延迟删除时清空");
}
private void handleMergeError(Exception e) {
@@ -760,7 +796,7 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
}
private void cleanupSegments(List<File> segments) {
// 延迟删除片段,确保合并文件已经完全写入
// 延迟删除片段,确保合并文件已经完全写入且被使用
new Handler().postDelayed(() -> {
for (File segment : segments) {
try {
@@ -776,6 +812,10 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
Log.e("SingerVerification", "删除音频片段失败: " + segment.getAbsolutePath(), e);
}
}
// 修复:删除所有片段后,清空录音片段列表
recordingSegments.clear();
Log.d("SingerVerification", "已清空录音片段列表");
}, 2000); // 延迟2秒删除确保合并文件已经完全写入
}
@@ -813,7 +853,8 @@ public class SingerVerificationActivity extends BaseMvpActivity<SingerVerificati
@Override
public void singerAuth(String s) {
reRecord();
finish();
mBinding.clCorner.setVisibility(GONE);
mBinding.cornerStatus.setText("认证中");
}
@Override

View File

@@ -43,6 +43,15 @@ public class UserPlaylistActivity extends BaseMvpActivity<SingerVerificationPres
//新增歌单
// 在Activity或Fragment中调用
CustomInputDialog customInputDialog = new CustomInputDialog(UserPlaylistActivity.this);
customInputDialog.setOnDialogDismissListener(new CustomInputDialog.OnDialogDismissListener() {
@Override
public void onDialogDismiss(boolean dataChanged) {
if (dataChanged)
// 数据已更改,重新加载数据
page = 1;
MvpPre.getSong(SpUtil.getUserId() + "", "", page + "", "10");
}
});
customInputDialog.show();
}
});
@@ -67,7 +76,7 @@ public class UserPlaylistActivity extends BaseMvpActivity<SingerVerificationPres
if (dataChanged)
// 数据已更改,重新加载数据
page = 1;
MvpPre.getSong(SpUtil.getUserId() + "", "", page + "", "10");
MvpPre.getSong(SpUtil.getUserId() + "", "", page + "", "10");
}
});
customInputDialog.show();