300求贤, bapboy等各位兄弟好汉,请帮忙? 如何用DirectShow压缩bmp文件文件成mpeg-4(AVI)文件??

时间:2021-02-10 20:07:07
这个问题,我很急!!希望各位能帮忙.分一定会给的.
我想多张bmp-->一个AVI文件??
有提示的都有分,能给源码的(或着连接)给200分重点奖励!!!

15 个解决方案

#1


这个用VCM应该就行了。用ICCompressorChoose选择Filter为DivX
然后用
ICSeqCompressFrameStart
ICSeqCompressFrame
ICSeqCompressFrameEnd 
将输入的BMP,压缩成为AVI。
具体怎么做可以去看MSDN上有关Video Compression Manager的内容。

#2


小弟建议你如果真的用dshow做的话,可采用写一个源过滤器,按照你图片的格式设置媒体类型后,fillbuffer就可以了,你可以修改ball,不过你最好重载一下
DoBufferProcessingLoop.
此外,你可以使用ISampleGrabber,请参考StillCap.

#3


很感谢两位的发言,我还是倾向使用DirectShow. 不过,如果Vide Compression  Manager 也能行的话,也很让人激动的。分两位一定有的。下面,接着!我做出个Demo后,就会结贴。

#4


为什么我用以下代码: 
#include  "vfw.h" 
#pragma  comment(lib,"vfw32.lib") 
....... 
....... 
ICCompressorChoose,m_hWnd,ICMF_CHOOSE_ALLCOMPRESSORS,NULL,NULL,&CV,"COMPRESSOR"); 
BITMAPINFOHEADER  biIn; 
BITMAPINFOHEADER*  pbiOut; 
biIn.biBitCount=24; 
biIn.biClrImportant=biIn.biClrUsed=0; 
biIn.biCompression=BI_RGB; 
biIn.biHeight=biIn.biWidth=200; 
biIn.biPlanes=1; 
biIn.biSize=sizeof(biIn); 
biIn.biSizeImage=0; 
biIn.biXPelsPerMeter=biIn.biYPelsPerMeter=5; 

DWORD  dwFormatSize=0; 
dwFormatSize=ICCompressGetFormatSize(CV.hic,  &biIn); 
pbiOut=(BITMAPINFOHEADER*)new  BYTE[dwFormatSize]; 
ICCompressGetFormat(CV.hic,  &biIn,  pbiOut);  

DWORD  dwCompressBufferSize  =  ICCompressGetSize(CV.hic,  &biIn,  pbiOut);  


afxDump<<dwCompressBufferSize<<"\n";//得到的实际压缩后的数据的太小 
afxDump<<dwFormatSize<<"\n"; 

ICCompressorFree(&CV); 
delete[]  pbiOut; 
我选择了divx的算法压缩,得到的dwCompressBufferSize为120000字节!!! 
真恐怖。是不是我哪里搞错了。你们可以试一试以上的代码。 
有谁知道还有什么方法可以压缩BITMAP的数据吗?(源数据从视频卡捕获,我是想压缩后用于传输。
压缩后的所需的缓冲区的大小为:120000(200*200*24/8),那不是跟没有压缩前的大小一样吗?

#5


很简单啊,你先在graph edit试验一下:

render一个bmp文件,把后面的color space converter(如果有的话)和video renderer去掉,接上video compressor中的divx mpeg-4 low-motion或fast-motion,接着avi mux + file writer,整个graph就完整了。

这只能转换一个bmp文件,你自己写一个source filter,不断读入一系列的位图数据push下去就行了。

#6


当然在avi mux输入端可以接声音,这样视音频都有了。
这里似乎只有capboy吧?那位bapboy是哪位?

#7


源码不用了吧,当初我刚刚学directshow时就是先写一个播放bmp位图的source filter,很简单。

#8


用ICSeqCompressFrame()得到压缩后的buffer中的数据如何显示出来??

#9


sorry,是capboy大侠,昨晚太困,笔误!!!capboy,很抱歉。
bookOz: 很感谢。你还回答过我几个问题,你的回答,很精彩。分一定,较高的。

#10


(#$*#&(@)@_
我的名字什么时候改的?我都不知道 :)
现在精通dshow越来越多了.:)真好啊.
bookOz(Filter) 已经说的很详细了.我也没有什么补充的.

bookOz(Filter) :
名字都是filter.呵呵

#11


capboy(帽子)
我进了很多次都进不了你的网络播放器的下载网站,你把你的网络播放器的源代码发到我邮箱好吗?
cloudshadow@21cn.com
thanks

#12


bookOz(Filter) 
请给出具体的源代码。

#13


capboy(帽子): 我的第一个DShow程序还是你的网络播放器改得,所以你是多媒体版,我最崇敬的人,真的sorry!!

#14


