首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

wince上的AVI Mux Filter

2012-10-07 
wince下的AVI Mux Filter请问哪里有wince下的AVI Mux Filter??之前用wm asf writer filter 做过视频捕获压

wince下的AVI Mux Filter
请问哪里有wince下的AVI Mux Filter??之前用wm asf writer filter 做过视频捕获压缩生成wmv格式文件,现在压缩算法换成H246,但wince下没有AVI Mux Filter,不能生成avi格式文件,各位大侠,请提供帮助,谢谢!

[解决办法]
兄弟啊,跟你一样的需求,也不会,哪个高人指点一下
[解决办法]
自己写吧,呵呵,参考avi文件格式,调试mpc的avi splitter来知道各个段的写法
这是我写头的代码,呵呵,草稿,将就看吧
int curPos = 0;
if(m_Avifp)
{
fclose(m_Avifp);
m_Avifp = NULL;
}
m_Avifp = fopen(fileName, "wb");
if(m_Avifp == NULL)
{
return E_FAIL;
}
fwrite("RIFF", 4, 1, m_Avifp);
DWORD totalsize = 0;
fwrite(&totalsize, 4, 1, m_Avifp);
m_RiffLenPos = ftell(m_Avifp);

fwrite("AVI ", 4, 1, m_Avifp);

fwrite("LIST", 4, 1, m_Avifp);
totalsize = 0;
fwrite(&totalsize, 4, 1, m_Avifp);
DWORD LIST1Pos = ftell(m_Avifp);
fwrite("hdrl", 4, 1, m_Avifp);
AVIMAINHEADER mainHeader;
memset(&mainHeader, 0, sizeof(AVIMAINHEADER));
mainHeader.fcc = MAKEFOURCC('a', 'v', 'i', 'h');
mainHeader.cb = sizeof(AVIMAINHEADER) - 8;
mainHeader.dwMicroSecPerFrame = 1E6 / mEncodeX264Fps;
mainHeader.dwFlags = 0x00000810;
mainHeader.dwStreams = 2;
mainHeader.dwWidth = mEncodeX264Width;
mainHeader.dwHeight = mEncodeX264Height;
fwrite(&mainHeader, sizeof(AVIMAINHEADER), 1, m_Avifp);

//下面写视频LIST
fwrite("LIST", 4, 1, m_Avifp);
totalsize = 0;
fwrite(&totalsize, 4, 1, m_Avifp);
DWORD LIST2Pos = ftell(m_Avifp);
fwrite("strl", 4, 1, m_Avifp);
AVISTREAMHEADER videoStreamHeader;
memset(&videoStreamHeader, 0, sizeof(AVISTREAMHEADER));
videoStreamHeader.fcc = MAKEFOURCC('s', 't', 'r', 'h');
videoStreamHeader.cb = sizeof(AVISTREAMHEADER) - 8;
videoStreamHeader.fccType = streamtypeVIDEO;
videoStreamHeader.fccHandler = MP4MEDIA_TYPE_AVC1;
videoStreamHeader.dwFlags = 0;
videoStreamHeader.wPriority = 0;
videoStreamHeader.wLanguage = 0;
videoStreamHeader.dwScale = 1;
videoStreamHeader.dwRate = mEncodeX264Fps; //上传的视频是每秒18帧。
videoStreamHeader.dwStart = 0;
m_AviVideoStrHdr.dwLength = 0;
videoStreamHeader.dwSuggestedBufferSize = mEncodeX264Width*mEncodeX264Height*3;
videoStreamHeader.dwQuality = 0;
videoStreamHeader.dwSampleSize = 0;
videoStreamHeader.rcFrame.left = 0;
videoStreamHeader.rcFrame.top = 0;
videoStreamHeader.rcFrame.right = mEncodeX264Width;
videoStreamHeader.rcFrame.bottom = mEncodeX264Height;
//videoStreamHeader.dwCaps = 0;
//videoStreamHeader.dwInitialFrames = 0;
//videoStreamHeader.dwEditCount = 0;
//videoStreamHeader.dwFormatChangeCount = 0;
//strcpy((char *)videoStreamHeader.szName, "avc1");
fwrite(&videoStreamHeader, sizeof(AVISTREAMHEADER), 1, m_Avifp);

fwrite("strf", 4, 1, m_Avifp);
totalsize = sizeof(BITMAPINFOHEADER);
fwrite(&totalsize, 4, 1, m_Avifp);
BITMAPINFO videoBitMapInfo;
memset(&videoBitMapInfo, 0, sizeof(BITMAPINFO));
videoBitMapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
videoBitMapInfo.bmiHeader.biWidth = mEncodeX264Width;
videoBitMapInfo.bmiHeader.biHeight = mEncodeX264Height;
videoBitMapInfo.bmiHeader.biBitCount = 24;//image1.GetBPP();
videoBitMapInfo.bmiHeader.biCompression = MP4MEDIA_TYPE_AVC1;//0x34363248;//BI_RGB;
videoBitMapInfo.bmiHeader.biSizeImage = 0;
videoBitMapInfo.bmiHeader.biClrImportant = 0;
videoBitMapInfo.bmiHeader.biClrUsed = 0;
videoBitMapInfo.bmiHeader.biXPelsPerMeter = 0;
videoBitMapInfo.bmiHeader.biYPelsPerMeter = 0;
videoBitMapInfo.bmiHeader.biPlanes = 1;
fwrite(&videoBitMapInfo, sizeof(BITMAPINFOHEADER), 1, m_Avifp);



