Кодировщик последовательности JCodec выдает исключение ClosedByInterruptException при добавлении собственного изображения

#java #video-recording #jcodec

#java #видеозапись #jcodec

Вопрос:

Я пытаюсь использовать кодировщик последовательностей, чтобы получить кучу байт-буферов для видео. Я создаю экземпляр кодировщика следующим образом:

 new SequenceEncoder(NIOUtils.writableFileChannel(movie.getAbsolutePath()), Rational.R(60, 1), Format.MOV, Codec.H264, null);
 

Затем я добавляю картинки в другой поток:

 public static void saveScreenshot(ByteBuffer buffer) throws IOException {
    Picture pic = Picture.create(width, height, ColorSpace.RGB);
    
    byte[] dstData = pic.getPlaneData(0);
    
    int j = 0;
    for (int y = (height - 1); y > 0; y--) {
        for (int x = 0; x < width; x  ) {
            int i = (x   (width * y)) * 3;
            
            dstData[j  ] = 
                    (byte) (buffer.get(i) - 128);
            dstData[j  ] = 
                    (byte) (buffer.get(i   1) - 128);
            dstData[j  ] = 
                    (byte) (buffer.get(i   2) - 128);
            
        }
    }
    
    synchronized (ScreenshotQueue.encoder) {
        ScreenshotQueue.encoder.encodeNativeFrame(pic);
    }
    
}
 

Затем, еще раз в другом потоке, я завершаю файл:

 encoder.finish();
 

Этот код работает!
Моя проблема в том, что это работает один раз. Я понятия не имею почему, но когда я снова запускаю этот код, он выдает исключение ClosedByInterruptException при добавлении изображения.

Моей первой идеей было закрыть поток файлов после первой записи вручную, поэтому я создал FileOutputStream и использовал FileOutputStream#getChannel() для получения канала. И после завершения () я закрываю их вручную. Но это не сработало!

Я также пробовал разные кодеки / форматы. Когда я использую VP8, это всегда работает. Проблема в том, что VP8 не работает, поэтому я не могу его использовать.

Ответ №1:

Ладно. Я нашел проблему.

Я просмотрел JavaDocs SE и выяснил, что исключение было не исключением с множественным доступом, а проблемой блокировки потока. Помещение всего в 1 поток, казалось, исправило это.