qq_21183971
2021-09-30 16:09
采纳率: 0%
浏览 120

javacv本地视频转为图像帧加水印后,如何直接转为流输出到前台,而不是生成本地文件或者推流。

我的需求是,java向前台输出视频流时,动态添加水印。
示例代码如下:

   // 设置源视频、加字幕后的视频文件路径
    FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault("C:/Users/Administrator/Desktop/123.mp4");
    grabber.start();

    //如下位置,我想把C:/Users/Administrator/Desktop/test.mp4改为HttpServletResponse的OutputStream,
    //直接输出到浏览器,可是这样写报错。
    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("C:/Users/Administrator/Desktop/test.mp4",
             grabber.getImageWidth(), grabber.getImageHeight(), 2);  //grabber.getAudioChannels()
    recorder.setFormat("mp4");
    recorder.setFrameRate(grabber.getFrameRate());
    recorder.setVideoCodec(grabber.getVideoCodec());
    recorder.setVideoBitrate(grabber.getVideoBitrate());
    avutil.av_log_set_level(AV_LOG_ERROR);   //设置打印日志级别
    // 音频相关配置,取原音频配置
    recorder.setSampleRate(grabber.getSampleRate());
    recorder.setAudioCodec(avcodec.AV_CODEC_ID_MP3);
    recorder.start();
    Java2DFrameConverter converter = new Java2DFrameConverter();
    Frame frame;
    int i = 0;
    while ((frame = grabber.grab()) != null) {
        // 从视频帧中获取图片
        if (frame.image != null) {
            BufferedImage bufferedImage = converter.getBufferedImage(frame);
            // 对图片进行文本合入
            bufferedImage = addSubtitle(bufferedImage, "水印");
            // 视频帧赋值,写入输出流
            frame.image = converter.getFrame(bufferedImage).image;
            recorder.record(frame);
        }
        // 音频帧写入输出流
        if(frame.samples != null) {
            recorder.record(frame);
        }
    }

在上面的代码中,构建FFmpegFrameRecorder对象时,我不想传入本地文件路径,而是想传入一个输出流。直接输出到浏览器,但是这样会报错。
看源码的构造函数,是有接收输出流的实现的,但是这样使用不行,应该如何使用呢?
如果这样无法实现,那么是否可以采用,将Frame对象重新转为输出流呢?这样又如何实现呢?

2条回答 默认 最新

相关推荐 更多相似问题