lassana / continuous-audiorecorder Goto Github PK
View Code? Open in Web Editor NEWImplementation of the missing feature in Android SDK: audio recorder with a pause.
License: BSD 2-Clause "Simplified" License
Implementation of the missing feature in Android SDK: audio recorder with a pause.
License: BSD 2-Clause "Simplified" License
When generating a custom MediaRecorderConfig
and specifying VORBIS
(https://developer.android.com/reference/android/media/MediaRecorder.AudioEncoder.html#VORBIS) as the enum value for encoding, I receive the error message 04-12 15:38:40.504 E/MediaRecorder(20929): start failed: -2147483648
. This does not occur with any other choice of encoding.
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.RuntimeException: start failed.
at android.media.MediaRecorder.native_start(Native Method)
at android.media.MediaRecorder.start(MediaRecorder.java:852)
at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:97)
at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:79)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
When user click quickly on record and pause buttons app close activity and return without any crash report
the problem here
private void appendToFile(final String targetFileName, final String newFileName) {
Mp4ParserWrapper.append(targetFileName, newFileName);//<- here
}
when user click quickly append function doesn't finish appending so app crash but not show any exception stacktrace
thanks for sharing this lib
Created audio file is not playing in iOS devices whereas it plays in android and web browsers. Can you please help why it is happening?
I would like to get the sound level of the audio coming through the mic. I am wondering if we can have an implementation for that... lemme know. I can help out and create the pull request if you want.
Where is the recorded audio file located? how can i move it to another location?
I just downloaded the latest build here: https://drone.io/github.com/lassana/continuous-audiorecorder/files and installed it on a Samsung S6 running 6.0.1. When I press record, it asks me if I want to allow permissions for recording and writing to storage, when I allow them, it gives me the impression that it begins recording. I speak into the mic for about 30 seconds and then hit Pause. When I hit play, nothing happens. I also couldn't find where the recording file is located to see if it even generated one / recorded the audio. Where is that located?
I use your example,I gave him the file name in MP3 format,But the fact is the AAC format,How to make him a real MP3 format?
When using the standard MediaRecorder class, it is not necessary to create a file on the device prior to recording, as long the destination file path is set, using MediaRecorder.setOutputFile(String outputFilePath).
When using AudioRecorder, the output file needs to be created and the destination file path to this output file needs to be set prior to recording, using AudioRecorderBuilder.fileName(String outputFilePath).
Here is the original code using MediaRecorder, which was functional:
private void recordAudio() {
String fileName = UUID.randomUUID().toString().replaceAll("-", "");
outputFile = getFilesDir().getAbsolutePath();
outputFile += "/" + fileName + ".3gp";
MediaRecorder myRecorder = MediaRecorder;
try {
myRecorder = new MediaRecorder();
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myRecorder.setOutputFile(outputFile);
myRecorder.setAudioChannels(1);
myRecorder.prepare();
myRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Here is the functional version of the code using AudioRecorder:
private void recordAudio(){
String fileName = UUID.randomUUID().toString().replaceAll("-", "");
outputFile = this.getFilesDir().getPath();
outputFile += "/" + fileName + ".mp4";
File file = new File(outputFile);
if (!file.exists()) {
try {
file.createNewFile();
}
catch (IOException e) {
e.printStackTrace();
}
}
myRecorder = AudioRecorderBuilder.with(this)
.fileName(outputFile)
.config(AudioRecorder.MediaRecorderConfig.DEFAULT)
.loggable()
.build();
myRecorder.start(new AudioRecorder.OnStartListener() {
@Override
public void onStarted() {
// started
changeButtonsToRecordingOptions();
}
@Override
public void onException(Exception e) {
// error
Log.i("AudioRecorder", "ERROR With continuous audio recorder!");
}
});
}
I believe this error is occurring due to some issue with Mp4ParserWrapper not properly creating the file, which I believe should happen in Line 49.
An example of the final value of the String outputFile is: /data/user/0/com.packageName.app/files/fb0409ac7dd743d6867151c034d145b8.mp4
I'm using a Samsung Galaxy 5 and Android 6.0.
Thanks,
Andy
Hi
My app use ACRA crash report
this Exception reported several times:
Please handle this exception. thanks.
java.lang.RuntimeException:
An error occurred while uting doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$Serialutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolutor.runWorker(ThreadPoolutor.java:1113)
at java.util.concurrent.ThreadPoolutor$Worker.run(ThreadPoolutor.java:588)
at java.lang.Thread.run(Thread.java:818)nCaused by: java.util.NoSuchElementException
at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:59)
at java.util.AbstractCollection.toArrayList(AbstractCollection.java:349)
at java.util.AbstractCollection.toArray(AbstractCollection.java:339)
at java.util.ArrayList.addAll(ArrayList.java:188)
at com.googlecode.mp4parser.authoring.tracks.AppendTrack.getSamples(AppendTrack.java:357)
at com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder.build(DefaultMp4Builder.java:92)
at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:105)
at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:48)
at com.github.lassana.recorder.AudioRecorder.appendToFile(AudioRecorder.java:287)
at com.github.lassana.recorder.AudioRecorder.access$900(AudioRecorder.java:18)
at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:131)
at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)n ... 4 morenjava.util.NoSuchElementException
at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:59)
at java.util.AbstractCollection.toArrayList(AbstractCollection.java:349)
at java.util.AbstractCollection.toArray(AbstractCollection.java:339)
at java.util.ArrayList.addAll(ArrayList.java:188)
at com.googlecode.mp4parser.authoring.tracks.AppendTrack.getSamples(AppendTrack.java:357)
at com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder.build(DefaultMp4Builder.java:92)
at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:105)
at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:48)
at com.github.lassana.recorder.AudioRecorder.appendToFile(AudioRecorder.java:287)
at com.github.lassana.recorder.AudioRecorder.access$900(AudioRecorder.java:18)
at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:131)
at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$Serialutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolutor.runWorker(ThreadPoolutor.java:1113)
at java.util.concurrent.ThreadPoolutor$Worker.run(ThreadPoolutor.java:588)
at java.lang.Thread.run(Thread.java:818)
The issue lies in the following code:
if (targetFile.exists() && targetFile.length() > 0) { String tmpFileName = mainFileName + ".tmp"; append(mainFileName, anotherFileName, tmpFileName); copyFile(tmpFileName, mainFileName); rvalue = anotherFile.delete() && new File(tmpFileName).delete(); } else if (targetFile.getParentFile().mkdirs() && targetFile.createNewFile()) { copyFile(anotherFileName, mainFileName); rvalue = anotherFile.delete(); }
mkdirs()
returns false if directory exists so does createNewFile()
if file exists.
Here's my stack Trace :
11-30 16:27:20.674 2436-3017/com. E/MediaRecorder: stop failed: -1007
11-30 16:27:20.675 2436-2436/com. W/System.err: java.lang.RuntimeException: stop failed.
11-30 16:27:20.675 2436-2436/com.W/System.err: at android.media.MediaRecorder.stop(Native Method)
11-30 16:27:20.675 2436-2436/com. W/System.err: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:125)
11-30 16:27:20.675 2436-2436/com. W/System.err: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
11-30 16:27:20.675 2436-2436/com.W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-30 16:27:20.675 2436-2436/com.W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-30 16:27:20.675 2436-2436/com. W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-30 16:27:20.675 2436-2436/com. W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-30 16:27:20.675 2436-2436/com. W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-30 16:27:20.675 2436-2436/com. W/System.err: at java.lang.Thread.run(Thread.java:818)
Hi guys, i was wondering how I could use this and also implement an audio record visualizer of some sort.
11-05 21:54:12.126 2156-2172/com.apptest.fr.myapptest W/EGL_emulation: eglSurfaceAttrib not implemented
11-05 21:54:12.126 2156-2172/com.apptest.fr.myapptest W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad7bdb40, error=EGL_SUCCESS
11-05 21:54:12.219 2156-2172/com.apptest.fr.myapptest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xabf11a60
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: Process: com.apptest.fr.myapptest, PID: 2156
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$3.done(AsyncTask.java:309)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:242)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: Caused by: java.lang.RuntimeException: setAudioSource failed.
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.media.MediaRecorder.setAudioSource(Native Method)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:89)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:79)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
11-05 21:54:21.851 2156-2384/com.apptest.fr.myapptest E/MediaRecorder: stop called in an invalid state: 0
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: Audio Recorder error !
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: java.lang.IllegalStateException
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at android.media.MediaRecorder.stop(Native Method)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:125)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.lang.Thread.run(Thread.java:818)
11-05 21:54:22.119 2156-2172/com.apptest.fr.myapptest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xabf11ad0
11-05 21:54:26.907 2156-2156/com.apptest.fr.myapptest I/Choreographer: Skipped 287 frames! The application may be doing too much work on its main thread.
11-05 21:54:27.267 2156-2163/com.apptest.fr.myapptest W/art: Suspending all threads took: 84.007ms
11-05 21:54:28.923 2156-2378/? I/Process: Sending signal. PID: 2156 SIG: 9
Hi.I try save recorded audio file in sdcard/mypath but I can not do this.Please advice
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.