【问题标题】:If I need 44000 bytes per second, how many shorts do I need per 1/10th of a second如果我每秒需要 44000 字节,那么每 1/10 秒我需要多少个短裤
【发布时间】:2012-12-12 00:42:01
【问题描述】:

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

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

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

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

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

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

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

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

    【问题讨论】:

    • 您希望每个视频帧都有特定的音频部分吗?
    • 如果您有 16 位(两个字节),采样率为 44,000 Hz,即每秒 88,000 字节。如果你有立体声,它是两倍。在 1/10 秒内,您需要其中的 1/10。
    • @PeterLawrey 将其发布为答案,以便我接受
    • 您确定您的频率是 44000 Hz 而不是 44100 Hz? 44000 是不寻常的,但 44100 是标准的。

    标签: java audio video encode


    【解决方案1】:

    如果您有 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,则无需更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多