修复工作
This commit is contained in:
@@ -85,6 +85,7 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
||||
public MediaTransferFlvByFFmpeg(CameraDto cameraDto) {
|
||||
command.add(System.getProperty(MediaConstant.ffmpegPathKey));
|
||||
this.cameraDto = cameraDto;
|
||||
this.enableLog = true; // 临时启用日志,用于调试
|
||||
buildCommand();
|
||||
}
|
||||
|
||||
@@ -176,15 +177,21 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
||||
command.add(output);
|
||||
|
||||
String join = CollUtil.join(command, " ");
|
||||
log.info("========== FFmpeg 命令 ==========");
|
||||
log.info(join);
|
||||
log.info("RTSP URL: {}", cameraDto.getUrl());
|
||||
log.info("输出地址: {}", output);
|
||||
log.info("=================================");
|
||||
try {
|
||||
process = new ProcessBuilder(command).start();
|
||||
running = true;
|
||||
log.info("✅ FFmpeg 进程已启动,等待数据...");
|
||||
listenNetTimeout();
|
||||
dealStream(process);
|
||||
outputData();
|
||||
listenClient();
|
||||
} catch (IOException e) {
|
||||
log.error("❌ FFmpeg 启动失败: {}", e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
return this;
|
||||
@@ -215,13 +222,15 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
||||
if (header == null && len >= 13) {
|
||||
header = new byte[13];
|
||||
System.arraycopy(buffer, 0, header, 0, 13);
|
||||
log.debug("FLV header已获取: {} bytes", header.length);
|
||||
log.info("✅ FLV header已获取: {} bytes", header.length);
|
||||
headerSent = true;
|
||||
|
||||
// 如果有剩余数据(包含header+数据),一起发送
|
||||
if (len > 0) {
|
||||
byte[] data = new byte[len];
|
||||
System.arraycopy(buffer, 0, data, 0, len);
|
||||
log.info("📤 发送第一批数据: {} bytes,客户端数量: HTTP={}, WS={}",
|
||||
len, httpClients.size(), wsClients.size());
|
||||
sendFrameData(data);
|
||||
}
|
||||
continue;
|
||||
@@ -384,7 +393,12 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
||||
break;
|
||||
}
|
||||
if (enableLog) {
|
||||
log.info("err: " + line);
|
||||
log.info("[FFmpeg] " + line);
|
||||
}
|
||||
// 即使不启用日志,也输出关键错误信息
|
||||
if (!enableLog && (line.contains("error") || line.contains("failed") ||
|
||||
line.contains("Connection") || line.contains("timeout"))) {
|
||||
log.error("[FFmpeg Error] " + line);
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -536,14 +550,17 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
||||
* @param ctype enum,ClientType
|
||||
*/
|
||||
public void addClient(ChannelHandlerContext ctx, ClientType ctype) {
|
||||
log.info("🔗 新客户端连接: 类型={}, Channel={}", ctype, ctx.channel().remoteAddress());
|
||||
int timeout = 0;
|
||||
while (true) {
|
||||
try {
|
||||
if (header != null) {
|
||||
log.info("✅ FLV header 已就绪,准备发送给客户端");
|
||||
try {
|
||||
if (ctx.channel().isWritable()) {
|
||||
// 发送帧前先发送header
|
||||
if (ClientType.HTTP == ctype) {
|
||||
log.info("📤 发送 FLV header 到 HTTP 客户端: {} bytes", header.length);
|
||||
ChannelFuture future = ctx.writeAndFlush(Unpooled.copiedBuffer(header));
|
||||
future.addListener(new GenericFutureListener<Future<? super Void>>() {
|
||||
@Override
|
||||
@@ -574,10 +591,18 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
||||
}
|
||||
|
||||
// 等待推拉流启动
|
||||
if (timeout == 0) {
|
||||
log.info("⏳ 等待 FLV header...");
|
||||
}
|
||||
Thread.sleep(50);
|
||||
// 启动录制器失败
|
||||
timeout += 50;
|
||||
if (timeout % 5000 == 0) {
|
||||
log.warn("⚠️ 等待 FLV header 超时: {} ms,可能 FFmpeg 拉流失败", timeout);
|
||||
}
|
||||
if (timeout > 30000) {
|
||||
log.error("❌ 等待 FLV header 超时 30 秒,放弃连接");
|
||||
|
||||
break;
|
||||
}
|
||||
} catch (java.lang.Exception e) {
|
||||
|
||||
Reference in New Issue
Block a user