1

我有一个线程java.awt.Robot使用 Xuggler 进行屏幕截图,然后将它们编码为视频。
循环对图像进行编码,然后根据帧速率使线程休眠一段时间。
到目前为止一切都很好。当我尝试对音频进行编码时,就会出现问题。

具体来说,保持采样率和大小

我正在使用TargetDataLine将数据读入byte[]. 此数据已采用BigEndian格式。
神奇之处在于在适当的时间提供适当数量的数据。
我的AudioFormat样子是这样的:

  • 采样率:44000Hz
  • 样本大小(以位为单位):16
  • 签名:真实
  • 大端:真

  • 假设 10fps 和 44000Hz 采样率,我需要提供
  • 的大小应该是byte[]多少?
  • 多少数据?(测量是short因为那是 Xuggler 想要的)
  • 我什么时候调用该encodeAudio()方法?我的意思是经过 10 次循环或 5 次循环后,等等。
  • 杂项:

    社区成员 Alex 我给了我这个公式:

    shortArray.length == ((timeStamp - lastTimeStamp) / 1e+9) * sampleRate * channels;  
    

    粗略的计算让我得到了 4782 短裤一秒钟的答案。
    我知道当你传递要编码的音频时,它必须持续一整秒
    所以我必须每次通过捕获 480 条短裤,然后在第 10 遍之后最终对其进行编码。
    请告诉我这个扣除是否正确?

    4

    1 回答 1

    4

    如果您有 16 位(两个字节),采样率为 44,000 Hz,即每秒 88,000 字节。如果你有立体声,它是两倍。在 1/10 秒内,您需要其中的 1/10。即每分秒 8,800 字节(1/10 秒)

    如何从具有 byte[] 作为后备数组的 ByteBuffer 中检索 short[]

    byte[] bytes = { };
    ByteBuffer bb = ByteBuffer.wrap(bytes);
    
    short[] shorts = new short[bb.remaining()/2];
    bb.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
    

    如果订单是 BigEndian,则无需更改。

    于 2012-12-26T14:29:05.787 回答