【问题标题】:android Audio Record not playing the whole PCM fileandroid Audio Record 不播放整个 PCM 文件
【发布时间】:2013-07-16 07:29:28
【问题描述】:

我的 PCM 文件是使用录制的。

try {

        DataOutputStream dos = new DataOutputStream(
                new BufferedOutputStream(
                        new FileOutputStream(recordingFile)));

        int bufferSize = AudioRecord.getMinBufferSize(frequency,
                channelConfiguration, audioEncoding);

        AudioRecord audioRecord = new AudioRecord(
                MediaRecorder.AudioSource.MIC, frequency,
                channelConfiguration, audioEncoding, bufferSize);

        AudioTrack audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC,
                frequency, AudioFormat.CHANNEL_OUT_STEREO, audioEncoding,
                bufferSize, AudioTrack.MODE_STREAM);

        short[] buffer = new short[blockSize];
        double[] toTransform = new double[blockSize];
        int readBytes = 0;
        int writtenBytes = 0;

        audioRecord.startRecording();
        audioPlayer.play();

        AudioManager audioManager = (AudioManager) ctx
                .getSystemService(Context.AUDIO_SERVICE);

        while (started) {
            int bufferReadResult = audioRecord.read(buffer, 0, blockSize);

            for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                toTransform[i] = (double) buffer[i] / 32768.0; // signed
                // 16
                dos.writeShort(buffer[i]);

            } // bit

            // filterAudio(bufferSize, toTransform, frequency);
            transformer.ft(toTransform);
            publishProgress(toTransform);

            // capture data and record to file

            if (audioManager.isWiredHeadsetOn()) {
                if (audioPlayer.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) {
                    audioPlayer.play();
                }
                if (AudioRecord.ERROR_INVALID_OPERATION != bufferReadResult) {
                    writtenBytes += audioPlayer.write(buffer, 0,
                            bufferReadResult);
                }
            } else {
                if (audioPlayer.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
                    audioPlayer.pause();
                }
            }

        }

        audioRecord.stop();
        audioPlayer.stop();
        audioRecord.release();
        audioPlayer.release();
        try {
            dos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    } catch (Throwable t) {
        t.printStackTrace();
        Log.e("AudioRecord", "Recording Failed");
    }

    return null;

我玩它:

private AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... params) {
        try {

            musicLength = (int) (recordedFile.length() / 2);
            music = new short[musicLength];

            InputStream is = new FileInputStream(recordedFile);
            BufferedInputStream bis = new BufferedInputStream(is);
            DataInputStream dis = new DataInputStream(bis);

            int i = 0;
            while (dis.available() > 0) {
                music[i] = dis.readShort();
                i++;
            }

            dis.close();

            audioTrackRecorded = new AudioTrack(AudioManager.STREAM_MUSIC,
                    frequency, AudioFormat.CHANNEL_CONFIGURATION_STEREO,
                    AudioFormat.ENCODING_PCM_16BIT, musicLength,
                    AudioTrack.MODE_STREAM);

            audioTrackRecorded.write(music, 0, musicLength);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(Void result) {
        progressBarLayout.setVisibility(View.GONE);
        seekbarLayout.setVisibility(View.VISIBLE);

        isInitialized = true;

    };
};

我在播放此 PCM 时遇到问题,在播放过程中我只得到了一半。希望你能在这方面帮助我。谢谢。

【问题讨论】:

  • 首先要检查:文件是否正常?如果你玩它,例如在您计算机上的 Audacity 中,它是否包含您希望它包含的所有音频?下一步,audioEncodingchannelConfiguration 设置为什么?您是否有机会尝试以立体声播放单声道内容?
  • 我已经在我的 PC 中使用 audacity 播放了它,并且 pcm 文件的播放正常。我使用了 AudioFormat.CHANNEL_CONFIGURATION_STEREO 和 AudioFormat.ENCODING_PCM_16BIT。在录制和播放期间。
  • 在文件读取循环之后,music.length 是否与文件中的短裤数量相匹配? audioTrackRecorder.write 的返回值是否也与此值匹配?
  • 感谢您的回复 我已经通过修改musicLength = (int) (recordedFile.length() / 2); 解决了我的问题to musicLength = (int)recordedFile.length();

标签: android audio pcm audiotrack


【解决方案1】:

这是我播放 PCM 音频文件的代码...享受:)

void playRecord() {

    audioTrack = null;

    File file = new File(AudioSavePathInDevice, NameAudio);

    int shortSizeInBytes = Short.SIZE/Byte.SIZE;

    final int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);

    final short[] audioData = new short[bufferSizeInBytes];

    try {
        InputStream inputStream = new FileInputStream(file);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

        int j = 0;
        while(dataInputStream.available() > 0){
            audioData[j] = dataInputStream.readShort();
            j++;

        }

        dataInputStream.close();


        audioTrack = new AudioTrack(3,
                11025,
                2,
                2,
                bufferSizeInBytes,
                1);

        audioTrack.play();
        audioTrack.write(audioData, 0, bufferSizeInBytes);


    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2014-10-11
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多