用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文件就变得非常重要。本文将介绍一种简单而有效的方法来完成这个转换过程。
942 2
|
21天前
|
存储 C++ 内存技术
解码mp4文件分别存储为pcm,yuv文件
使用FFmpeg库在C++中解码MP4文件,并将音频数据存储为PCM格式,视频数据存储为YUV格式。
16 3
解码mp4文件分别存储为pcm,yuv文件
|
21天前
提取mp4中的音频Pkt,以adts的方式写为aac文件
使用FFmpeg库从MP4文件中提取音频流,并将其转换为带有ADTS头的AAC文件,提供了两种方法:位运算和位域操作。
18 1
|
Linux 计算机视觉 iOS开发
使用ffmpeg将MP4转换为WebM格式
使用ffmpeg将MP4转换为WebM格式
1553 2
|
存储 编解码 算法
MP4文件格式的解析,以及MP4文件的分割算法
MP4文件格式的解析,以及MP4文件的分割算法
167 0
|
编解码 前端开发 安全
详细讲解ffmpeg命令的使用(视频合并&avi转MP4&补空白音频【收藏下来一定用的到】)
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 本文从实战的角度出发详细讲解ffmpeg命令的使用。 干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
2257 0
详细讲解ffmpeg命令的使用(视频合并&avi转MP4&补空白音频【收藏下来一定用的到】)
|
编解码 Linux vr&ar
如何将mp3文件转pcma格式或PCM格式的wav文件
如何将mp3文件转pcma格式或PCM格式的wav文件
|
安全 Java 语音技术
将mp3格式的音频转换为采样率8k的wav
将mp3格式的音频转换为采样率8k的wav
501 0
|
物联网
【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )(一)
【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )(一)
151 0
【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )(一)