|
|
@@ -854,8 +854,8 @@ public class LiveServiceImpl implements ILiveService
|
|
|
// 生成唯一的流密钥
|
|
|
String streamKey = "stream_" + live.getLiveId() + "_" + System.currentTimeMillis();
|
|
|
|
|
|
- // 构建FFmpeg推流命令
|
|
|
- String ffmpegCmd = buildFFmpegCommand(curLiveVideo.getVideoUrl(), streamKey);
|
|
|
+ // 构建FFmpeg推流命令(参数列表,避免命令注入)
|
|
|
+ List<String> ffmpegCmd = buildFFmpegCommand(curLiveVideo.getVideoUrl(), streamKey);
|
|
|
|
|
|
// 启动推流进程
|
|
|
Process process = processManager.startProcess(ffmpegCmd);
|
|
|
@@ -1468,14 +1468,30 @@ public class LiveServiceImpl implements ILiveService
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 构建FFmpeg推流命令
|
|
|
+ * 构建FFmpeg推流命令(参数列表形式,路径作为独立参数)
|
|
|
*/
|
|
|
- private String buildFFmpegCommand(String videoPath, String streamKey) {
|
|
|
- return String.format(
|
|
|
- "ffmpeg -re -stream_loop -1 -i \"%s\" -c:v libx264 -preset ultrafast -b:v 1000k " +
|
|
|
- "-c:a aac -b:a 128k -f flv rtmp://your-srs-server/live/%s",
|
|
|
- videoPath, streamKey
|
|
|
- );
|
|
|
+ private List<String> buildFFmpegCommand(String videoPath, String streamKey) {
|
|
|
+ List<String> cmd = new ArrayList<>();
|
|
|
+ cmd.add("ffmpeg");
|
|
|
+ cmd.add("-re");
|
|
|
+ cmd.add("-stream_loop");
|
|
|
+ cmd.add("-1");
|
|
|
+ cmd.add("-i");
|
|
|
+ cmd.add(videoPath);
|
|
|
+ cmd.add("-c:v");
|
|
|
+ cmd.add("libx264");
|
|
|
+ cmd.add("-preset");
|
|
|
+ cmd.add("ultrafast");
|
|
|
+ cmd.add("-b:v");
|
|
|
+ cmd.add("1000k");
|
|
|
+ cmd.add("-c:a");
|
|
|
+ cmd.add("aac");
|
|
|
+ cmd.add("-b:a");
|
|
|
+ cmd.add("128k");
|
|
|
+ cmd.add("-f");
|
|
|
+ cmd.add("flv");
|
|
|
+ cmd.add("rtmp://your-srs-server/live/" + streamKey);
|
|
|
+ return cmd;
|
|
|
}
|
|
|
|
|
|
/**
|