Java将缓冲区图像编码为视频文件(mp4)
我已经看了前面的主题,但是找不到CompressedTrack类。 我已经能够从视频中抓取帧了。 是否有任何方法可以使用BuffereImage(屏幕截图)创建mp4视频文件 谢谢你的帮助Java将缓冲区图像编码为视频文件(mp4),java,mp4,bufferedimage,Java,Mp4,Bufferedimage,我已经看了前面的主题,但是找不到CompressedTrack类。 我已经能够从视频中抓取帧了。 是否有任何方法可以使用BuffereImage(屏幕截图)创建mp4视频文件 谢谢你的帮助 package org.tkassembled.xuggle; package org.tkassembled.xuggle; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.image.BufferedImage; i
package org.tkassembled.xuggle;
package org.tkassembled.xuggle;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
import com.xuggle.mediatool.IMediaWriter;
import com.xuggle.mediatool.ToolFactory;
import com.xuggle.xuggler.ICodec;
public class ManualVideoCompile {
private static Dimension screenBounds;
public static int indexVideo = 1;
private static final double FRAME_RATE = 50;
private static final int SECONDS_TO_RUN_FOR = 20;
private static final String OUTPUT_FILE = "C:/video/today.mp4";
public static void main(String[] arguments) {
final IMediaWriter writer = ToolFactory.makeWriter(OUTPUT_FILE);
screenBounds = Toolkit.getDefaultToolkit().getScreenSize();
writer.addVideoStream(0, 0, ICodec.ID.CODEC_ID_MPEG4,
screenBounds.width / 2, screenBounds.height / 2);
long startTime = System.nanoTime();
for (int index = 0; index < 15; index++) {
BufferedImage bgrScreen = getVideoImage();
System.out.println("time stamp = "+ (System.nanoTime() - startTime));
bgrScreen = convertToType(bgrScreen, BufferedImage.TYPE_3BYTE_BGR);
// encode the image to stream #0
//writer.encodeVideo(0, bgrScreen, (System.nanoTime() - startTime)/2,TimeUnit.NANOSECONDS);
// encode the image to stream #0
writer.encodeVideo(0, bgrScreen, System.nanoTime() - startTime,
TimeUnit.NANOSECONDS);
// sleep for frame rate milliseconds
try {
Thread.sleep((long) (100));
} catch (InterruptedException e) {
// ignore
}
}
writer.close();
}
private static BufferedImage getVideoImage() {
File imgLoc = new File("C:/images/" + indexVideo + ".png");
BufferedImage img = null;
try {
img = ImageIO.read(imgLoc);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(imgLoc.getName());
indexVideo++;
return img;
}
public static BufferedImage convertToType(BufferedImage sourceImage,
int targetType) {
BufferedImage image;
// if the source image is already the target type, return the source
// image
if (sourceImage.getType() == targetType) {
image = sourceImage;
}
// otherwise create a new image of the target type and draw the new
// image
else {
image = new BufferedImage(sourceImage.getWidth(),
sourceImage.getHeight(), targetType);
image.getGraphics().drawImage(sourceImage, 0, 0, null);
}
return image;
}
}
导入java.awt.Dimension;
导入java.awt.Toolkit;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.concurrent.TimeUnit;
导入javax.imageio.imageio;
导入com.xuggle.mediatool.IMediaWriter;
导入com.xuggle.mediatool.ToolFactory;
导入com.xuggle.xuggler.ICodec;
公共类手册视频编辑{
私有静态维度边界;
公共静态int indexVideo=1;
专用静态最终双帧_速率=50;
专用静态最终整数秒到运行时间=20;
私有静态最终字符串输出\u FILE=“C:/video/today.mp4”;
公共静态void main(字符串[]参数){
最终IMediaWriter-writer=ToolFactory.makeWriter(输出文件);
screenBounds=Toolkit.getDefaultToolkit().getScreenSize();
writer.addVideoStream(0,0,ICodec.ID.CODEC\u ID\u MPEG4,
screenBounds.width/2、screenBounds.height/2);
long startTime=System.nanoTime();
对于(int-index=0;index<15;index++){
BuffereImage bgrScreen=getVideoImage();
System.out.println(“时间戳=“+(System.nanoTime()-startTime));
bgrScreen=convertToType(bgrScreen,BufferedImage.TYPE_3BYTE_BGR);
//将图像编码为流#0
//writer.encodeVideo(0,bgrScreen,(System.nanoTime()-startTime)/2,时间单位为纳秒);
//将图像编码为流#0
writer.encodeVideo(0,bgrScreen,System.nanoTime()-startTime,
时间单位(纳秒);
//帧速率毫秒睡眠
试一试{
睡眠((长)(100));
}捕捉(中断异常e){
//忽略
}
}
writer.close();
}
私有静态缓冲区映像getVideoImage(){
文件imgLoc=新文件(“C:/images/”+indexVideo+“.png”);
BuffereImage img=null;
试一试{
img=图像读取(imgLoc);
}捕获(IOE异常){
e、 printStackTrace();
}
System.out.println(imgLoc.getName());
indexVideo++;
返回img;
}
公共静态BuffereImage转换类型(BuffereImage sourceImage,
int目标类型){
缓冲图像;
//如果源映像已经是目标类型,请返回源映像
//形象
if(sourceImage.getType()==targetType){
图像=源图像;
}
//否则,创建目标类型的新图像并绘制新图像
//形象
否则{
image=new BufferedImage(sourceImage.getWidth(),
sourceImage.getHeight(),targetType);
image.getGraphics().drawImage(sourceImage,0,0,null);
}
返回图像;
}
}
“我已经看过以前的主题”链接到它们。“但是这个类压缩了Track…”那是什么?链接到JavaDocs。它只是从图像创建mp4视频。希望它能帮助我添加录制的声音?