У меня есть программа, которая читает файл mp4 и разделяет его на массив растровых изображений. Проблема заключалась в том, что каждый раз, когда я добавляю новый элемент, он перезаписывает остальные элементы. Мне наконец удалось решить проблему, но я хочу поделиться своим кодом на случай, если кто-то столкнется с той же проблемой.
FrameGrabber videoGrabber = new FFmpegFrameGrabber(VideoPath);
try
{
videoGrabber.setFormat("mp4");//mp4 for example
videoGrabber.start();
} catch (Exception e)
{
Log.e("javacv", "Failed to start grabber" + e);
}
Frame vFrame = null;
AndroidFrameConverter androidFrameConverter = new AndroidFrameConverter();
ArrayList<Bitmap> bitmapArray = new ArrayList<Bitmap>();
do
{
try
{
vFrame = videoGrabber.grabFrame();
if(vFrame != null) {
Bitmap temp = androidFrameConverter.convert(vFrame);
bitmapArray.add( temp.copy(temp.getConfig(),true)); // the issue solved here
//bitmapAray.add(temp) // will cause the overwrite
set.add(temp);
bitmapNum++ ;
}
} catch (Exception e)
{
Log.e("javacv", "video grabFrame failed: "+ e);
}
}while(vFrame != null);
try
{
videoGrabber.stop();
}catch (Exception e)
{
Log.e("javacv", "failed to stop video grabber", e);
}
Я думаю, что проблема заключалась в том, что программа хранит адрес, а не само значение, поэтому при изменении значения внутри адреса все элементы будут считывать одно и то же значение с одного и того же адреса. Я не уверен, правильно ли мои объяснения. Я надеюсь, что если кто-то знает, что настоящая проблема, дайте мне знать.