Добавить некоторые звуковые данные в существующий mp3-файл Android, Lame Encoder - PullRequest
0 голосов
/ 06 июня 2018

Итак, вот как mp3 кодируется с микрофона на файл в 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();
    }

Все выше работает правильно и обеспечивает новый mp3-файл, который хорошо воспроизводится с аудиоплееров

Теперь я просто читаю этот mp3-файл из InputStream и получаю массив байтов файла:

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);
        }
    }

Итак, как добавить новые аудиоданные в существующий mp3-файл, или, возможно, есть какие-либо опции для кодирования старых байтов +новые байты в новый mp3-файл для объединения?

Для получения дополнительной информации, где часть, которая вызывает проблемы, пожалуйста, прочитайте комментарий второй код.

Чтобы объяснить по-другому:

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

Итак, можем ли мы изменить существующие байтовые звуковые данные mp3-файла без перекодирования?

Ответы [ 2 ]

0 голосов
/ 16 июня 2018

Позвольте мне попытаться ответить на ваш вопрос:

Итак, как добавить новые аудиоданные в существующий mp3-файл, или, возможно, есть какие-либо варианты кодирования старых байтов + новых байтов в новый mp3-файл.объединить?

если под "добавить немного аудио" вы подразумеваете добавление или добавление mp3 к другим аудио-данным, или ответ на них, ответ - ДА, вы можете сделать это без перекодирования

.класс, который вы будете использовать, MediaMuxer, полезную информацию вы можете найти на https://developer.android.com/reference/android/media/MediaMuxer
https://bigflake.com/mediacodec/

0 голосов
/ 14 июня 2018

Попробуйте это:

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();

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...