注:文章说明的内容是记录了解的一些常见单位或名词的含义等,如有错误请在评论指出,不胜感激。
前言
图像:一个图像由像素点和像素点的色彩信息构成,常见的像素数据有rgb、yuv、rbga等。
图像容量:例如一幅彩色图像(RGB),分辨率为256×512,每一种颜色用8bit表示,则该彩色图像的数据量为 2565128*3 bit。
视频帧:图像经过编码形成(如H264等,对图像数据进行压缩),视频帧由关键帧(i帧)和B/P帧组成。
帧率:单位FPS(每秒钟要多少帧画面),影响画面流畅度,与画面流畅度成正比。
码率:编码器每秒编出的数据大小,单位是kbps,比如800kbps代表编码器每秒产生800kb(或100KB)的数据。
一、BufferedImage
位于java.awt.image包中,主要用于将一副图片加载到内存。(具体使用方法jdk的doc)
二、JavaCV操作rtsp流媒体
1.依赖库
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.1-1.4.4</version>
</dependency>
2.代码
public class RtspTest {
private FFmpegFrameGrabber grabber;
private String rtsp;
private boolean isStart = false;
@Test
public void test01() throws Exception {
rtsp = "rtsp://admin:123456@192.168.100.100";
grabber = FFmpegFrameGrabber.createDefault(rtsp);
grabber.setOption("rtsp_transport","tcp"); //tcp方式连接
grabber.setFrameRate(10); //设置帧率
grabber.setImageWidth(740); //设置获取的视频宽度
grabber.setImageHeight(480); //设置获取的视频高毒
grabber.setVideoBitrate(2000000); //设置视频比特率
Java2DFrameConverter java2DFrameConverter = new Java2DFrameConverter();
while(true){
try{
if(grabber != null && !isStart) {
grabber.start();
isStart = true;
System.out.println("启动成功");
}
if(grabber != null){
Frame frame = grabber.grabImage();
if(null == frame){
continue;
}
BufferedImage bufferedImage = java2DFrameConverter.getBufferedImage(frame);
String fileName = UUID.randomUUID().toString();
File file = new File("E:\\jpg\\"+fileName+"."+"jpg");
ImageIO.write(bufferedImage,"jpg",file);
bufferedImage.flush();
}
}catch(FrameGrabber.Exception | RuntimeException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}