要在Android中使用FFmpeg合并两个音频文件,可以使用以下代码示例来解决问题。首先,请确保已在项目中正确配置了FFmpeg。
import android.os.AsyncTask;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MergeAudioTask extends AsyncTask {
private static final String TAG = "MergeAudioTask";
private String[] inputPaths;
private String outputPath;
private MergeAudioListener listener;
public MergeAudioTask(String[] inputPaths, String outputPath, MergeAudioListener listener) {
this.inputPaths = inputPaths;
this.outputPath = outputPath;
this.listener = listener;
}
@Override
protected Boolean doInBackground(Void... voids) {
Process process = null;
try {
String cmd = "ffmpeg -i concat:";
for (String path : inputPaths) {
cmd += path + "|";
}
cmd = cmd.substring(0, cmd.length() - 1); // Remove last pipe character
cmd += " -c copy " + outputPath;
process = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
while ((line = reader.readLine()) != null) {
Log.e(TAG, "FFmpeg error: " + line);
}
int exitCode = process.waitFor();
return exitCode == 0;
} catch (IOException | InterruptedException e) {
e.printStackTrace();
} finally {
if (process != null) {
process.destroy();
}
}
return false;
}
@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
if (success) {
listener.onMergeSuccess(outputPath);
} else {
listener.onMergeFailure();
}
}
public interface MergeAudioListener {
void onMergeSuccess(String mergedFilePath);
void onMergeFailure();
}
}
然后,在您的Activity或Fragment中使用以下代码来调用合并音频文件的任务:
String[] inputPaths = {"path/to/audio1.wav", "path/to/audio2.wav"};
String outputPath = "path/to/output.wav";
MergeAudioTask mergeAudioTask = new MergeAudioTask(inputPaths, outputPath, new MergeAudioTask.MergeAudioListener() {
@Override
public void onMergeSuccess(String mergedFilePath) {
// 合并成功
// 可在此处执行相关操作,例如播放合并后的音频文件
}
@Override
public void onMergeFailure() {
// 合并失败
// 可在此处执行相关操作,例如显示错误信息
}
});
mergeAudioTask.execute();
这样,当任务完成时,将根据成功或失败调用相应的回调方法。