java 如何将多张JPG图片合成视频文件,比如:avi格式 或 mpg格式.

Python017

java 如何将多张JPG图片合成视频文件,比如:avi格式 或 mpg格式.,第1张

之前有做过图片合成视频的功能,大概代码就是这样,你可以看一下

/**

* 图片合成视频

* @param mp4SavePath 视频保存路径

* @param imageDir 图片地址

* @param rate 这个可以理解成视频每秒播放图片的数量

*/

public static boolean jpgToMp4(String mp4SavePath, String imageDir, double rate) {

FFmpegFrameRecorder recorder = null

boolean flag = true

try {

File[] files = FileUtils.fileSort(imageDir)

int [] widthArray = new int[files.length]

int [] heightArray = new int[files.length]

/**

* 获取合成视频图片的最大宽高,避免图片比例不一致最终合成效果差

*/

for (int i = 0i <files.lengthi++) {

BufferedImage bufferedImage = ImageIO.read(files[i])

widthArray[i] = bufferedImage.getWidth()

heightArray[i] = bufferedImage.getHeight()

}

/**

* 这个方法主要是防止图片比例达不到视频合成比例的要求,如果达不到下面条件视频则会无法播放

* 图片宽:必须要被32整除

* 图片高:必须要被2整除

*/

int [] maxWH = getImgMaxWH(widthArray,heightArray)

recorder = new FFmpegFrameRecorder(mp4SavePath,maxWH[0],maxWH[1])

recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264)

/**

* 视频质量:目前测试出来的是25-30最清晰,视频质量范围好像是0-40,具体可以自己慢慢测

*/

recorder.setVideoQuality(25)

recorder.setFormat("mp4")

recorder.setFrameRate(rate >0 ? rate : 1)

recorder.setPixelFormat(0)

recorder.start()

OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage()

/**

* 合成视频

*/

for(int i = 0i <files.lengthi++ ){

opencv_core.IplImage image = cvLoadImage(files[i].getPath())

recorder.record(conveter.convert(image))

opencv_core.cvReleaseImage(image)

}

logger.info("合成成功")

} catch(Exception e) {

e.printStackTrace()

flag = false

logger.error("合成失败")

} finally {

try {

if (recorder != null){

recorder.stop()

recorder.release()

}

} catch (FrameRecorder.Exception e) {

e.printStackTrace()

}

}

return flag

}

Image image1 = ImageIO.read(new File(fileurl1))

Image image2 = ImageIO.read(new File(fileurl2))

int width = image.getWidth(5000)// 得到图片的长,宽

int height = image.getHeight(5000)

BufferedImage bufferedimage = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB)// 构造一个内存图片

bufferedimage.getGraphics().drawImage(image1, 0, 0, width, height, null)// 将本地图片画入到内存图片

bufferedimage.getGraphics().drawImage(image2, 0, 0, image1.getWidth, image1.getHeight, null)

response.setContentType("image/jpeg")// 设置返回头部

response.setHeader("Pragma", "No-cache")

response.setHeader("Cache-Control", "no-cache")

response.setDateHeader("Expires", 0)

ImageIO.write(bufferedimage, "JPEG", response.getOutputStream()) //写到浏览器

大概方向就是这样,把图片放到内存中,然后绘制内存图片,把他们包含进去,然后把内存图片返回。

我乱改的,不能跑的。前不久刚做过

你可以试试

==========================================

几张图放一起没试过,你可以试试在绘了一张后,接着会第2张,他们的开始地点相同,看会不会被覆盖

public static void many2one(List<String>bookFilePaths, String toPath,String distFileName) {

if (bookFilePaths != null &&bookFilePaths.size() >0) {

File[] files = new File[bookFilePaths.size()]

for(int i = 0i <bookFilePaths.size()i++){

files[i] = new File(bookFilePaths.get(i))

}

if (files != null &&files.length >0) {

try {

ArrayList pages = new ArrayList(files.length - 1)

FileSeekableStream[] stream = new FileSeekableStream[files.length]

for (int i = 0i <files.lengthi++) {

stream[i] = new FileSeekableStream(

files[i].getCanonicalPath())

}

ParameterBlock pb = (new ParameterBlock())

PlanarImage firstPage = JAI.create("stream", stream[0])

for (int i = 1i <files.lengthi++) {

PlanarImage page = JAI.create("stream", stream[i])

pages.add(page)

}

TIFFEncodeParam param = new TIFFEncodeParam()

boolean f = makeDirs(toPath)

System.out.println(f)

OutputStream os = new FileOutputStream(toPath + File.separator+ distFileName)

ImageEncoder enc = ImageCodec.createImageEncoder("tiff",

os, param)

param.setExtraImages(pages.iterator())

enc.encode(firstPage)

for (int i = 0i <files.lengthi++) {

stream[i].close()

}

os.close()

} catch (IOException e) {

e.printStackTrace()

}

}

}

}