图片通过javaCV转RTMP流

来源:互联网 发布:mac怎么截gif 编辑:程序博客网 时间:2024/06/06 11:33

图片通过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();}
阅读全文
0 0