Java 如何使用Xugler重新编码电影文件
这一定是一个非常愚蠢的问题,但是如何重新编码Xuggler呢? 我有:Java 如何使用Xugler重新编码电影文件,java,video-encoding,xuggle,xuggler,Java,Video Encoding,Xuggle,Xuggler,这一定是一个非常愚蠢的问题,但是如何重新编码Xuggler呢? 我有: IMediaReader reader = ToolFactory.makeReader(sourceUrl); IMediaWriter writer = ToolFactory.makeWriter(url, reader); MediaSegmenterWriter writerListener = new MediaSegmenterWriter(); writer.open(); while (rea
IMediaReader reader = ToolFactory.makeReader(sourceUrl);
IMediaWriter writer = ToolFactory.makeWriter(url, reader);
MediaSegmenterWriter writerListener = new MediaSegmenterWriter();
writer.open();
while (reader.readPacket() == null)
do {
}
while(false);
现在,我想将读取器中的文件重新编码为另一个比特率和分辨率。我该怎么做?在创建writer时,我尝试添加IMediaStreams,其中包含原始编码器的副本,并进行了必要的更改,但这不起作用:
int numStreams = reader.getContainer().getNumStreams();
for(int i = 0; i < numStreams; i++)
{
final IStream stream = reader.getContainer().getStream(i);
final IStreamCoder coder = stream.getStreamCoder();
IStreamCoder newCoder = IStreamCoder.make(IStreamCoder.Direction.ENCODING, coder);
if(newCoder == null ){
continue;
}
writer.getContainer().addNewStream(i);
int streams = writer.getContainer().getNumStreams();
System.out.println("Current amount of streams in writer: " + streams);
System.out.println("Coder: " + coder.toString());
if (coderSetting != null && newCoder != null){
if (newCoder.getCodecType().equals(ICodec.Type.CODEC_TYPE_VIDEO)) {
newCoder.setWidth(320);
newCoder.setHeight(240);
}
IStream outputStream = writer.getContainer().getStream(i);
outputStream.setStreamCoder(newCoder);
newCoder.open();
}
}
int numStreams=reader.getContainer().getNumStreams();
for(int i=0;i
但这只会产生与忽略代码相同的结果(例如,原始版本的1920x1080)
还试图向编写器添加侦听器并替换编码器,但要么出现错误(编码器已打开,要么没有效果。(在onOpen、onAddStream、onOpenCoder上))
我找了一些教程,但似乎没有做这个简单的操作
任何帮助都将不胜感激 要调整内容大小并重新编码,您需要创建一个MediaToolAdapter,如:
private static class MediaResizer extends MediaToolAdapter {
private IVideoResampler videoResampler = null;
private int mediaHeight;
private int mediaWidth;
public MediaResizer (int aHight, int aWidth) {
mediaWidth = aWidth;
mediaHeight = aHeight;
}
@Override
public void onVideoPicture(IVideoPictureEvent event) {
// In case of audio only, do not re-size as it is not needed
if(job.role == MediaRole.MediaRoleEnum.LS_AUDIO) super.onVideoPicture(event);
IVideoPicture pic = event.getPicture();
if (videoResampler == null) {
videoResampler = IVideoResampler.make(job.getCoderSettings().width, job.getCoderSettings().height, pic.getPixelType(), pic.getWidth(), pic.getHeight(), pic.getPixelType());
}
IVideoPicture out = IVideoPicture.make(pic.getPixelType(), mediaWidth, mediaHeight);
videoResampler.resample(out, pic);
IVideoPictureEvent asc = new VideoPictureEvent(event.getSource(), out, event.getStreamIndex());
super.onVideoPicture(asc);
out.delete();
}
}
您可以将其作为侦听器添加到阅读器中,然后将编写器的大小调整到您的大小。应该是这样的:
IMediaReader reader = ToolFactory.makeReader(sourceUrl);
MediaResizer resizer = new MediaResizer(job);
IMediaWriter currentWriter = ToolFactory.makeWriter(destinationDir, reader);
reader.addListener(resizer);
resizer.addListener(currentWriter);
@穆罕默德·奥马尔,
也许他的意思是:
@Override
public void onVideoPicture(IVideoPictureEvent event) {
// Logger.info("onAddStream(): now I am in VideoConverter.onVideoPicture().....");
IVideoPicture pic = event.getPicture();
if (videoResampler == null) {
videoResampler = IVideoResampler.make(VIDEO_WIDTH, VIDEO_HEIGHT,
pic.getPixelType(), pic.getWidth(), pic.getHeight(),
pic.getPixelType());
}
IVideoPicture out = IVideoPicture.make(pic.getPixelType(), VIDEO_WIDTH, VIDEO_HEIGHT);
videoResampler.resample(out, pic);
IVideoPictureEvent asc = new VideoPictureEvent(event.getSource(), out, event.getStreamIndex());
super.onVideoPicture(asc);
out.delete();
}
我在寻找同样的东西,你找到解决办法了吗??如果是的话,那将非常有帮助!!:)你能告诉我什么是“工作”和这个构造器是什么吗?我记不起来了,因为它是很久以前的事了,现在我开始直接调用ffmpeg了