0

我正在尝试使用序列编码器将一堆 ByteBuffers 获取到视频中。我正在像这样实例化编码器:

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。

我的第一个想法是在第一次录制后手动关闭 FileStream,所以我制作了 FileOutputStream 并使用 FileOutputStream#getChannel() 来获取 Channel。在完成()之后,我手动关闭它们。但这没有用!

我还尝试了不同的编解码器/格式。当我使用 VP8 时,它总是有效。问题是 VP8 不起作用,所以我不能使用那个。

4

1 回答 1

0

好的。我发现了问题。

我查看了 SE 的 JavaDocs,结果发现异常不是多访问异常,而是线程锁定问题。将所有内容放入 1 Thread 似乎可以解决问题。

于 2020-12-09T17:29:43.077 回答