查看多个通道32bit音频pcm数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查看多个通道32bit音频pcm数据相关的知识,希望对你有一定的参考价值。

参考技术A

本文分析一个32位多通道pcm数据,一方面简单解释一下pcm数据格式,另外一方面看清楚实际数据的精度是多少。
说明: 这是一个alsa采集到的10路32bit的pcm数据

我们可以看到,这个数据中DC Offset是使用百分比表示,是4.41%,Sample Value是1446.41。

在 HTC One 上以 16khz 单声道 PCM (WAV) 录制时出现断断续续的音频

【中文标题】在 HTC One 上以 16khz 单声道 PCM (WAV) 录制时出现断断续续的音频【英文标题】:Choppy Audio when recording in 16khz mono PCM (WAV) on HTC One 【发布时间】:2013-07-23 02:55:41 【问题描述】:

我正在开发一个需要以 16khz/16bits/单声道(1 个通道)录制 PCM 音频的应用。它在摩托罗拉 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();

【问题讨论】:

我的应用程序在 HTC One 中以 16KHz,单声道记录良好。看看这个来测试你的HTC:play.google.com/store/apps/details?id=com.peshal.soundrecorder 您的应用在 16khz 单声道中适用于我。如果您的录音代码与我的不同,您能否发布一个示例,以便我可以看到我做错了什么? 【参考方案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();
    


【讨论】:

以上是关于查看多个通道32bit音频pcm数据的主要内容,如果未能解决你的问题,请参考以下文章

SDL播放PCM音频数据

怎么把sample大小为32bit的PCM音频流编码成aac格式

从线性 PCM 中提取音频通道

在 HTC One 上以 16khz 单声道 PCM (WAV) 录制时出现断断续续的音频

使用带有 C# 的 MediaTranscoder 将 PCM 音频转码为 MP3

在 pcm 音频中交换字节序