pcm格式的音频裸数据存储成 .avi 播放不了,求解决

ZJT_VOIP 2014-04-09 05:39:19
PAVIFILE m_aviFile;
PAVISTREAM m_aviAudioStream;
WAVEFORMATEX m_avi_AudioFormat; //音频格式AVISTREAMINFOW m_aviAudioStreamInfo;
int m_aviAudioFrames;
AVISTREAMINFOW m_aviAudioStreamInfo;

m_aviAudioFrames=0;

m_aviAudioStream = NULL;

_fmemset(&m_aviAudioStreamInfo, 0, sizeof(m_aviAudioStreamInfo));

m_aviAudioStreamInfo.fccHandler = mmioFOURCC('M', 'S', 'V', 'C');
m_aviAudioStreamInfo.dwQuality = 7500;
m_aviAudioStreamInfo.dwFlags = 0;
m_aviAudioStreamInfo.wPriority = 8;
m_aviAudioStreamInfo.dwStart = 0;
m_aviAudioStreamInfo.dwLength = 0;
m_aviAudioStreamInfo.dwInitialFrames = 0;
m_aviAudioStreamInfo.dwEditCount = 0;
m_aviAudioStreamInfo.dwFormatChangeCount = 0;
m_aviAudioStreamInfo.dwFormatChangeCount = 0;
m_aviAudioStreamInfo.dwCaps = 0;
wcscpy(m_aviAudioStreamInfo.szName, _T("Audio Stream") );

//// Initalize the audio format structure
ZeroMemory(&m_avi_AudioFormat, sizeof(WAVEFORMATEX));

//// Set up some default data in case the config file
//// doesn't load
m_avi_AudioFormat.wFormatTag = WAVE_FORMAT_PCM; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
m_avi_AudioFormat.wBitsPerSample = 16; //WAVE文件的采样大小;
m_avi_AudioFormat.nChannels = 1;
m_avi_AudioFormat.nSamplesPerSec = 8000; //采样频率;
m_avi_AudioFormat.nBlockAlign = m_avi_AudioFormat.nChannels * (m_avi_AudioFormat.wBitsPerSample / 8); //块对齐;
m_avi_AudioFormat.nAvgBytesPerSec = m_avi_AudioFormat.nSamplesPerSec * m_avi_AudioFormat.nBlockAlign; //每秒的数据量;

BOOL CMediaController::InitDs()
{
AVIFileInit();
AVIFileOpen(&m_aviFile,(LPCTSTR)_T("c:\\av_test.avi"),OF_CREATE|OF_WRITE,0);
AVIFileCreateStream(m_aviFile,&m_aviAudioStream,(AVISTREAMINFO*)&m_aviAudioStreamInfo);
AVIStreamSetFormat(m_aviAudioStream, 0, &m_avi_AudioFormat, sizeof(WAVEFORMATEX) + m_avi_AudioFormat.cbSize);

}



//写入PCM数据,
void CMediaController::OnCallBackLocalPCMData(LPBYTE pData,int dLen)
{
if (dLen > 0)
{
if (m_CallBackBuffer_Audio.GetLength() >= m_CallBackBuffer_Audio.GetSize())
{
return ;
}
ZF_LogTimeA(KLT_PER_DAY, "OnCallBackLocalPCMData", "OnCallBackLocalPCMData: dLen=%d\r\n", dLen);
AVIStreamWrite(m_aviAudioStream,m_aviAudioFrames++,1,pData,dLen,0,NULL,NULL);
/*CMediaPack* packet = new CMediaPack();
packet->SetRawData(pData, dLen);
int nLen = m_CallBackBuffer_Audio.Put((char *)&packet, sizeof(CMediaPack*));*/
return ;
}
}


以上代码经过测试,播放不了,谁熟悉帮忙指导下
...全文
108 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2014-04-10
  • 打赏
  • 举报
回复
Vc6 msdn 的例子里有叫AVIEDIT的,可以参考下

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