当前位置: 首页 > 知识库问答 >
问题:

错误java.lang.ArrayIndexOutOfBoundsException:长度=166074;索引=166074

徐欣德
2023-03-14

我正在尝试合并两个MP3文件到一个单一的MP3文件。文件保存在SD卡中,但无法播放。首先,我将MP3转换成存储/res/raw文件夹中的WAV文件,并输出到SD卡上。它还给出了ArrayOutOfBoundsException

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // MediaPlayer mediaPlayer= MediaPlayer.create(getApplicationContext(),getAssets()+"" )

        try {
            mixSound();
        } catch (Exception e) {
            // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }

    private void mixSound()  {
        try {
            AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,       AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 44100, AudioTrack.MODE_STREAM);

            // Uri url = Uri.parse("android.resource://" + getPackageName() + "/" +    R.raw.one);
            // System.out.println("MainActivity.mixSound() url1"+url.toString());
            // File file = new File(url.toString());
            // Uri url2 = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.two);
            // System.out.println("MainActivity.mixSound() url1"+url2.toString());
            // File file2 = new File(url2.toString());

            // InputStream in1=new FileInputStream(file);      
            // InputStream in2=new FileInputStream(file2); 

            // int rid = getResources().getIdentifier(getPackageName() + ":raw/one.mp3" , null, null);  
            // get the file as a stream  
            // InputStream in1 = getResources().openRawResource(rid);
            // InputStream in1=new FileInputStream(""); 
            //      
            // int rid2 = getResources().getIdentifier(getPackageName() + ":raw/two.mp3" , null, null);  
            // get the file as a stream  
            // InputStream in2 = getResources().openRawResource(rid2);
            //      
            // InputStream in2=new  FileInputStream(getResources().openRawResource(R.raw.one).toString()); 

            InputStream in1 = getApplicationContext().getResources().openRawResource(R.raw.media);
            InputStream in2 = getApplicationContext().getResources().openRawResource(R.raw.media1);

            byte[] music1 = null;
            music1= new byte[in1.available()]; 
            music1=convertStreamToByteArray(in1);
            in1.close();

            byte[] music2 = null;
            music2= new byte[in2.available()]; 
            music2=convertStreamToByteArray(in2);
            in2.close();

            byte[] output = new byte[music2.length];

            audioTrack.play();
            int j=0;
            for(int i=0; i < output.length; i++){
                float mixed;
                if(j<music1.length){
                    float samplef1 = music1[j] / 128.0f; // 2^7=128
                    float samplef2 = music2[i] / 128.0f;
                    mixed = samplef1 + samplef2;
                    j++;
                }else{
                    float samplef2 = music2[i] / 128.0f;
                    mixed = samplef2; 
                }

                float samplef1 = music1[j] / 128.0f; // 2^7=128
                float samplef2 = music2[i] / 128.0f;
                mixed = samplef1 + samplef2;

                // reduce the volume a bit:
                mixed *= 0.8;
                // hard clipping
                if (mixed > 1.0f) mixed = 1.0f;

                if (mixed < -1.0f) mixed = -1.0f;

                byte outputSample = (byte)(mixed * 128.0f);
                output[i] = outputSample;
            }

            audioTrack.write(output, 0, output.length);

            //convert array of bytes into file
            FileOutputStream fileOuputStream = new FileOutputStream(Environment.getExternalStorageDirectory()+"/abc.wav"); 
            fileOuputStream.write(output);
            fileOuputStream.close();
            System.out.println("MainActivity.mixSound()==>Done");
            System.out.println("Done");
        }catch(Exception e){
            //  e.printStackTrace();
            System.out.println("MainActivity.mixSound()==>"+e);
        }
    }

    public static byte[] convertStreamToByteArray(InputStream is) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buff = new byte[10240];
        int i = Integer.MAX_VALUE;
        while ((i = is.read(buff, 0, buff.length)) > 0) {
            baos.write(buff, 0, i);
        }

        return baos.toByteArray(); // be sure to close InputStream in calling function
    }
}

共有1个答案

呼延弘方
2023-03-14

ArrayOutOfBoundException在代码行中

for(int i=0; i < output.length; i++)

应该是

for(int i=0; i < output.length-1; i++)

也如下面代码中的grattmandu03所建议的

if(j<music1.length)

应该是

if(j<music1.length-1)
 类似资料:
  • 上面的代码是用来在数组中插入一个元素的。我尝试将数组的长度更改为9,但问题仍然存在。

  • 这个错误开始突然出现,当我登录到我的应用程序(通过firebase)时,它必须显示一个列表,然而,当登录时,它没有显示任何东西,并且这个错误开始在日志中出现几次 日志: 我看不到这个错误来自什么activity或片段,我只知道当我之后登录到我的列表时,它在列表中没有显示任何东西并且这些错误在日志中以一行的形式出现

  • 问题内容: 我有一张这样的桌子: 和这样的一个: 和这样的SQL语句 如果我解释给我这个: 对于一百万行,这非常慢。我尝试使用以下方法在products.name上添加索引: 这给出了: 我认为Sub_part列显示已在索引中(以字节为单位)的前缀,如本页中所述。 当我重新解释查询时,我得到: 看起来好像没有使用新索引。如 本页所述,如果索引是前缀索引,则不会用于排序。实际上,如果我用以下方法截断

  • 我正在为学校写一个充当收银机的程序。我要求输入项目的价格,并将它们播放到一个正在进行的ArrayList中,直到用户输入-1或0。0是在错误的情况下重新输入以前的价格,-1终止循环。 我得到了 我在Eclipse中运行Java11。 在不使用该方法的情况下,代码运行良好,因为我减少了计数器,并且在循环的下一次迭代中,无论是否删除了以前的数组位置,都将覆盖它。方法本身被设置为删除ArrayList.

  • 我正在编写一个简单的Java代码,在输入第一个输入之后,我得到了这个错误: 代码: