如果我需要每秒44000字节,每1/10秒需要多少短路

时间:2012-12-26 12:55:27

标签: java audio video encode

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

具体而言,保持采样率和尺寸

我正在使用TargetDataLine将数据读入byte[]。此数据已经格式化为 BigEndian 神奇的是在适当的时候提供适当数量的数据 我的AudioFormat看起来像这样:

  • 采样率:44000Hz
  • 比特样本大小:16
  • 签名:是的
  • BigEndian:true

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

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

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

    粗略的计算让我得到4782短裤的答案一秒钟 我知道当您传递要编码的音频时它必须是一整秒
    所以我必须每次传递480个短片,然后在第10次传球后最终编码 请告诉我此扣除是否正确?

    1 个答案:

    答案 0 :(得分:4)

    如果您的采样率为44,000 Hz,则为16位(两个字节),即每秒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,则无需更改。