javacpp ffmpeg: IplImage отправляет java.nio.BufferOverflowException по адресу java.nio.DirectByteBuffer.put
ЧТО Я ХОЧУ
Я хочу получить 16-битные серые изображения, которые у меня есть в виде байтовых массивов, а затем отправить эти массивы в ffmpeg/opencv, чтобы создать видео mp4 со всеми изображениями. Там не будет звука.
ЧТО Я СДЕЛАЛ
Например, я создаю поддельные изображения 8-битного серого цвета, а затем использую их для заполнения видео. Я использую библиотеки bytedeco для Java. Библиотеки правильно установлены. Все как в следующем коде:
import java.awt.EventQueue;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import static org.bytedeco.javacpp.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_calib3d.*;
import static com.googlecode.javacv.cpp.opencv_objdetect.*;*/
import javax.swing.JFrame;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import static org.bytedeco.javacpp.opencv_core.*;
public class testt{
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
testt window = new testt();
window.frame.setVisible(true);
OpenCVFrameConverter.ToIplImage grabberConverter = new OpenCVFrameConverter.ToIplImage();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("C:\\sample.mp4",200,100);
try {
recorder.setFrameRate(1);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setVideoBitrate(1000000);
recorder.setFormat("mp4");
recorder.setVideoQuality(0);
recorder.start();
byte[] bytes = new byte[20000];
//all black
for (int j = 0; j<bytes.length; j++){
bytes[j]=-127;
}
for (int i=0; i<1000; i++){
if (teta.length*(1+i)<20000) {
for (int j = teta.length*i; j<teta.length*(i+1); j++){
teta[j]=50;
}
}
IplImage image = IplImage.create(cvSize(200, 100),IPL_DEPTH_8U,1);
image.asByteBuffer().put(bytes);
recorder.record(grabberConverter.convert(image));
}
recorder.stop();
}catch (org.bytedeco.javacv.FrameRecorder.Exception e){
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public testt() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
ПРОБЛЕМЫ
Из приведенного выше кода я получаю:
java.nio.BufferOverflowException на java.nio.DirectByteBuffer.put(неизвестный источник) на java.nio.ByteBuffer.put(неизвестный источник) на test.testt$1.run(testt.java:47) на java.awt.event.InvocationEvent.dispatch(неизвестный источник) в java.awt.EventQueue.dispatchEventImpl(неизвестный источник) в java.awt.EventQueue.access$500(неизвестный источник) в java.awt.EventQueue$3.run(неизвестный источник) в java.awt. EventQueue $ 3.run (Неизвестный источник) в java.security.AccessController.doPrivileged(Собственный метод) в java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Неизвестный источник) в java.awt.EventQue.d. Source неизвестный объект ().EventDispatchThread.pumpOneEventForFilters(Unknown Source) на java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) в java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) в java.awt.EventDispatchThread.pumpEvents(Unknown Source) в java.awt.EventDispatchThread.pumpEvents (Неизвестный источник) на java.awt.EventDispatchThread.run(Неизвестный Источник)
Что я делаю неправильно?