当我们从FrameGrabber检索帧时,我们得到对帧的引用。 该框架将添加到列表中。但是,由于我们仅引用框架,因此列表中的所有对象都指向相同的引用。
由于我无法访问任何对象框架或FrameGrabber,因此无法创建'em cloneable或serializable。因此没有复制。
我相信,既然我们每轮创建一个新的对象框架,我们会得到一个新的参考,rigth?
Frame frame = new Frame();
但是,对象框架本身是对以下内容的引用:
frame = mFrameGrabber.grabFrame();
所以罪魁祸首是mFrameGrabber,它每次都返回相同的引用。帮我解决这个问题。
简短:捕获一个帧(对象)并将内容(不是引用)存储在object类型的arraylist中。
private FrameGrabber mFrameGrabber;
List<Frame> frameBuffer = new ArrayList<Frame>();
public void run() {
// Run forever
while ( true )
{
Frame frame = new Frame();
// Time to capture a frame ?
if ( captureTimer.hasTimerElapsed() == true )
{
try
{
// Grab a frame
frame = mFrameGrabber.grabFrame();
if ( frameWindow.isVisible() && frame != null)
{
frameBuffer.add(frame);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
类是从java文件中的jar文件实现的。
编辑: 好。框架对象具有对象本身。我注意到我需要复制的唯一对象是buffer []类型的对象。称之为图像。
我可以克隆图片,给我一个新的参考。但是,图像中的内容似乎仍然是相同的lol。所以这仍然不是一个很深的副本..也会尝试序列化。
private Frame copyFrame(Frame frame)
{
// Frame that will hold the copy
Frame cFrame = new Frame(640, 480, 8, 3);
cFrame.image = frame.image.clone();
return cFrame;
}
答案 0 :(得分:0)
可能会有所帮助
frame = (Frame)mFrameGrabber.grabFrame().clone();
答案 1 :(得分:0)
问题现在已经解决了。查看类/对象“框架”,结论是内部唯一必须被深层复制的组件是:
public Buffer[] image;
在课堂上看一下,可以看到以下内容:
ByteBuffer buffer = ByteBuffer.allocateDirect(imageHeight * imageStride * pixelSize).order(ByteOrder.nativeOrder());
image[0] = buffer;
因此缓冲区的索引0持有ByteBuffer,这是不可序列化的!于是我开始深入挖掘网络如何深度复制这样的对象。结果很好。
以下是解决方案。谢谢你们的反馈!
private Frame copyFrame(Frame frame)
{
// Frame that will hold the copy
Frame cFrame = new Frame(640, 480, 8, 3);
// Copy the byte buffer from frame
ByteBuffer originalByteBuffer = (ByteBuffer) frame.image[0];
// Create the clone buffer with same capacity as the original
ByteBuffer cloneBuffer = ByteBuffer.allocateDirect(originalByteBuffer.capacity());
//ByteBuffer cloneBuffer = deepCopy(originalByteBuffer);
// Save parameters from the original byte buffer
int position = originalByteBuffer.position();
int limit = originalByteBuffer.limit();
// Set range to the entire buffer
originalByteBuffer.position(0).limit(originalByteBuffer.capacity());
// Read from original and put into clone
cloneBuffer.put(originalByteBuffer);
// Set the order same as original
cloneBuffer.order(originalByteBuffer.order());
// Set clone position to 0 and set the range as the original
cloneBuffer.position(0);
cloneBuffer.position(position).limit(limit);
// Save the clone
cFrame.image[0] = cloneBuffer;
return cFrame;
}