用C/CCC++实现输出双声道(立体声).wav 文件

简介: audioCodec为1,channels为2,samplesPerSec为8000(非常重要)。samplesPerSec设置为8000的原因是需要用16000/2,也就是要用采样率除以通道数。这样做的原因是立体声设置语音内容时将左右声道的语音数据打散交叉放置到内容中。

  最近完成了双声道(立体声又称双轨)的语音文件录制,将心得在这里分享下。我录制的双声道文件格式是PCM,16K,16Bit的,blockAlign设置2。立体声的语音采用 0声道(左) 1声道(右) 0声道(左) 1声道(右)。具体设置如下:


audioCodec为1,channels为2,samplesPerSec为8000(非常重要)。samplesPerSec设置为8000的原因是需要用16000/2,也就是要用采样率除以通道数。这样做的原因是立体声设置语音内容时将左右声道的语音数据打散交叉放置到内容中。


void TWavMediaFile::Close()
{
   /* write wav head */
   if(m_fp && m_modified)
   {
      m_modified = false;
      rewind(m_fp);
    LOG(DETAIL, "m_fp postion:%d", ftell(m_fp));
      char buffer[44], *p = buffer;
      int32_t a;
      int16_t b;
      sprintf(p, "RIFF");
      p+=4;
      a = htolel(m_length + 44 - 8);
      memcpy(p, &a, 4);
      p+=4;
      sprintf(p, "WAVEfmt ");
      p+=8;
      a = htolel(16);
      memcpy(p, &a, 4);
      p+=4;
      LOG(DETAIL, "m_audioCodec: %d", m_audioCodec);
      b = htoles((int16_t)m_audioCodec);
      memcpy(p, &b, 2);
      p+=2;
      LOG(DETAIL, "m_channels: %d", m_channels);
      b = htoles((int16_t)m_channels);
      memcpy(p, &b, 2);
      p+=2;
      LOG(DETAIL, "m_samplesPerSec: %d", m_samplesPerSec);
      a = htolel((int32_t)m_samplesPerSec/2);
      memcpy(p, &a, 4);
      p+=4;
      LOG(DETAIL, "m_avgBytesPerSec: %d", m_avgBytesPerSec);
      a =  ((int32_t)m_avgBytesPerSec*m_channels);
      memcpy(p, &a, 4);
      p+=4;
      LOG(DETAIL, "m_blockAlign: %d", m_blockAlign);
      b = htoles((int16_t)m_blockAlign * m_channels );
      memcpy(p, &b, 2);
      p+=2;
      LOG(DETAIL, "m_bitsPerSample: %d", m_bitsPerSample);
      b = htoles((int16_t)m_bitsPerSample);
      memcpy(p, &b, 2);
      p+=2;
      sprintf(p, "data");
      p+=4;
      LOG(DETAIL, "m_length: %d", m_length);
      a = htolel(m_length);
      memcpy(p, &a, 4);
      fwrite(buffer, 1, 44, m_fp);
   }
   if(m_fp)
      fclose(m_fp);
   m_fp = 0;
   m_length = 0;
}


设置两个声道的语音合成到一个BUFFER中的实现的代码如下:


void TRecord::feedG711Stero(const char* buffer1, int length1, const char *buffer2, int length2 )
{
    char *p = (char*)buffer1;
    char twoChannelBuffer[MAXAUDIOBUFFERSIZE] = {0};
    /* this only for 8bit per sample */
  int i = 0;
  int j = 0;
    for ( j = 0, j = 0; i != PCMFRAMELEN; i++ )
    {
        twoChannelBuffer[j++] = m_buffer[i];
        twoChannelBuffer[j++] = m_buffer2[i];
    }
    m_mediaFile->putAudioData(twoChannelBuffer, j );
}
相关文章
|
6月前
|
存储 编解码
如何将BDMV文件转换为MKV或MP4?
许多拥有蓝光光驱的用户可能在电脑上存储了一些BDMV文件。虽然这些文件提供了高质量的视频和音频,但由于其文件格式的限制,它们可能无法在某些设备上播放。因此,将BDMV文件转换为常见的MKV或MP4文件就变得非常重要。本文将介绍一种简单而有效的方法来完成这个转换过程。
1037 2
|
1月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
57 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
1月前
|
存储 C++ 内存技术
解码mp4文件分别存储为pcm,yuv文件
使用FFmpeg库在C++中解码MP4文件,并将音频数据存储为PCM格式,视频数据存储为YUV格式。
24 3
解码mp4文件分别存储为pcm,yuv文件
|
1月前
提取mp4中的音频Pkt,以adts的方式写为aac文件
使用FFmpeg库从MP4文件中提取音频流,并将其转换为带有ADTS头的AAC文件,提供了两种方法:位运算和位域操作。
33 1
如何使用 MusicFab 将 SoundCloud音频转换为 WAV格式?
这篇文章为你展示了如何利用三方工具将SoundCloud音频转化为WAV格式以便进行兼容收听。
|
Linux 计算机视觉 iOS开发
使用ffmpeg将MP4转换为WebM格式
使用ffmpeg将MP4转换为WebM格式
1658 2
|
存储 编解码 算法
MP4文件格式的解析,以及MP4文件的分割算法
MP4文件格式的解析,以及MP4文件的分割算法
170 0
|
编解码 前端开发 安全
详细讲解ffmpeg命令的使用(视频合并&avi转MP4&补空白音频【收藏下来一定用的到】)
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 本文从实战的角度出发详细讲解ffmpeg命令的使用。 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
2294 0
详细讲解ffmpeg命令的使用(视频合并&avi转MP4&补空白音频【收藏下来一定用的到】)
|
存储 编解码 JSON
MP4封装格式
MP4封装格式介绍及解释,本文介绍 mp4 里面各种 box 的作用,包括 mdat box, moov box,mdhd box 等等。
410 0
|
编解码 Linux vr&ar
如何将mp3文件转pcma格式或PCM格式的wav文件
如何将mp3文件转pcma格式或PCM格式的wav文件