如果有的话,以下两个循环之间的性能差异是什么?
for (Object o: objectArrayList) {
o.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
和
for (int i=0; i<objectArrayList.size(); i++) {
objectArrayList.get(i).DoSomething();
}
Run Code Online (Sandbox Code Playgroud) 如何short在Java中将(2个字节)转换为字节数组,例如
short x = 233;
byte[] ret = new byte[2];
...
Run Code Online (Sandbox Code Playgroud)
它应该是这样的.但不确定.
((0xFF << 8) & x) >> 0;
Run Code Online (Sandbox Code Playgroud)
编辑:
你也可以使用:
java.nio.ByteOrder.nativeOrder();
Run Code Online (Sandbox Code Playgroud)
发现以获取本机位顺序是大还是小.另外,以下代码取自java.io.Bits:
反之亦然.
我有一些问题,将音频数据存储在一个字节数组中,将其转换为大端短数组,对其进行编码,然后将其更改回字节数组.这就是我所拥有的.原始音频数据存储在audioBytes2中.我使用相同的格式进行解码,而cos函数则使用减号.不幸的是,更改字节和短数据类型是不可协商的.
short[] audioData = null;
int nlengthInSamples = audioBytes2.length / 2;
audioData = new short[nlengthInSamples];
for (int i = 0; i < nlengthInSamples; i++) {
short MSB = (short) audioBytes2[2*i+1];
short LSB = (short) audioBytes2[2*i];
audioData[i] = (short) (MSB << 8 | (255 & LSB));
}
int i = 0;
while (i < audioData.length) {
audioData[i] = (short)(audioData[i] + (short)5*Math.cos(2*Math.PI*i/(((Number)EncodeBox.getValue()).intValue())));
i++;
}
short x = 0;
i = 0;
while (i < audioData.length) {
x = audioData[i];
audioBytes2[2*i+1] = (byte)(x …Run Code Online (Sandbox Code Playgroud) 我正在使用jLayer解码MP3数据,通过以下调用:
SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);
Run Code Online (Sandbox Code Playgroud)
这个返回解码数据的调用返回一个short []数组.
output.getBuffer();
当我使用该方法调用AudioTrack write()时,它在我循环文件时播放正常:
at.write(output.getBuffer(), 0, output.getBuffer().length);
Run Code Online (Sandbox Code Playgroud)
但是,当我使用本答案中的任何方法将short []数组转换为byte []数组时:https://stackoverflow.com/a/12347176/1176436声音变得扭曲和抖动:
at.write(output.getBuffer(), 0, output.getBuffer().length);
Run Code Online (Sandbox Code Playgroud)
变为:
byte[] array = ShortToByte_Twiddle_Method(output.getBuffer());
at.write(array, 0, array.length);
Run Code Online (Sandbox Code Playgroud)
我做错了什么,我该怎么做才能解决它?不幸的是,我需要将pcm数据放在我正在使用的另一个第三方库的字节数组中.如果重要,该文件为22kHz,这就是实例化的方式:
at = new AudioTrack(AudioManager.STREAM_MUSIC, 22050, AudioFormat.CHANNEL_OUT_STEREO,
AudioFormat.ENCODING_PCM_16BIT, 10000 /* 10 second buffer */,
AudioTrack.MODE_STREAM);
Run Code Online (Sandbox Code Playgroud)
非常感谢你提前.
编辑:这就是我现在实例化AudioTrack变量的方式.因此对于44kHz文件,发送的值是44100,而对于22kHz文件,值是22050.
at = new AudioTrack(AudioManager.STREAM_MUSIC, decoder.getOutputFrequency(),
decoder.getOutputChannels() > 1 ? AudioFormat.CHANNEL_OUT_STEREO : AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT, 10000 /* 10 second buffer */,
AudioTrack.MODE_STREAM);
Run Code Online (Sandbox Code Playgroud)
这是解码方法:
public byte[] decode(InputStream inputStream, int startMs, int maxMs) throws …Run Code Online (Sandbox Code Playgroud) 我对如何将short数组转换为byte数组感到困惑.我有下面的short数组
short[] shrt_array = new short[]{ 0x4 , 0xd7 , 0x86, 0x8c, 0xb2, 0x14, 0xc, 0x8b, 0x2d, 0x39, 0x2d, 0x2d, 0x27, 0xcb, 0x2e, 0x79, 0x46, 0x36, 0x9d , 0x62, 0x2c };
Run Code Online (Sandbox Code Playgroud)
通过使用此链接将短数组转换为字节数组这两种转换方法,我得到以下两个不同的byte数组:
expectedByteArray = new byte[] {
(byte) 0x4, (byte) 0xd7, (byte) 0x86,
(byte) 0x8c, (byte) 0xb2, (byte) 0x14,
(byte) 0xc, (byte) 0x8b, (byte) 0x2d,
(byte) 0x39, (byte) 0x2d, (byte) 0x2d,
(byte) 0x27, (byte) 0xcb, (byte) 0x2e,
(byte) 0x79, (byte) …Run Code Online (Sandbox Code Playgroud)