jcodec序列编码器在添加本机图片时引发closedbyinterruptexception

jgzswidk  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(273)

我正试着用序列编码器把一堆字节缓冲放到视频里。我将编码器示例化为:

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();

这个代码有效!我的问题是,它只工作一次。我不知道为什么,但是当我再次运行此代码时,当我添加图片时,它会抛出closedbyinterrupexception。
我的第一个想法是在第一次录制之后手动关闭filestream,因此我制作了一个fileoutputstream,并使用fileoutputstream#getchannel()获取通道。在finish()之后,我手动关闭它们。但那没用!
我还尝试了不同的编解码器/格式。当我使用vp8时,它总是有效的。问题是vp8不起作用,所以我不能用那个。

2g32fytz

2g32fytz1#

可以。我发现了问题。
我查看了se的javadocs,发现这个异常不是一个多访问的东西异常,而是一个线程锁问题。把所有的东西放进一条线似乎就能解决问题。

相关问题