Android Java 将 Audiorecord / Audiotrack 保存到文件

use*_*136 5 android outputstream audiorecord audiotrack

如果用户按下开始按钮,我有一个短代码可以将录制的音频实时传输到扬声器。在他按下停止按钮后,缓冲的音频应该保存在一个 mp3 文件中。该文件已创建,但它是空的。如果我尝试播放文件,我听不到任何声音。

public class MainActivity extends Activity {
    boolean m_stop = true;
    AudioTrack m_audioTrack;
    Thread m_noiseThread;
    static final int bufferSize = 200000;
    AudioRecord arec;
    FileOutputStream os = null;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onStartStopClicked(View v)
    {
        Button StartButton = (Button)findViewById(R.id.StartStop);
        if(m_stop) {
            start(); 
        } else {
            stop();
        }   
    }
    Runnable m_noiseGenerator = new Runnable()
    {       
        public void run()
        {
            String filepath = Environment.getExternalStorageDirectory().toString();
            os = new FileOutputStream(filepath + "/test.mp3");

            int buffersize1 = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
            arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize1);
            m_audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 8000, AudioTrack.MODE_STREAM);

            byte[] buffer = new byte[buffersize1];
            arec.startRecording();
            m_audioTrack.play();
            while(!m_stop)
            {
                arec.read(buffer, 0, buffersize1);
                m_audioTrack.write(buffer, 0, buffer.length);    
                os.write(buffer);            
            }
        }
    };
    public void start()
    {
        m_stop = false;
        m_noiseThread = new Thread(m_noiseGenerator);
        m_noiseThread.start();
    }
    public void stop()
    {
        m_stop = true;    
        arec.stop();        
        m_audioTrack.stop();
        os.flush();
        os.close();
    }   
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?那将是非常感谢:)