How to encode Recorded voice to ogg vorbis?

2020-02-09 05:16发布

问题:

I have recorded voice with android AudioRecord and I would like to convert it to ogg vorbis as it is patent free. I have try vorbis-java beta, but it seem not work or I make some mistake.

Here are my code :

int     frequency     = 44100;
int     channel       = AudioFormat.CHANNEL_IN_STEREO;
int     mAudioSource = MediaRecorder.AudioSource.MIC;
int mAudioEncoder = AudioFormat.ENCODING_PCM_16BIT;
try {
            final File outputFile = new File(mOutputPath);
            DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
            int bufferSize = AudioRecord.getMinBufferSize(frequency, channel, mAudioEncoder);
            AudioRecord audioRecord = new AudioRecord(mAudioSource, frequency, channel, mAudioEncoder, bufferSize);
            short[] buffer = new short[bufferSize];
            audioRecord.startRecording();
            while (isRecordStart) {
                int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
                for(int i = 0; i < bufferReadResult; i++) {
                    dos.writeShort(buffer[i]);
                }
            }
            audioRecord.stop();
            dos.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

I save it to a file with extension wav and use example of vorbis-java to encode, but output is only zzz.......

How to encode this to ogg vorbis in android?

回答1:

I think i read this question a few weeks ago and was also super frustrated. I ended up writing the needed ndk wrapper to use Xiph.org's stuff. The only catch is that in order to make it run well, I had to enable floating point instructions. Emulators don't have floating point, so it'll crash the emulator. Run it on pretty much any phone, though, and you'll be good to go. It's designed to emulate a FileInputStream and FileOutputStream for interfacing with the vorbis files.

https://github.com/nwertzberger/libogg-vorbis-android



回答2:

You seem to write raw audio data into a file instead of wav format. Wav format does have headers, not just audio data.

Note: Don't use vorbis-java, but compile from libogg and libvorbis sources at http://www.xiph.org/downloads/

Use android NDK to compile them for embedding in your apk file.

Then you can call the native code from your app to encode the audio data.