avi文件中可以包含mp3么

唐勉的技术博客 2005-06-07 04:15:49
我想在avi文件里面加一个mp3文件,不知道应该怎么加,也没有找到相应的例子,有谁能告诉我么??
...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jijx1983 2005-06-10
  • 打赏
  • 举报
回复
你的意思说两个都能播放
当打开.avi的时候 就可以跳出视屏

不知道你是不是用的MCI写的
如果是的话
就可以
不过感觉 也不是太妥
MCI可以的
设置MCI_OPEN_PARMS 的lpstrDeviceType就可以了
xuzheng318 2005-06-08
  • 打赏
  • 举报
回复
楼主问题解决了?
接分!
  • 打赏
  • 举报
回复
谢谢Keiy。

to vcmute(横秋):
你说avi中可包含mp3,要参见avi开头的系列函数指的是什么,能说的详细一点么??

多谢了!!
vcmute 2005-06-08
  • 打赏
  • 举报
回复
CMp3File是自定义的类,大致如下;
先MP3主要靠前3个字节来描述sample,所以先读出该帧的长度,再通过ReadData读出整帧
FrameInit用来先读3个字节到m_byTemp,并初始化m_wfx(如果未初始化的话)和m_nDataLen

class CMp3File
{
enum{MP3_HEADER=3};
FILE *m_fp;
int m_nDataLen;
BYTE m_byTemp[MP3_HEADER];
WAVEFORMATEX m_wfx;
void FrameInit();
public:
~CMp3File()
{
if(m_fp)fclose(m_fp);
}
CMp3File(LPCSTR szName)
{
m_fp=fopen(szName,"rb");
m_nDataLen = 0;
if(m_fp)
{
memset(&m_wfx,0,sizeof(WAVEFORMATEX));
FrameInit();
}
}
void ReadData(LPBYTE pData)
{
memcpy(pData,m_byTemp,MP3_HEADER);
fread(pData+MP3_HEADER,m_nDataLen-MP3_HEADER,1,m_fp);
FrameInit();
}
WAVEFORMATEX GetWFX()
{
return m_wfx;
}

BOOL GetDataLen()
{
return m_nDataLen;
}
};
vcmute 2005-06-08
  • 打赏
  • 举报
回复
测试一下没问题,只是时间长度为0,但能播放正常

{
char lpFileAvi[] = "d:\\1.avi";
char lpFileMP3[] = "d:\\1.mp3";

PAVIFILE pf;
PAVISTREAM ps;
HRESULT hr;
CMp3File mf(lpFileMP3);
int numbytes = mf.GetDataLen();
if(0==numbytes)return;
WAVEFORMATEX wfx =mf.GetWFX();


AVISTREAMINFO ahdr={0};
ahdr.fccType=streamtypeAUDIO;
ahdr.dwScale=wfx.nBlockAlign;
ahdr.dwRate=wfx.nSamplesPerSec*wfx.nBlockAlign;
ahdr.dwSampleSize=wfx.nBlockAlign;
ahdr.dwQuality=(DWORD)-1;

// Create new AVI file using AVIFileOpen.
hr = AVIFileOpen(&pf, lpFileAvi, OF_WRITE | OF_CREATE, NULL);
if (hr != S_OK)
return;

// Create a stream using AVIFileCreateStream.
hr = AVIFileCreateStream(pf, &ps, &ahdr);
if (hr != S_OK) { //Stream created OK? If not, close file.
AVIFileRelease(pf);
return;
}

hr = AVIStreamSetFormat(ps,0,&wfx,sizeof(WAVEFORMATEX));
if (hr != S_OK) { //Stream Set Format OK? If not, close file.
AVIStreamRelease(ps);
AVIFileRelease(pf);
return;
}

int nsamp = 0;
do {
LPBYTE data = new BYTE[numbytes + 1];
mf.ReadData(data);
hr = AVIStreamWrite(ps,nsamp++,1,data,numbytes,0,NULL,NULL);
delete[] data;
} while(numbytes = mf.GetDataLen());

// Close the stream and file.
AVIStreamRelease(ps);
AVIFileRelease(pf);
}
vcmute 2005-06-08
  • 打赏
  • 举报
回复
http://www.wischik.com/lu/programmer/avi_utils.html

HRESULT AddAviAudio(HAVI avi, void *dat, unsigned long numbytes)
{ if (avi==NULL) return AVIERR_BADHANDLE;
if (dat==NULL || numbytes==0) return AVIERR_BADPARAM;
TAviUtil *au = (TAviUtil*)avi;
if (au->iserr) return AVIERR_ERROR;
if (au->wfx.nChannels==0) return AVIERR_BADFORMAT;
unsigned long numsamps = numbytes*8 / au->wfx.wBitsPerSample;
if ((numsamps*au->wfx.wBitsPerSample/8)!=numbytes) return AVIERR_BADPARAM;
//
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) {au->iserr=true; return hr;}
hr = AVIStreamSetFormat(au->as,0,&au->wfx,sizeof(WAVEFORMATEX));
if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
}
//
// now we can write the data
HRESULT hr = AVIStreamWrite(au->as,au->nsamp,numsamps,dat,numbytes,0,NULL,NULL);
if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
au->nsamp+=numsamps; return S_OK;
}
  • 打赏
  • 举报