fwrite("strn", 4, 1, m_Avifp);
totalsize = strlen("avc1") + 1;
fwrite(&totalsize, 4, 1, m_Avifp);
fwrite("avc1", totalsize, 1, m_Avifp);
if(totalsize % 2 != 0)
{
fwrite(movi_paddata, 1, 1, m_Avifp);
}

//写入list2 大小信息
curPos = ftell(m_Avifp);
fseek(m_Avifp, LIST2Pos - 4, SEEK_SET);
totalsize = curPos - LIST2Pos;
fwrite(&totalsize, 4, 1, m_Avifp);
fseek(m_Avifp, 0, SEEK_END);


//下面写入音频LIST
fwrite("LIST", 4, 1, m_Avifp);
totalsize = 0;
fwrite(&totalsize, 4, 1, m_Avifp);
DWORD LIST3Pos = ftell(m_Avifp);
fwrite("strl", 4, 1, m_Avifp);
AVISTREAMHEADER audioStreamHeader;
memset(&audioStreamHeader, 0, sizeof(AVISTREAMHEADER));
audioStreamHeader.fcc = MAKEFOURCC('s', 't', 'r', 'h');
audioStreamHeader.cb = sizeof(AVISTREAMHEADER) - 8;
audioStreamHeader.fccType = streamtypeAUDIO;// stream type
audioStreamHeader.fccHandler = MP4MEDIA_TYPE_MP4A;
audioStreamHeader.dwFlags = 0;
audioStreamHeader.wPriority = 0;
audioStreamHeader.wLanguage = 0;
audioStreamHeader.dwRate = USE_SAMPLE_RATE;//1秒一个声道多少个sample
audioStreamHeader.dwScale = 4096 * 2 / 4;//每帧音频包包含的一个声道的sample个数
audioStreamHeader.dwStart = 0;
audioStreamHeader.dwLength = 0;
audioStreamHeader.dwSuggestedBufferSize = 0;
audioStreamHeader.dwQuality = -1;
audioStreamHeader.dwSampleSize = 1;
audioStreamHeader.rcFrame.left = 0;
audioStreamHeader.rcFrame.top = 0;
audioStreamHeader.rcFrame.right = 0;
audioStreamHeader.rcFrame.bottom = 0;
//videoStreamHeader.dwCaps = 0;
//videoStreamHeader.dwInitialFrames = 0;
//videoStreamHeader.dwEditCount = 0;
//videoStreamHeader.dwFormatChangeCount = 0;
//strcpy((char *)videoStreamHeader.szName, "avc1");
fwrite(&audioStreamHeader, sizeof(AVISTREAMHEADER), 1, m_Avifp);

fwrite("strf", 4, 1, m_Avifp);
totalsize = sizeof(WAVEFORMATEX) + 2;
WAVEFORMATEX *pwex=(WAVEFORMATEX *)malloc(totalsize);
fwrite(&totalsize, 4, 1, m_Avifp);
ZeroMemory(pwex, totalsize);
pwex->cbSize = 0;
pwex->nChannels = 2;
pwex->wFormatTag = 0xFF;
pwex->nSamplesPerSec = USE_SAMPLE_RATE;
pwex->wBitsPerSample = 16;
pwex->nBlockAlign = 0;//必须为0,要不会算错
pwex->nAvgBytesPerSec = USE_SAMPLE_RATE * 4;
fwrite(pwex, totalsize, 1, m_Avifp);
free(pwex);

//写入strn后的字符串要特别注意,2个字节对其才行
fwrite("strn", 4, 1, m_Avifp);
totalsize = strlen("aac") + 1;
fwrite(&totalsize, 4, 1, m_Avifp);
fwrite("aac", totalsize, 1, m_Avifp);
if(totalsize % 2 != 0)
{
fwrite(movi_paddata, 1, 1, m_Avifp);
}

//写入list3 大小信息
curPos = ftell(m_Avifp);
fseek(m_Avifp, LIST3Pos - 4, SEEK_SET);
totalsize = curPos - LIST3Pos;
fwrite(&totalsize, 4, 1, m_Avifp);

//写入list1 大小信息
fseek(m_Avifp, LIST1Pos - 4, SEEK_SET);
totalsize = curPos - LIST1Pos;
fwrite(&totalsize, 4, 1, m_Avifp);


fseek(m_Avifp, 0, SEEK_END);
//下面写入数据movi LIST
fwrite("LIST", 4, 1, m_Avifp);
totalsize = 4;
fwrite(&totalsize, 4, 1, m_Avifp);
m_MoviLenPos = ftell(m_Avifp);
fwrite("movi", 4, 1, m_Avifp);

//写入RIFF之后的文件大小信息
curPos = ftell(m_Avifp);
fseek(m_Avifp, m_RiffLenPos - 4, SEEK_SET);
totalsize = curPos - m_RiffLenPos;
fwrite(&totalsize, 4, 1, m_Avifp);

fseek(m_Avifp, 0, SEEK_END);
fflush(m_Avifp);

热点排行