howto:如何将MJPEG格式的视频流保存为avi视频文件?

听海拉拉 2010-10-14 09:42:06
Hi all,
最近在做一个项目,通过网络获取了MJPEG的视频流,现在想将它录制下来,保存格式为avi,不知道有什么好方法。有代码能否贴一下。
谢谢
...全文
1883 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
小邓她爸 2012-08-17
  • 打赏
  • 举报
回复
顶一下,最近为这个问题犯难
sfe123 2012-04-20
  • 打赏
  • 举报
回复
楼主 不知道哦阿你做好了没有 能不能分享 一下 qq:1012955586@qq.com
DUAN841029 2010-12-17
  • 打赏
  • 举报
回复
你好,我跟你做一个课题,能不能加我一下,QQ:1542342658!
shayla 2010-10-14
  • 打赏
  • 举报
回复
MJPEG Decompressor Filter
是用来进行MJPEG解码的,解码后录制AVI文件会大很多,
MJPEG可以直接录制AVI文件.
楼主首先要明确一下需求
shayla 2010-10-14
  • 打赏
  • 举报
回复
从你的需求上看不使用Direcshow完全可以.

个人建议如果你现有得到JPEG图像的框架使用的DShow,那么就使用Dshow

否则可以不用.
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shayla 的回复:]
微软有一套写AVI文件的函数.
例如AVIFileOpen用来创建文件.
楼主可以查询msdn使用.
MJPEG录制没问题的.
[/Quote]
MJPEG Decompressor Filter
正在看,但好像要用到什么DirectShow,有点犯晕
有sample之类的吗
shayla 2010-10-14
  • 打赏
  • 举报
回复
微软有一套写AVI文件的函数.
例如AVIFileOpen用来创建文件.
楼主可以查询msdn使用.
MJPEG录制没问题的.
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
还是有点难度,还在不,帮我看看,我的视频源是从网络来的,
HRESULT hr;

char url[1000] = "http://192.168.223.128:8080/?action=snapshot";


HINTERNET internet= InternetOpen("HTTP Downloader",INTERNET_OPEN_TYPE_PRECONFIG,
NULL,NULL, NULL);

if( !internet )
{
MessageBox(" 没有视频信号");
return ;
}

HINTERNET file_handle = InternetOpenUrl(internet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
if( !file_handle)
return ;


HGLOBAL hImageMemory_1=GlobalAlloc(GMEM_MOVEABLE, 2097152); //给图片分配全局内存
if( hImageMemory_1==NULL)
{
AfxMessageBox(" 没有分配内存");
return ;
}

void *pImageMemory_1=GlobalLock(hImageMemory_1); //锁定内存
DWORD bytes_read;
//DWORD dwReadedSize; //保存实际读取的文件大小
BOOL b = InternetReadFile(file_handle,pImageMemory_1,2097152,&bytes_read);
GlobalUnlock(hImageMemory_1); //解锁内存

CloseHandle(file_handle); //关闭文件句柄


if(!b)
return;
从网上了的MJPEG,之后分配内存与显示,再到播放,播放我是用timer来刷屏来连续从网络获取视频流,之后连续播放。播放这一步是做到了,现在是怎么把MJPEG的视频流保存下来。
IStream *pIStream;//创建一个IStream接口指针,用来保存图片流
IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象
hr = CreateStreamOnHGlobal(hImageMemory_1, false, &pIStream); //用全局内存初使化IStream接口指针
ASSERT(SUCCEEDED(hr));

hr = OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针
ASSERT(SUCCEEDED(hr));
以上代码是为了显示播放图片的。
现在我用以下方式保存图片,也可以打开图片,但不知道怎么做成视频
hr = CreateStreamOnHGlobal(hImageMemory_1, false, &pIStream);
AVIFILEINFO avi_info;
AVIFileInfo(avi,&avi_info,sizeof(AVIFILEINFO));
PAVISTREAM pStream;
//res
CreateStreamOnHGlobal(NULL,TRUE,&pIStream);
LONG size;
hr=pIPicture->SaveAsFile(pIStream,TRUE,&size);
char pathbuf[5024];
CFile iconfile;
iconfile.Open(TEXT("c:\\testAVI.jpg"), CFile::modeCreate|CFile::modeWrite);
LARGE_INTEGER li;
li.HighPart =0;
li.LowPart =0;
ULARGE_INTEGER ulnewpos;
pIStream->Seek( li,STREAM_SEEK_SET,&ulnewpos); //这里应该是指向文件头了
ULONG uReadCount = 1;



while(uReadCount>0)
{

pIStream->Read(pathbuf,sizeof(pathbuf),&uReadCount);
if(uReadCount>0)
iconfile.Write(pathbuf,uReadCount); //直接写文件,但不用定义图片文件信息头之类的,想不明白也能保存成功并且打开看得见




}
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dengzikun 的回复:]
这个没关系,修改FOURCC就可以了,AVI中可以放各种压缩格式的数据,
如MPEG4,H264,各种音频等.
[/Quote]
好的,谢谢,试试
dengzikun 2010-10-14
  • 打赏
  • 举报