回复
我的问题还没有解决呢!!!!!!!

我现在要把mp3放到avi中,而且放到avi以后还是mp3。现在我遇到的问题是,如何把mp3放到avi中,而且放进去以后,mp3本身的属性不变,比如Bitrate等。

我在网上没有找到相应的例子,所以来这里问问大家,请多指教呀!!
柯本 2005-06-07
  • 打赏
  • 举报
回复
那我就不知怎样加入了,我原来用DXSDK用得多,我的思路将mp3通过解码后成音频流,然后AVI MUX与原AVI的图像叠加,得到新的AVI,我用DXSDK的工具graphedit试过,是可行的
vcmute 2005-06-07
  • 打赏
  • 举报
回复
avi中可包含mp3,具体参见AVI开头的系列函数
柯本 2005-06-07
  • 打赏
  • 举报
回复
当然不是了,是AVI中的音频
  • 打赏
  • 举报
回复
谢谢楼上的回复,按照你的做法,那AVI文件中的音频还是mp3么??
柯本 2005-06-07
  • 打赏
  • 举报
回复
用DXSDK可以
test.mp3->mpeg1 stream splitter->mpeg laser-3 decode->acm wrapper->avi mux -->File writer (new avi)
+
test.avi->avi splitter-----------------------------------------------+

你可先用graph edit 试试,然后对它编程
视频转换器,可将 MP4,M4V 和 MP4V 文件转换为 AVI 或 MPG(MPEG-1 / 2)格式。 Pazera Free MP4 to AVI Converter 生成的视频文件可以在大多数移动设备(iPhone,iPad,三星 Galaxy 等)上播放。 大多数程序也可以导入这些文件来处理视频文件(包括 Windows Movie Maker)。 免费 MP4 转 AVI 工具 Pazera Free MP4 to AVI Converter 文版免费 MP4 转 AVI 工具 Pazera Free MP4 to AVI Converter 文版 Pazera Free MP4 to AVI Converter 是免费的应用程序,可将 MP4,M4V 和 MP4V 文件转换为AVI 或 MPG(MPEG-1,MPEG-2)。 MP4 文件通常用于视频站点(YouTube),便携式播放器(iPod,PSP),移动电话(iPhone)和其他设备。 不幸的是,许多播放器和视频编辑软件不支持 MP4 格式。 在这种情况下,有必要将MP4 文件转换为更常见的格式,例如 AVI 或 MPG。 Pazera Free MP4 to AVI Converter 具有许多专为新手用户设计的预定义设置(配置文件)。 高级用户可以自定义编码器使用的视频和音频编码参数:音频和视频编解码器,音频和视频比特率,fps,采样频率,分辨率,音量等。 Pazera Free MP4 to AVI Converter 界面非常简单且用户友好。 要转换视频文件,只需将它们拖放到主窗口,然后单击工具栏上的“转换”按钮即可。 在默认设置下,该应用程序使用Xvid视频编码器和MP3音频编码器转换文件,并自动选择所有编码参数,以保留原始的视频和音频质量。 大多数便携式和固定播放器在播放使用这些设置创建的AVI文件时应该没有问题。 最重要的功能 从 MP4,M4V 和 MP4V 转换为 AVI 或 MPG。 对其他视频格式(包括 AVI,MKV,WMV,MP4,FLV,MTS,OGM,AMV)的支持有限。 解码 MP4 文件使用的最重要的音频和视频编解码器:MPEG-4 AVC / H.264,AAC,MP3,MP2,MPEG-1 音频第1层等。 支持的视频编码器:H.264(x264),XviD,DivX 3,WMV,MPEG4-FFmpeg,S-Mpeg 4 v.2,Motion JPEG(MJPEG),HuffYUV,MPEG-1,MPEG-2。 支持的音频编码器:Lame(MP3),MP2,AC3,AAC,WMA,PCM 16 位。 支持使用 H.264(x264)编码器的多线程编码。 许多预定义的转换配置文件。可以将您自己的设置保存到INI文件。 大量的编码参数:音频和视频的比特率,fps,通道数和音频采样,音量,更改分辨率,缩放和裁剪图像等。 2遍编码的可能性,这将提高图像质量并减少输出文件的数量。 能够将编码器命令保存在BAT文件。 该程序是可移植的:它不使用系统注册表,并且所有设置都存储在INI文件。因此,可以从便携式设备(如笔式驱动器,可移动驱动器)运行程序。 该程序具有对多种语言的内置支持。当前版本支持文(简体),捷克语,英语,芬兰语,法语,德语,希腊语,匈牙利语,意大利语,日语,拉脱维亚语,波兰语,葡萄牙语(BR),俄语,塞尔维亚语,西班牙语,瑞典语,土耳其语。 100%免费软件! – 用于私人和商业用途。该程序不需要注册,没有内置限制,不会在生成的文件添加“水印”等。 该程序有32位和64位版本。 64位版本的转换过程要快几到25%(取决于所选的视频编码器)。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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