修复工作
This commit is contained in:
@@ -151,10 +151,16 @@ public class FlvHandler extends SimpleChannelInboundHandler<Object> {
|
|||||||
private void sendFlvReqHeader(ChannelHandlerContext ctx) {
|
private void sendFlvReqHeader(ChannelHandlerContext ctx) {
|
||||||
HttpResponse rsp = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
|
HttpResponse rsp = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
|
||||||
|
|
||||||
rsp.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE)
|
rsp.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE)
|
||||||
.set(HttpHeaderNames.CONTENT_TYPE, "video/x-flv").set(HttpHeaderNames.ACCEPT_RANGES, "bytes")
|
.set(HttpHeaderNames.CONTENT_TYPE, "video/x-flv")
|
||||||
.set(HttpHeaderNames.PRAGMA, "no-cache").set(HttpHeaderNames.CACHE_CONTROL, "no-cache")
|
.set(HttpHeaderNames.ACCEPT_RANGES, "bytes")
|
||||||
.set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED).set(HttpHeaderNames.SERVER, MediaConstant.serverName);
|
.set(HttpHeaderNames.PRAGMA, "no-cache")
|
||||||
|
.set(HttpHeaderNames.CACHE_CONTROL, "no-cache")
|
||||||
|
.set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED)
|
||||||
|
.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN, "*")
|
||||||
|
.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, OPTIONS")
|
||||||
|
.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, "*")
|
||||||
|
.set(HttpHeaderNames.SERVER, MediaConstant.serverName);
|
||||||
ctx.writeAndFlush(rsp);
|
ctx.writeAndFlush(rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -201,31 +201,38 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
|||||||
client = tcpServer.accept();
|
client = tcpServer.accept();
|
||||||
DataInputStream input = new DataInputStream(client.getInputStream());
|
DataInputStream input = new DataInputStream(client.getInputStream());
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
byte[] buffer = new byte[4096]; // 增加缓冲区到4KB
|
||||||
int len = 0;
|
int len = 0;
|
||||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
boolean headerSent = false;
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
|
|
||||||
len = input.read(buffer);
|
len = input.read(buffer);
|
||||||
if (len == -1) {
|
if (len == -1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bos.write(buffer, 0, len);
|
// 第一次读取的是FLV header(13字节)
|
||||||
|
if (header == null && len >= 13) {
|
||||||
if (header == null) {
|
header = new byte[13];
|
||||||
header = bos.toByteArray();
|
System.arraycopy(buffer, 0, header, 0, 13);
|
||||||
// System.out.println(HexUtil.encodeHexStr(header));
|
log.debug("FLV header已获取: {} bytes", header.length);
|
||||||
bos.reset();
|
headerSent = true;
|
||||||
|
|
||||||
|
// 如果有剩余数据(包含header+数据),一起发送
|
||||||
|
if (len > 0) {
|
||||||
|
byte[] data = new byte[len];
|
||||||
|
System.arraycopy(buffer, 0, data, 0, len);
|
||||||
|
sendFrameData(data);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 帧数据
|
// 后续直接发送所有读取的数据
|
||||||
byte[] data = bos.toByteArray();
|
if (headerSent) {
|
||||||
bos.reset();
|
byte[] data = new byte[len];
|
||||||
|
System.arraycopy(buffer, 0, data, 0, len);
|
||||||
// 发送到前端
|
sendFrameData(data);
|
||||||
sendFrameData(data);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -236,10 +243,6 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
|
|||||||
input.close();
|
input.close();
|
||||||
} catch (java.lang.Exception e) {
|
} catch (java.lang.Exception e) {
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
bos.close();
|
|
||||||
} catch (java.lang.Exception e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
log.info("关闭媒体流-ffmpeg,{} ", cameraDto.getUrl());
|
log.info("关闭媒体流-ffmpeg,{} ", cameraDto.getUrl());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user