bookOz(Filter);给你200分
http://www.csdn.net/expert/topic/571/571993.xml?temp=.4575006

#15


bookOz(Filter);给你200分 
继续领分,我会再开一张贴,给你第二个100分

#1


这个用VCM应该就行了。用ICCompressorChoose选择Filter为DivX
然后用
ICSeqCompressFrameStart
ICSeqCompressFrame
ICSeqCompressFrameEnd 
将输入的BMP,压缩成为AVI。
具体怎么做可以去看MSDN上有关Video Compression Manager的内容。

#2


小弟建议你如果真的用dshow做的话,可采用写一个源过滤器,按照你图片的格式设置媒体类型后,fillbuffer就可以了,你可以修改ball,不过你最好重载一下
DoBufferProcessingLoop.
此外,你可以使用ISampleGrabber,请参考StillCap.

#3


很感谢两位的发言,我还是倾向使用DirectShow. 不过,如果Vide Compression  Manager 也能行的话,也很让人激动的。分两位一定有的。下面,接着!我做出个Demo后,就会结贴。

#4


为什么我用以下代码: 
#include  "vfw.h" 
#pragma  comment(lib,"vfw32.lib") 
....... 
....... 
ICCompressorChoose,m_hWnd,ICMF_CHOOSE_ALLCOMPRESSORS,NULL,NULL,&CV,"COMPRESSOR"); 
BITMAPINFOHEADER  biIn; 
BITMAPINFOHEADER*  pbiOut; 
biIn.biBitCount=24; 
biIn.biClrImportant=biIn.biClrUsed=0; 
biIn.biCompression=BI_RGB; 
biIn.biHeight=biIn.biWidth=200; 
biIn.biPlanes=1; 
biIn.biSize=sizeof(biIn); 
biIn.biSizeImage=0; 
biIn.biXPelsPerMeter=biIn.biYPelsPerMeter=5; 

DWORD  dwFormatSize=0; 
dwFormatSize=ICCompressGetFormatSize(CV.hic,  &biIn); 
pbiOut=(BITMAPINFOHEADER*)new  BYTE[dwFormatSize]; 
ICCompressGetFormat(CV.hic,  &biIn,  pbiOut);  

DWORD  dwCompressBufferSize  =  ICCompressGetSize(CV.hic,  &biIn,  pbiOut);  


afxDump<<dwCompressBufferSize<<"\n";//得到的实际压缩后的数据的太小 
afxDump<<dwFormatSize<<"\n"; 

ICCompressorFree(&CV); 
delete[]  pbiOut; 
我选择了divx的算法压缩,得到的dwCompressBufferSize为120000字节!!! 
真恐怖。是不是我哪里搞错了。你们可以试一试以上的代码。 
有谁知道还有什么方法可以压缩BITMAP的数据吗?(源数据从视频卡捕获,我是想压缩后用于传输。
压缩后的所需的缓冲区的大小为:120000(200*200*24/8),那不是跟没有压缩前的大小一样吗?

#5


很简单啊,你先在graph edit试验一下:

render一个bmp文件,把后面的color space converter(如果有的话)和video renderer去掉,接上video compressor中的divx mpeg-4 low-motion或fast-motion,接着avi mux + file writer,整个graph就完整了。

这只能转换一个bmp文件,你自己写一个source filter,不断读入一系列的位图数据push下去就行了。

#6


当然在avi mux输入端可以接声音,这样视音频都有了。
这里似乎只有capboy吧?那位bapboy是哪位?

#7


源码不用了吧,当初我刚刚学directshow时就是先写一个播放bmp位图的source filter,很简单。

#8


用ICSeqCompressFrame()得到压缩后的buffer中的数据如何显示出来??

#9


sorry,是capboy大侠,昨晚太困,笔误!!!capboy,很抱歉。
bookOz: 很感谢。你还回答过我几个问题,你的回答,很精彩。分一定,较高的。

#10


(#$*#&(@)@_
我的名字什么时候改的?我都不知道 :)
现在精通dshow越来越多了.:)真好啊.
bookOz(Filter) 已经说的很详细了.我也没有什么补充的.

bookOz(Filter) :
名字都是filter.呵呵

#11


capboy(帽子)
我进了很多次都进不了你的网络播放器的下载网站,你把你的网络播放器的源代码发到我邮箱好吗?
cloudshadow@21cn.com
thanks

#12


bookOz(Filter) 
请给出具体的源代码。

#13


capboy(帽子): 我的第一个DShow程序还是你的网络播放器改得,所以你是多媒体版,我最崇敬的人,真的sorry!!

#14


bookOz(Filter);给你200分
http://www.csdn.net/expert/topic/571/571993.xml?temp=.4575006

#15


bookOz(Filter);给你200分 
继续领分,我会再开一张贴,给你第二个100分