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对象重新转为输出流呢?这样又如何实现呢?
答
应该直接可以websocket发送过去吧