我有一个线程使用java.awt.Robot
拍摄屏幕截图,然后使用Xuggler将它们编码为视频。
循环对图像进行编码,然后根据帧速率使线程休眠一段时间
到目前为止都很好。当我尝试编码音频时会出现问题。
我正在使用TargetDataLine
将数据读入byte[]
。此数据已经格式化为 BigEndian
神奇的是在适当的时候提供适当数量的数据
我的AudioFormat
看起来像这样:
byte[]
的大小应该是多少?
short
衡量,因为这是Xuggler想要的)encodeAudio()
方法?我的意思是在循环10次或5次传球后等。
社区成员Alex我给了我这个公式:
shortArray.length == ((timeStamp - lastTimeStamp) / 1e+9) * sampleRate * channels;
粗略的计算让我得到4782短裤的答案一秒钟
我知道当您传递要编码的音频时它必须是一整秒
所以我必须每次传递480个短片,然后在第10次传球后最终编码
请告诉我此扣除是否正确?
答案 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,则无需更改。