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

EAK TEAM :

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 ?

Rafael Lima :

Let me try to answer your question:

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 ?

if by "add some audio" you mean append or prepend the mp3 with other audio data, the answer is YES, you can do it without reencode

The class you will use is MediaMuxer you can find usefull info at https://developer.android.com/reference/android/media/MediaMuxer
https://bigflake.com/mediacodec/

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=471102&siteId=1