#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 поток, казалось, исправило это.