图片通过javaCV转RTMP流
public static void main(String[] args) {
// captureScreen();
try {
transferPicToRtmp("rtmp://yourIp:1935/live/test.stream");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* 图片转RTMP流
*
* @param outRtmpUrl
* @throws Exception
* @throws org.bytedeco.javacv.FrameRecorder.Exception
* @throws InterruptedException
*/
public static void transferPicToRtmp(String outRtmpUrl)
throws Exception, org.bytedeco.javacv.FrameRecorder.Exception, InterruptedException {
int frameRate = 25;
FrameRecorder recorder;
try {
recorder = FrameRecorder.createDefault(outRtmpUrl, 352, 288);
} catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
log.error(e.toString());
throw e;
}
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("flv");
recorder.setFrameRate(frameRate);
recorder.setGopSize(frameRate);
/*************************************************************
* 设置音频
************************************************************/
// 不可变(固定)音频比特率
recorder.setAudioOption("crf", "0");
// 最高质量
recorder.setAudioQuality(0);
// 音频比特率
recorder.setAudioBitrate(192000);
// 音频采样率
recorder.setSampleRate(44100);
// 双通道(立体声)
recorder.setAudioChannels(2);
// 音频编/解码器
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
/*************************************************************
* 设置音频结束
************************************************************/
System.out.println("准备开始推流...");
try {
recorder.start();
} catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
try {
System.out.println("录制器启动失败,正在重新启动...");
if (recorder != null) {
System.out.println("尝试关闭录制器");
recorder.stop();
System.out.println("尝试重新开启录制器");
recorder.start();
}
} catch (org.bytedeco.javacv.FrameRecorder.Exception e1) {
log.error(e.toString());
throw e;
}
}
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();// 本地环境
Rectangle screenSize = ge.getMaximumWindowBounds();// 获取当前屏幕最大窗口边界
CanvasFrame frame = new CanvasFrame("图片转RTMP流");// javacv提供的图像展现窗口
int width = 352;
int height = 288;
long startTime = 0;
Frame capturedFrame = null;
System.out.println("开始推流");
frame.setBounds((int) (screenSize.getWidth() - width) / 2, (int) (screenSize.getHeight() - height) / 2, width,
height);// 窗口居中
frame.setCanvasSize(width, height);// 设置CanvasFrame窗口大小
BufferedImage image1 = ImageIO.read(new FileInputStream("D:/code/CameraMonitor/doc/a1.jpg"));
BufferedImage image2 = ImageIO.read(new FileInputStream("D:/code/CameraMonitor/doc/a2.jpg"));
BufferedImage image3 = ImageIO.read(new FileInputStream("D:/code/CameraMonitor/doc/a3.jpg"));
BufferedImage image4 = ImageIO.read(new FileInputStream("D:/code/CameraMonitor/doc/a4.jpg"));
int idx = 0;
Java2DFrameConverter co = new Java2DFrameConverter();
while (frame.isShowing()) {
System.out.println("推流...");
if (idx % 4 == 1) {
capturedFrame = co.getFrame(image1);
} else if (idx % 4 == 2) {
capturedFrame = co.getFrame(image2);
} else if (idx % 4 == 3) {
capturedFrame = co.getFrame(image3);
} else {
capturedFrame = co.getFrame(image4);
}
idx++;
if (idx > 1000) {
idx = 0;
}
frame.showImage(capturedFrame);
if (startTime == 0) {
startTime = System.currentTimeMillis();
}
long videoTS = 1000 * (System.currentTimeMillis() - startTime);
if (videoTS > recorder.getTimestamp()) {
recorder.setTimestamp(videoTS);// 时间戳
}
if (capturedFrame != null) {
recorder.record(capturedFrame);
}
Thread.sleep(100);
}
frame.dispose();
recorder.stop();
recorder.release();
}
本文介绍如何使用JavaCV将图片转换为RTMP流并进行实时推送。具体包括配置RTMP连接、设置音视频参数、读取图片、创建帧并进行流媒体传输等关键步骤。
3818

被折叠的 条评论
为什么被折叠?



