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(Неизвестный Источник)

Что я делаю неправильно?

0 ответов

Другие вопросы по тегам