我正在开发一个将Hadoop的MapReduce框架与Xuggle集成的程序.为此,我正在实现一个IURLProtocolHandlerFactory从内存Hadoop数据对象读取和写入的类.
您可以在此处查看相关代码:https: //gist.github.com/4191668
我的想法是 用UUID 注册类中的每个BytesWritable对象,IURLProtocolHandlerFactory这样当我稍后在打开文件时引用该名称时,它返回一个IURLProtocolHandler附加到该BytesWritable对象的实例,我可以从内存中读写内存.
问题是我得到这样的例外:
java.lang.RuntimeException: could not open: byteswritable:d68ce8fa-c56d-4ff5-bade-a4cfb3f666fe
at com.xuggle.mediatool.MediaReader.open(MediaReader.java:637)
Run Code Online (Sandbox Code Playgroud)
(另见发布的链接)
在调试时,我看到在工厂中正确找到了对象,而且甚至可以在协议处理程序中读取它们.如果我从输出文件中删除侦听器,则会发生同样的情况,因此问题已经出现在输入中.深入挖掘Xuggle的代码我到达JNI代码(试图打开文件),我不能比这更进一步.这显然会返回错误代码.
XugglerJNI.IContainer_open__SWIG_0
Run Code Online (Sandbox Code Playgroud)
我真的很感激一些暗示下一步该怎么做,我该如何继续调试.也许我的实现有一个缺陷,但我看不到它.
我认为您遇到的问题是,许多类型的输入/输出都被转换为IContainerJNI 代码中的本机文件描述符,但您传递的内容无法转换。可能无法IURLProtocolHandler以这种方式创建您自己的,因为在遍历 后XuggleIO.map(),它最终会再次调用 IContainer,然后进入 IContainer JNI 代码,该代码可能会尝试获取本机文件描述符并调用avio_open().
但是,您可能可以打开一些IContainer不是文件/没有文件描述符的内容,并且可以正确处理这些内容。你可以打开的东西可以在IContainer代码中看到,即java.io.DataOutputand java.io.DataOutputStream(以及相应的输入)。我建议您制作包含 BytesReadable/BytesWriteable 的 DataInput/DataOutput 实现,并在 IContainer 中打开它。
如果这不起作用,请将输入写入临时文件并从临时文件读取输出:)