Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add some sound data to existing mp3 file Android,lame encoder

So, this is how mp3 is encoded from mic to file in android :

private void startBufferedWrite(final File file) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                output = null;
                try {
                    output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
                    while (mIsRecording) {
                        int readSize = mRecorder.read(buffer, 0, buffer.length);
                        if (readSize > 0) {
                            int bytesEncoded = androidLame.encode(buffer, buffer, readSize, mp3buffer);
                            if (bytesEncoded > 0) {
                                try {
                                    output.write(mp3buffer, 0, bytesEncoded);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                } catch (IOException e) {
                    Log.e("Error writing file : ", e.getMessage());
                }
            }
        }).start();
    }

Everything above is working correctly and providing a new mp3 file which is played ok from audio players

Now i just read that mp3 file from InputStream and get the file bytes array :

private void old_mp3_to_new_mp3(final File mp3, final File mp3_new) throws IOException {
        try {
            int size = 4;
            byte[] rawData = new byte[(int) mp3.length()];
            RandomAccessFile input = new RandomAccessFile(mp3, "rw");
            byte[] header = new byte[size];
            input.read(header, 0, size);
            //noinspection ResultOfMethodCallIgnored
            input.read(rawData);
            input.close();
            byte[] bytes = new byte[100000]; //create random bytes to write to mp3 as Random audio ???
            new Random().nextBytes(bytes);
            FileOutputStream output = new FileOutputStream(mp3_encrypted);
            FileChannel channel = output.getChannel();
            channel.write(ByteBuffer.wrap(header));
            channel.write(ByteBuffer.wrap(rawData));
            channel.write(ByteBuffer.wrap(bytes)); // if comment this line the mp3 new file is generated ok but it's the same with recording, but if wanted to write new random bytes the mp3 is generated but the file says that is corrupted...
            output.close();
            //noinspection ResultOfMethodCallIgnored
            mp3.delete();
            callbackListener.perfundoi_shkrimi_dhe_enkriptimi(mp3_encrypted);
        } catch (Exception ignored) {
            callbackListener.perfundoi_shkrimi_dhe_enkriptimi(mp3_encrypted);
        }
    }

So how to add some new audio data to existing mp3 file, or maybe there is any options to encode old bytes + new bytes to new mp3 file to join together ?

For more info where is the part that cause problems please read the comment is the second code.

To explain in other way :

mic -> mp3 ; mp3 file -> bytes + new_bytes -> mp3;

So, can we modify existing mp3 file byte sound data without re-encoding it ?

like image 310
EAK TEAM Avatar asked Jun 06 '18 00:06

EAK TEAM


1 Answers

Try this:

String wavFile1 = "C:\\1.mp3";
String wavFile2 = "C:\\2.mp3";
FileInputStream fistream1 = new FileInputStream(wavFile1);  // first source file
FileInputStream fistream2 = new FileInputStream(wavFile2);//second source file
SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
FileOutputStream fostream = new FileOutputStream("D://merge1.mp3");//destinationfile

int temp;

while( ( temp = sistream.read() ) != -1)
{
    // System.out.print( (char) temp ); // to print at DOS prompt
    fostream.write(temp);   // to write to file
}
fostream.close();
sistream.close();
fistream1.close();
fistream2.close();

Reference

like image 133
Amr Berag Avatar answered Nov 01 '22 17:11

Amr Berag