This commit is contained in:
shikong 2023-09-06 13:13:20 +08:00
parent 4eb9b9cdd7
commit 16d5bb3ba7

View File

@ -5,7 +5,6 @@ import cn.hutool.core.util.IdUtil;
import cn.skcks.docking.gb28181.media.config.ZlmMediaConfig; import cn.skcks.docking.gb28181.media.config.ZlmMediaConfig;
import cn.skcks.docking.gb28181.wvp.config.SwaggerConfig; import cn.skcks.docking.gb28181.wvp.config.SwaggerConfig;
import cn.skcks.docking.gb28181.wvp.proxy.ZlmProxyClient; import cn.skcks.docking.gb28181.wvp.proxy.ZlmProxyClient;
import feign.Response;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -22,10 +21,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import java.io.File; import java.io.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path; import java.nio.file.Path;
import static org.bytedeco.ffmpeg.global.avutil.AVMEDIA_TYPE_VIDEO; import static org.bytedeco.ffmpeg.global.avutil.AVMEDIA_TYPE_VIDEO;
@ -49,44 +45,32 @@ public class VideoController {
@ResponseBody @ResponseBody
public void video(HttpServletResponse response) throws IOException { public void video(HttpServletResponse response) throws IOException {
response.reset(); response.reset();
// response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setContentType("video/mp4"); response.setContentType("video/mp4");
// File f = new File("E:\\#Camera\\DCIM\\100MEDIA\\20230818\\NORM0003.MP4");
// try (
// BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(f));
// BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) {
// IoUtil.copy(inputStream, outputStream);
// }
// try{ Path tmp = Path.of(System.getProperty("java.io.tmpdir"), IdUtil.getSnowflakeNextIdStr()).toAbsolutePath();
Path tmp = Path.of(System.getProperty("java.io.tmpdir"),IdUtil.getSnowflakeNextIdStr()).toAbsolutePath(); File file = new File(tmp + ".mp4");
File file = new File(tmp +".mp4"); log.info("创建文件 {}, {}", file, file.createNewFile());
log.info("创建文件 {}, {}",file, file.createNewFile());
try (Response live = zlmProxyClient.live("live", "test.live.mp4")) {
FFmpegLogCallback.set();
// live.body()
// FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(live.body().asInputStream());
String url = StringUtils.joinWith("/",config.getUrl(), "live","test.live.mp4"); String url = StringUtils.joinWith("/", config.getUrl(), "live", "test.live.mp4");
log.info("url {}",url); log.info("url {}", url);
try (
try(
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url); FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url);
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file,1920,1080,0) FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(file, 1920, 1080, 0)
){ ) {
grabber.start(); grabber.start();
recorder.start(); recorder.start();
log.info("开始录像"); log.info("开始录像");
log.info("{}",file); log.info("{}", file);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); //视频源数据yuv // recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); //视频源数据yuv
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); //设置音频压缩方式 recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); //设置音频压缩方式
recorder.setFormat("mp4"); recorder.setFormat("mp4");
recorder.setVideoOption("threads", String.valueOf(Runtime.getRuntime().availableProcessors())); //解码线程数 recorder.setVideoOption("threads", String.valueOf(Runtime.getRuntime().availableProcessors())); //解码线程数
try (Java2DFrameConverter converter = new Java2DFrameConverter()){ try {
Frame frame; Frame frame;
while ((frame = grabber.grab()) != null) { while ((frame = grabber.grab()) != null) {
if(frame.streamIndex == AVMEDIA_TYPE_VIDEO){ if (frame.streamIndex == AVMEDIA_TYPE_VIDEO) {
recorder.record(frame); recorder.record(frame);
} }
} }
@ -98,15 +82,10 @@ public class VideoController {
} }
} }
log.info("录像结束"); log.info("录像结束");
FileInputStream fileInputStream = new FileInputStream(file); InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
OutputStream outputStream = response.getOutputStream(); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
IoUtil.copy(fileInputStream, outputStream); IoUtil.copy(inputStream, outputStream);
log.info("临时文件 {} 写入 响应 完成",file); log.info("临时文件 {} 写入 响应 完成", file);
fileInputStream.close(); log.info("删除临时文件 {} {}", file, file.delete());
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
log.info("删除临时文件 {} {}",file,file.delete());
}
} }
} }