1:修改点唱房的bug
2:添加公会消息类型
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user