Android Audio Recorder with Pause and Resume Features

is there anyone who can help me develop a flexible audio recorder with play and pause functions?

Noted: I used PauseResumeAudioRecorder . This is good, but not flexible, as when I stop recording my file will corrupt. I also used MP4Parser library, but it takes a long time to merge two large files.

Here is the Mp4Wrapper class I am using to merge two files.

public final class Mp4ParserWrapper {

public static final String TAG = "Mp4ParserWrapper";

public static final int FILE_BUFFER_SIZE = 1024;

private Mp4ParserWrapper() {
}

/**
 * Appends mp4 audios/videos: {@code anotherFileName} to {@code mainFileName}.
 *
 * @param mainFileName The first file path.
 * @param anotherFileName The second file path.
 *
 * @return true if the operation was made successfully.
 */
public static boolean append(String mainFileName, String anotherFileName){
    try {
        File targetFile = new File(mainFileName);
        File anotherFile = new File(anotherFileName);
        if (targetFile.exists() && targetFile.length() > 0) {
            String tmpFileName = mainFileName + ".tmp";
            append(mainFileName, anotherFileName, tmpFileName);
            copyFile(tmpFileName, mainFileName);
            return anotherFile.delete() && new File(tmpFileName).delete();
        } else {
            if (!targetFile.exists()) {
                if (!targetFile.getParentFile().exists()) {
                    if (!targetFile.getParentFile().mkdirs()) {
                        return false;
                    }
                }
                if (!targetFile.createNewFile()) {
                    return false;
                }
            }
            copyFile(anotherFileName, mainFileName);
            return anotherFile.delete();
        }
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, "Appending two mp4 files failed with exception", e);
        return false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;

    }
}


private static void copyFile(final String from, final String destination)
        throws IOException {
    FileInputStream in = new FileInputStream(from);
    FileOutputStream out = new FileOutputStream(destination);
    copy(in, out);
    in.close();
    out.close();
}

private static void copy(FileInputStream in, FileOutputStream out) throws IOException {
    byte[] buf = new byte[FILE_BUFFER_SIZE];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
}

public static void append(
        final String firstFile,
        final String secondFile,
        final String newFile) throws Exception {
    final Movie movieA = MovieCreator.build(new FileDataSourceImpl(new File(secondFile)));
    final Movie movieB = MovieCreator.build(new FileDataSourceImpl(firstFile));

    final Movie finalMovie = new Movie();

    final List<Track> movieOneTracks = movieA.getTracks();
    final List<Track> movieTwoTracks = movieB.getTracks();

    for (int i = 0; i < movieOneTracks.size() || i < movieTwoTracks.size(); ++i) {
        finalMovie.addTrack(new AppendTrack(movieTwoTracks.get(i), movieOneTracks.get(i)));
    }

    final Container container = new DefaultMp4Builder().build(finalMovie);

    final FileOutputStream fos = new FileOutputStream(new File(String.format(newFile)));
    final WritableByteChannel bb = Channels.newChannel(fos);
    container.writeContainer(bb);
    fos.close();
}

      

}

+3


source to share


2 answers


I suggest you use mp4parser in this file, you can see that it checks the track size and matches that the code will add it fine.



0


source


I am stuck on the same problem, does anyone have a solution? It even takes 8 seconds to add a 10 second audio recording for a 36KB file.



0


source







All Articles