javacv同时调用多个摄像头保存带声音的mp4文件的bug

下面这段代码是我整理你的javacv保存带声音的mp4文件的代码,但是我场景是同时调用多个摄像头,出现的问题就是TargetDataLine只能被实例一次,那么开多线程进行保存视频时,在保存音频的时候,由于底层line的read方法时里面有同步代码块,多个线程抢占read方法,会导致存视频的方法同步阻塞那么帧数会少存,最后比如我开启2个摄像头,那么录制10秒的视频,最后时长可能只有5秒,视频给人的感觉会被加速,请问有什么解决办法嘛,单个摄像头的话的确不会有这种情况发生
while (flag) {
        long stime2 = System.currentTimeMillis();
        int nBytesRead = 0;
        while (nBytesRead == 0 && flag) {
            // 音频数据是从数据线中取得的
            nBytesRead = line.read(audioBytes, 0, line.available());
        }

        // 如果nBytesRead<1,表示isFinish标志被设置true,此时该结束了
        if (nBytesRead<1) {
            return;
        }

        // 采样数据是16比特,也就是2字节,对应的数据类型就是short,
        // 所以准备一个short数组来接受原始的byte数组数据
        // short是2字节,所以数组长度就是byte数组长度的二分之一
        int nSamplesRead = nBytesRead / 2;
        short[] samples = new short[nSamplesRead];

        // 两个byte放入一个short中的时候,谁在前谁在后?这里用LITTLE_ENDIAN指定拜访顺序,
        ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);
        // 将short数组转为ShortBuffer对象,因为帧录制器的入参需要该类型
        ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);

        // 音频帧交给帧录制器输出
        ((FFmpegFrameRecorder) recorder).recordSamples(44100, 2, sBuff);

        // 取一帧
        captureFrame = grabber.grab();

        if (null==captureFrame) {
            log.error("帧对象为空");
            break;
        }
        OpenCVFrameConverter.ToIplImage openCVConverter = new OpenCVFrameConverter.ToIplImage();
        // 将帧对象转为mat对象
        long stime = System.currentTimeMillis();

        mat = openCVConverter.convertToMat(captureFrame);
        previewCanvas.showImage(openCVConverter.convert(mat));

        long etime = System.currentTimeMillis();

        // 子类输出
        recorder.record(openCVConverter.convert(mat));
        int t = (int) (1000/frame-(etime-stime)-1);
        //System.out.println(t);
        // 适当间隔,让肉眼感受不到闪屏即可
        System.out.println(deStrings[i]+"-"+(etime-stime2));
        if(t>0) {
          Thread.sleep(t);
        }
    }