我正在与Xuggler合作并尝试创建一个使用从视频中捕获的帧的程序。
我找到了这段代码:Xuggler: Deocde And Capture Frames
我设法让它工作并保存我需要的帧。
现在,我正在尝试将它集成到我的GUI程序中的一个单独的线程上,以防止在抓取帧时锁定所有内容。我几乎只是将main中的所有内容复制到run方法中。我做的唯一更改是更正args文件名。我对它进行了硬编码,并检查了我的工作程序,以确保它是正确的路径。
现在,当我尝试在自己的Runnable线程中运行帧抓取代码时,它会崩溃。 打开文件时,它似乎在此部分崩溃:
IContainer container = IContainer.make();
if (container.open(filename, IContainer.Type.READ, null) < 0)
throw new IllegalArgumentException("could not open file: " + filename);
在对Xuggler网站进行一些研究之后,我在这里查看了IContainer文件的open方法:Xuggler: IContainer API open()
它说“如果在阻塞方法运行时当前线程被中断,则该方法将返回负值。 “
它确实在崩溃之前返回一个负值,所以我认为这可能是我的问题。虽然,这是我的程序中当前运行的唯一额外线程。我的程序只是一些基本的框架和面板,我将用它来显示东西。然后,在创建它们之后,我尝试启动崩溃的帧抓取线程。
我不知道如何解决这个问题。有人能指出我正确的方向吗?感谢。
编辑:
找到这篇文章后:好吧,我没有足够的代表发布第三个链接,所以可以通过googling找到:icontainer.open xuggler-users
我使用另一种需要格式的开放方法实现打开容器,它似乎有效。
现在,当它到达此部分时会抛出此异常:
resampler = IVideoResampler.make(
videoCoder.getWidth(), videoCoder.getHeight(), IPixelFormat.Type.BGR24,
videoCoder.getWidth(), videoCoder.getHeight(), videoCoder.getPixelType());
if (resampler == null)
throw new RuntimeException(
"could not create color space resampler for: " + filename);
我尝试通过设置我自己的IFormat来打开它:
IContainerFormat format = IContainerFormat.make();
format.setInputFormat("mp4");
我尝试使用null作为API的格式说让类“猜测”格式。
两者都抛出相同的异常,所以我不知道从哪里开始。我还在搜索。