javacv视频裸流转推

摄像头视频祼流转推到rtmp,如何用管道流读取inputstream?

首先,需要创建一个PipedOutputStream对象和一个PipedInputStream对象,并将它们连接起来:

PipedOutputStream pipedOutputStream = new PipedOutputStream();
PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);


接下来,将PipedInputStream作为输入流传递给处理视频数据的线程或方法。在该线程或方法中,使用管道流的PipedOutputStream对象将视频数据写入管道:

// 在视频处理线程中
while (videoDataAvailable) {
    // 从摄像头获取视频帧数据
    byte[] videoFrameData = getVideoFrameData();

    // 将视频帧数据写入管道流
    pipedOutputStream.write(videoFrameData);
}

// 完成写入后,关闭管道输出流
pipedOutputStream.close();


现在,视频数据将通过PipedInputStream对象提供给其他处理模块。你可以使用该输入流将视频数据转发到RTMP推流器或其他处理模块。

请注意,使用管道流进行数据传输时,需要确保读取和写入数据的线程在适当的时机启动和停止,以避免阻塞或资源泄漏。同时,要注意处理异常和错误情况,以保证流的正常运行。

需要根据实际情况和使用的库或框架进行适当的调整和配置,以实现摄像头视频流转推到RTMP的功能。

  • 你可以参考下这篇文章:javacv-03:录制流媒体服务器的rtsp/rtmp视频内容,保存为本地视频文件
  • 除此之外, 这篇博客: java抓取rtmp流的图像中的 方法一:使用javacv进行图像抓取 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 项目依赖
    <dependency>
                <groupId>org.bytedeco</groupId>
                <artifactId>javacv</artifactId>
                <version>1.5.1</version>
            </dependency>
            <dependency>
                <groupId>org.bytedeco</groupId>
                <artifactId>ffmpeg-platform</artifactId>
                <version>4.1.3-1.5.1</version>
            </dependency>
    
    1. 上代码,复制即可使用(方法参数自己稍作修改)
        /**
         * 按帧录制视频
         *
         * @param inputFile-该地址可以是网络直播/录播地址,也可以是远程/本地文件路径
         * @param outputFile                              -该地址只能是文件地址,如果使用该方法推送流媒体服务器会报错,原因是没有设置编码格式
         * @throws FrameGrabber.Exception
         * @throws FrameRecorder.Exception
         * @throws org.bytedeco.javacv.FrameRecorder.Exception
         */
        public void frameRecordImage(String inputFile, String outputFile, String imgMat, String frameRate,String imageName) throws Exception {
            avutil.av_log_set_level(avutil.AV_LOG_FATAL);
            // 获取视频源
    //        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
            MyFFmpegFrameGrabber grabber = new MyFFmpegFrameGrabber(inputFile);
            grabber.setOption("rtsp_transport", "tcp");
            grabber.setImageWidth(640);
            grabber.setImageHeight(360);
            grabber.setTimeout(3000);
            grabber.setFrameRate(frameRate);
            grabber.setVideoBitrate(3000000);
    
            Java2DFrameConverter converter = new Java2DFrameConverter();
            recordByFrame(grabber, converter, outputFile, imgMat, imageName);
        }
    
        private void recordByFrame(MyFFmpegFrameGrabber grabber, Java2DFrameConverter converter, String
                outputFile, String imgMat,String imageName) throws Exception {
            try {//建议在线程中使用该方法
                log.info("the code {} grab start");
                grabber.start();
                imageByframe(grabber, converter, outputFile, imgMat, imageName);
                grabber.stop();
                log.info("the code {} grab stop");
            } finally {
                if (grabber != null) {
                    grabber.stop();
                    log.info("the code {} grab stop");
                }
            }
        }
    
        private void imageByframe(MyFFmpegFrameGrabber grabber, Java2DFrameConverter converter, String outputFile, String
                imgMat,String imageName) throws IOException {
            Frame frame = grabber.grabImage();
            BufferedImage bi = converter.convert(frame);
            // 每个frameRate帧进行一次抓取
            outputFile = outputFile + SLASH + imageName + Field.DOT + imgMat;
            ImageIO.write(bi, imgMat, new File(outputFile));
        }
        
        public static void main(String[] args) {
            RecordUtil recordUtil = new RecordUtil();
            recordUtil.frameRecordImage("rtmp流地址", "图片输出路径", "图片后缀", "帧率", "图片名");
        }