回复
这个没关系,修改FOURCC就可以了,AVI中可以放各种压缩格式的数据,
如MPEG4,H264,各种音频等.
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dengzikun 的回复:]
http://www.hackchina.com/cont/171563
[/Quote]
谢谢,
我的是MJPEG是stream,你那个是bmp的
或者是我理解错了你那个程序
dengzikun 2010-10-14
  • 打赏
  • 举报
回复
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dengzikun 的回复:]
这个没关系,修改FOURCC就可以了,AVI中可以放各种压缩格式的数据,
如MPEG4,H264,各种音频等.
[/Quote]
修改了FOURCC好像还不行,我从内存得到的指针付给了PAVISTREAM pStream可以编译通过,但没有什么都没有
CyberLogix 2010-10-14
  • 打赏
  • 举报
回复
呵呵,这么多人,帮顶
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
BOOL b = InternetReadFile(file_handle,pImageMemory_1,2097152,&bytes_read);
图片流已经读到内存pImageMemory_1了,是mjpeg格式,但不知道怎么来操作让他保持成视频格式
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
一般的大文件,如上百G的文件,是用什么格式的,
现在项目的需求是:
1,远程图像采集 编码 压缩 传输 (这是采集端或服务器端的)linux
2,客户端 图像解码 播放
//现在就是windows下的客户端,测试接收到的mjpeg流播放与保存。
//后期可能会加入Opencv或DirectShow对图像流做一些处理,

//linux客户端,用gtk播放或者QT,用GTK做了些测试

//也想在移动终端做接收图像信号,准备选择android
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dengzikun 的回复:]
引用 10 楼 zouwen198317 的回复:
引用 9 楼 shayla 的回复:
MJPEG Decompressor Filter
是用来进行MJPEG解码的,解码后录制AVI文件会大很多,
MJPEG可以直接录制AVI文件.
楼主首先要明确一下需求


文件越小越好


一般都是录制压缩后的码流.
如果可能,建议放弃AVI,使用WMV,ASF等格式.
AVI录……
[/Quote]
才2G?本来是想做远程监控用的,2G就满足不了需求了。现在是源头还没有做压缩,只是想实现客户端接收、播放和保存。
如果有sample源码,望能提供~~拜谢~~
dengzikun 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zouwen198317 的回复:]
引用 9 楼 shayla 的回复:
MJPEG Decompressor Filter
是用来进行MJPEG解码的,解码后录制AVI文件会大很多,
MJPEG可以直接录制AVI文件.
楼主首先要明确一下需求


文件越小越好
[/Quote]

一般都是录制压缩后的码流.
如果可能,建议放弃AVI,使用WMV,ASF等格式.
AVI录制的音视频文件,问题比较多,限制也比较
多.印象中AVI最大能录制到2G,再大就有问题了.
听海拉拉 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shayla 的回复:]
MJPEG Decompressor Filter
是用来进行MJPEG解码的,解码后录制AVI文件会大很多,
MJPEG可以直接录制AVI文件.
楼主首先要明确一下需求
[/Quote]

文件越小越好

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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