Прерывистый звук при записи в монофоническом формате PCM (WAV) 16 кГц на HTC One

Я разрабатываю приложение, для которого требуется запись звука PCM 16 кГц/16 бит/моно (1 канал). Он отлично работает на Motorola ATRIX, но на HTC One запись по всему файлу прерывистая. Я думаю, это потому, что он все еще пытается записать в стерео, но пишет болванки для второго канала. Если я записываю в стерео, то работает отлично, но мне нужно в моно.

Кто-нибудь слышал об этой проблеме? Микширование трека из стерео в моно не вариант из-за нехватки времени.

private static final int        RECORDER_SAMPLERATE = 16000;
private static final int        RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int        RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

private void startRecording() 
{

    int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);

    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, bufferSize);

    recorder.startRecording();
    isRecording = true;
    recordingThread = new Thread(new Runnable() 
    {
        public void run() 
        {
            try {
                writeAudioDataToFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }, "AudioRecorder Thread");
    recordingThread.start();
}

person rmooney    schedule 23.07.2013    source источник
comment
Мое приложение отлично записывает в HTC One на частоте 16 кГц, моно. Проверьте это, чтобы протестировать свой htc one: play.google.com /store/apps/details?id=com.peshal.soundrecorder   -  person Peshal    schedule 23.07.2013
comment
Ваше приложение работает для меня в 16 кГц моно. Не могли бы вы опубликовать образец вашего кода записи, если он отличается от моего, чтобы я мог видеть, что я делаю неправильно?   -  person rmooney    schedule 23.07.2013


Ответы (1)


Мне удалось решить проблему, и я нашел простое решение, которое отлично работает как на Atrix, так и на HTC One. Я не знаю, ПОЧЕМУ это работает (любое понимание этого будет очень признательно), но вот что я сделал.

Все, что я сделал, это изменил константу BufferElements2Rec с 1024 на 512. Константа используется в приведенном ниже коде. Я предполагаю, что меньший размер буфера позволил ему работать правильно.

Это моя функция writeAudioDataToFile(), вызываемая внутри потока записи:

private void writeAudioDataToFile() throws IOException 
{
    //create filename
    filePath = generateFilePath();

    //start writing data
    short sData[] = new short[BufferElements2Rec];

    FileOutputStream os = null;
    try {
        os = new FileOutputStream(filePath);
    } catch (Exception e) {
        e.printStackTrace();
    }
    byte[] headerBytes = writeWAVHeader(1);
    os.write(headerBytes, 0, headerBytes.length);
    while (isRecording)
    {
        // gets the voice output from microphone to byte format

        recorder.read(sData, 0, BufferElements2Rec);
        System.out.println("Recording audio to file" + sData.toString());
        try {
            // // writes the data to file from buffer
            byte bData[] = short2byte(sData);
            os.write(bData, 0, BufferElements2Rec * BytesPerElement);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        os.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
person rmooney    schedule 23.07.2013