高分求助:avi文件多线程或进程同时读写,急!

xhyang0255 2009-08-26 12:12:11
最近在做一个项目要用到AVI文件,但是我们的需求是这样的:我们有个程序一边采集一边存储数据到avi文件,文件采集是通过 dshow实现的,avi文件存储实现了两种(VFW实现存储,还有dshow自己的存储),现在我们有另一个程序需要同时访问正在存储的avi文件,也就是一边有个程序正在写avi文件,一边有个程序读avi文件,请问这个应该如何处理,我试了下,第二次读打开文件失败,请问是哪个地方不对呢,还是 avi不支持同时打开呢? 希望能得到高手的回复,先谢谢了。
...全文
368 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhyang0255 2009-10-18
  • 打赏
  • 举报
回复 1
挂了这么久没碰到高手来回答,偶把帖子结了,告诉大家我的解决方法,效率问题本人现在还没很好的招,因为使用的是软件编解码,实时系统里面其他模块也很占CPU,解决办法可以有以下方式:降低分辨率、帧率,还有一种解决方法就是每帧都采用关键帧方式压缩,或者减小关键帧之间P帧或者B帧的数量,不过这样导致的是视频文件会大很多。所有我最后还是采集前面的方法处理的
xhyang0255 2009-09-30
  • 打赏
  • 举报
回复
大家都不解答,分享下自己的处理方式。

1)不能播放是因为数据对齐没有处理好,而且是indx1块数据没有正确写入,如没有这个数据块wmp不能播放;
2)第二问题是自己没搞清楚视频流格式结构的数据的填充,注意同实际写入数据格式一致即可;
3)压缩目前采用的是xvid解决的,由于在pc上层处理确保实时性比较麻烦,本人采用了多个采集、编码、文件存储线程,而且xvid编码效率不高,偶是通过多个编码线程对采集数据哈希表并行同时处理的,免强能够确保不丢帧(帧率15)。

新问题来了,感觉xivd压缩效率低,是不是我有些参数设置的不对呢,期待大家能给我回复,我们的系统是实时行很强的医疗系统,不知道换其他的编码器怎么样,大家有经验分享吗?小弟先在此谢谢了。

如果再过两周没有人回复,就勉强结贴,太可惜了。

xhyang0255 2009-09-11
  • 打赏
  • 举报
回复
谢谢bluebee2009的回复,
AVI文件已经搞清楚实现了,但还存在一些问题:

1)数据量较小时(<100M)用wmplayer不能播放?

2)数据量较大后可以播放,但是每帧实际视频图像前段被对调到视频尾部了,不知道是哪里数据导致的数据错 位,需要如何进行对齐填充呢?

3)以上两种是写的没有压缩的数据,如果写入压缩数据应该注意些什么?

哪位高手能提供些指导实用的建议和解决方法,给小弟指点迷津啊,万分感谢!
bluebee2009 2009-09-02
  • 打赏
  • 举报
回复
把AVI文件按普通的数据文件一样读写,完全可以的。关键是你要搞清楚AVI文件结构(网上可以方便找到).
Carmack Jiang 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiangsheng 的回复:]
写入的时候要加锁。
为什么要分两个程序?不能在Directshow里加上读取数据的render么?
[/Quote]
用ds的话可以在链路sample grabber定时抓一帧,用avi writer写文件
也就是不是从avi文件读、不过可能效率可能不高
很土 2009-08-30
  • 打赏
  • 举报
回复
// 共享打开读
if (AVIFileOpen(&hFile, szFileName, OF_READ | OF_SHARE_DENY_NONE, NULL) == 0)
{
// ??? ... ...
}

// 互斥打开写
if (AVIFileOpen(&hFile, szFileName, OF_WRITE | OF_SHARE_DENY_WRITE, NULL) == 0)
{
// ??? ... ...
}
l_W_T 2009-08-30
  • 打赏
  • 举报
回复
每次读的时候,可以先把目标文件做一个临时拷贝,读操作就去操作临时拷贝文件。读完就删除临时拷贝。
xhyang0255 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 oyljerry 的回复:]
http://code.knowsky.com/down/7555.html
[/Quote]

这位兄台程序中还是用到了avidll中的东西,这样还是不能支持同时共享读写,高手快出来接分啊!
百事烟 2009-08-26
  • 打赏
  • 举报
回复
菜鸟,瞎说的,avi貌似不能象rmvb一样即存即播.
oyljerry 2009-08-26
  • 打赏
  • 举报
回复
http://code.knowsky.com/down/7555.html
dirdirdir3 2009-08-26
  • 打赏
  • 举报
回复
既然读写都是你自己处理的,何必写了在读,直接一个写入文件,一个写入你要读的缓存里就可以了.................
xhyang0255 2009-08-26
  • 打赏
  • 举报
回复
另外,请教另一个问题,自己实现AVI文件大家知道如何处理吗?也就是不用VFW的那些API接口,而是自己实现一个符合AVI格式的文件,不知道有哪位高手做过这个,如能给出可用的源代码那偶就给你多加200分!

因为自己实现AVI文件就不用通过VFW接口的写的独占模式,就可以实现同时读写了。如果再不行,就只能通过网络传输视频数据了,哪位高手指点一下迷津啊,小弟一定高分重谢啊!

xhyang0255 2009-08-26
  • 打赏
  • 举报
回复
先谢谢大家的回复。

[Quote=引用 1 楼 jiangsheng 的回复:]
写入的时候要加锁。
为什么要分两个程序?不能在Directshow里加上读取数据的render么?
[/Quote]

是这样的,我们是属于监护系统类型,也就是实时回放程序在另外一台计算机上,和采集程序不在一个计算机中,另外除了视频数据文件,我们还有其他业务数据文件,这些业务数据文件的实时回放是采用文件共享方式
实现的,为了简化实现逻辑,视频数据也想采用文件共享方式同步回放。

看了各位的回答,如果一定采用AVI文件,我们这种共享方式是不可行的了?
whg01 2009-08-26
  • 打赏
  • 举报
回复
如果是只读模式打开文件,是可以有多个进程、线程同时访问同一个文件。
但一个写,一个读肯定不行。因为写模式是独占的。
试试1楼的方法吧。
或者可以考虑同时输出一系列的比较小的临时文件,每个文件只存半分钟。读完后就删除。
hhwei1985 2009-08-26
  • 打赏
  • 举报
回复
UP
蒋晟 2009-08-26
  • 打赏
  • 举报
回复
写入的时候要加锁。
为什么要分两个程序?不能在Directshow里加上读取数据的render么?

19,468

社区成员

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

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