| | |
| | | |
| | | import cn.hutool.core.io.FileUtil; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.system.service.ICarService; |
| | | import org.bytedeco.ffmpeg.global.avcodec; |
| | | import org.bytedeco.ffmpeg.global.avutil; |
| | | import org.bytedeco.javacv.*; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | |
| | | |
| | | private static Map<Integer, Boolean> statusMap = new ConcurrentHashMap<>(); |
| | | |
| | | @Resource |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | @Resource |
| | | private ICarService carService; |
| | | public static void main(String[] args) { |
| | | String url = "rtmp://127.0.0.1:1935/flv/test"; |
| | | JavaCVStreamUtil.push_flv("C:\\Users\\39373\\Desktop\\图片\\trailer.mp4", url, 0); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | OpenCVFrameGrabber openCVFrameGrabber = grabberMap1.get(deviceNumber); |
| | | if (null != openCVFrameGrabber) { |
| | | openCVFrameGrabber.close(); |
| | | ; |
| | | } |
| | | FFmpegFrameRecorder fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber); |
| | | if (null != fFmpegFrameRecorder) { |
| | |
| | | |
| | | //视频抓帧 |
| | | grabber = new FFmpegFrameGrabber(inputUrl); |
| | | grabber.setOption("rtsp_transport", "tcp"); |
| | | // 正确设置超时时间 |
| | | grabber.setOption("timeout", "120000"); |
| | | grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264); |
| | | grabber.start(); |
| | | grabberMap.put(deviceNumber, grabber); |
| | | |
| | |
| | | recorder.setGopSize((int) grabber.getVideoFrameRate()); |
| | | // CRF 是一种用于控制视频/音频质量的参数,它允许在保持目标质量的同时动态地调整比特率。较低的CRF值表示更高的质量,但也可能导致较大的文件大小 |
| | | recorder.setAudioOption("crf", "23"); |
| | | |
| | | |
| | | //设置音频编码为AAC |
| | | if (grabber.getAudioChannels() > 0) { |
| | | recorder.setAudioChannels(grabber.getAudioChannels()); |
| | | recorder.setAudioBitrate(grabber.getAudioBitrate()); |
| | | recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); |
| | | recorder.setAudioCodec(grabber.getAudioCodec()); |
| | | } |
| | | recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); |
| | | recorder.setVideoCodec(avcodec.AV_CODEC_ID_FLV1); |
| | | //将解码后的帧记录到输出文件中 |
| | | //recorder.start通常用于处理已经解码成图像的视频数据 |
| | | recorder.start(); |
| | |
| | | if (!statusMap.get(deviceNumber)) { |
| | | break; |
| | | } |
| | | Thread.sleep(500); |
| | | } |
| | | } catch (FrameGrabber.Exception | FrameRecorder.Exception e) { |
| | | e.printStackTrace(); |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } finally { |
| | | close(deviceNumber, null); |
| | | } |
| | |
| | | recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); |
| | | } |
| | | |
| | | recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); |
| | | recorder.setVideoCodec(avcodec.AV_CODEC_ID_FLV1); |
| | | //设置音频编码为AAC |
| | | if (grabber.getAudioChannels() > 0) { |
| | | recorder.setAudioChannels(grabber.getAudioChannels()); |