关于AVI文件合成时候音频编码的问题

jtaosj jtaosj 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
自己写了一个AVI文件合成工具,用于生成AVI在电视中播放,支持视频编码为Xvid,音频编码为MP3,我利用的是vfw进行编程,现在问题是音频流无法加入,只能加入WAV编码的音频,导致在电视上只有图像没有声音,在电脑上视频音频正常,请问怎么加MP3编码的音频到AVI文件中,,,,刚接触视频,高手告诉怎么改 就行了
代码如下:
HRESULT CCREAT::AddAviWav(HAVI avi, const char *src, DWORD flags)
{
if (avi==NULL)
return AVIERR_BADHANDLE;
if (flags!=SND_MEMORY && flags!=SND_FILENAME)
return AVIERR_BADFLAGS;
if (src==0)
return AVIERR_BADPARAM;
TAviUtil *au = (TAviUtil*)avi;
if (au->iserr)
return AVIERR_ERROR;
//
char *buf=0; WavChunk *wav = (WavChunk*)src;
if (flags==SND_FILENAME)
{
HANDLE hf=CreateFile(src,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if (hf==INVALID_HANDLE_VALUE)
{
au->iserr=true;
return AVIERR_FILEOPEN;
}
DWORD size = GetFileSize(hf,NULL);
buf = new char[size];
DWORD red;
ReadFile(hf,buf,size,&red,NULL);
CloseHandle(hf);
wav = (WavChunk*)buf;
}
//
// check that format doesn't clash
bool badformat=false;
if (au->wfx.nChannels==0)
{
au->wfx.wFormatTag=wav->fmt.wFormatTag;
au->wfx.cbSize=0;
au->wfx.nAvgBytesPerSec=wav->fmt.dwAvgBytesPerSec;
au->wfx.nBlockAlign=wav->fmt.wBlockAlign;
au->wfx.nChannels=wav->fmt.wChannels;
au->wfx.nSamplesPerSec=wav->fmt.dwSamplesPerSec;
au->wfx.wBitsPerSample=wav->fmt.wBitsPerSample;
}
else
{
if (au->wfx.wFormatTag!=wav->fmt.wFormatTag) badformat=true;
if (au->wfx.nAvgBytesPerSec!=wav->fmt.dwAvgBytesPerSec) badformat=true;
if (au->wfx.nBlockAlign!=wav->fmt.wBlockAlign) badformat=true;
if (au->wfx.nChannels!=wav->fmt.wChannels) badformat=true;
if (au->wfx.nSamplesPerSec!=wav->fmt.dwSamplesPerSec) badformat=true;
if (au->wfx.wBitsPerSample!=wav->fmt.wBitsPerSample) badformat=true;
}
if (badformat)
{
if (buf!=0)
delete[] buf;
return AVIERR_BADFORMAT;
}
//
if (au->as==0) // create the stream if necessary
{
AVISTREAMINFO ahdr;
ZeroMemory(&ahdr,sizeof(ahdr));
ahdr.fccType=streamtypeAUDIO;
ahdr.dwScale=au->wfx.nBlockAlign;
ahdr.dwRate=au->wfx.nSamplesPerSec*au->wfx.nBlockAlign;
ahdr.dwSampleSize=au->wfx.nBlockAlign;
ahdr.dwQuality=(DWORD)-1;
HRESULT hr = AVIFileCreateStream(au->pfile, &au->as, &ahdr);
if (hr!=AVIERR_OK)
{
if (buf!=0) delete[] buf;
au->iserr=true;
return hr;
}
hr = AVIStreamSetFormat(au->as,0,&au->wfx,sizeof(WAVEFORMATEX));
if (hr!=AVIERR_OK)
{
if (buf!=0)
delete[] buf;
au->iserr=true;
return hr;
}
}
//
// now we can write the data
unsigned long numbytes = wav->dat.size;
unsigned long numsamps = numbytes*8 / au->wfx.wBitsPerSample;
HRESULT hr = AVIStreamWrite(au->as,au->nsamp,numsamps,wav->dat.data,numbytes,0,NULL,NULL);
if (buf!=0)
delete[] buf;
if (hr!=AVIERR_OK)
{
au->iserr=true;
return hr;
}
au->nsamp+=numsamps;
return S_OK;
}
...全文

相关推荐

c# 图片合成AVI 源码

标题 "c# 图片合成AVI 源码" 描述了一个使用C#编程语言将多张图片(例如JPG格式)合成为AVI视频文件的过程。在IT领域,这涉及到图像处理和视频编码的知识。

fishpro程序鱼

使用C++将BMP图片序列和WAV音频合成AVI视频

本文还有配套的精品资源,点击获取 简介:在多媒体处理和计算机图形学领域,将图像和音频文件转换成视频是一项关键任务。本项目展示了如何利用C++语言实现将24位的BMP图片序列和WAV音频文件合并成AVI格式视频文件的技术。通过理解BMP、WAV和AVI的文件格式,结合DirectShow或FFmpeg等库,可以实现图像序列的视频帧转换、同步音频样本,并将它们合并成一个视频文件...

夏勇兴

C++编码,24位的BMP合成avi并加载音频wav

**合成视频帧**:遍历BMP图像序列,将每个图像转换为视频帧并写入AVI文件。这里可能需要调整图像的大小和格式,以适应AVI的编码需求。5.

山君大人~

AVI视频分解成BMP图片以及BMP图片合成AVI视频

AVI是微软开发的一种音频视频交错格式,它允许音频和视频数据在同一文件中以交错的方式存储,以实现同步播放。AVI支持多种编码标准,使得它在多媒体领域广泛应用。

steveh

用于将jpeg图片序列合成avi视频的jpeg2avi代码

总的来说,将JPEG图片序列合成为AVI视频涉及图像处理、多媒体编码、文件格式理解和程序设计等多个方面的知识。这个项目是一个很好的实践平台,可以帮助开发者深入理解这些概念并提升相关技能。

cglu_icarevision
评论 4
收藏 已收藏
分享
返回顶部
jtaosj
多媒体/流媒体开发 2,554 成员 20,277 内容