使用大华sdk批量下载视频文件、批量转换格式
关于视频文件下载的例子,可以参考官方的sdk包中的例子:xxx。
最重要的一个地方是一个回调函数的编写。每次调用DownloadFileByTime都会产生一个文件句柄,这个回调函数里就是根据不同的文件句柄来将视频数据写入不同的文件。
在回调函数写好后,问题就来了。
下载下来的文件是dav格式的。sdk中提供了视频转换的方法,一种是转换成avi,一种是转换成asf。
第一种由于cpu占用率过高所以不考虑。
第二种方法可以使用,不过也有一个问题需要解决。那就是批量下载后的批量格式转换任务。
大华提供的格式转换不支持多个转换任务,于是采用一个折中办法。
先举个例子:
小朋友们在旋转木马前举着票,管理员则随意选一张票,那么这个小朋友就可以上去玩了。
这个木马算是一个资源,如果这个小朋友没有下来,其他小朋友就没有办法玩了。
玩完木马的小朋友又高兴的去游乐园的其他地方玩耍了。
把这个木马比作格式转换任务,他们都有两个明显的状态:工作中和未工作。只要木马处于未启动的状态,小朋友们都有机会到木马上去玩。
解决问题的伪代码:
def 下载线程():
下载()
转换格式()
def 下载():
pass
def 转换():
pass
workstate = false;
def 转换格式():
if workstate== False:
workstate = True
转换()
workstate = False
elif workstate == True:
等待wrokstate为False时再进行格式转换
主任务函数()
{
开启下载线程1
开启下载线程2
开启下载线程3
开启下载线程4
开启下载线程5
……
}
后来又发现一个问题,转换成asf的文件在播放时用鼠标拖动进度条,
当前的播放位置与进度条不能同步。(这个下次再写)
tips
下载以及文件转换时多线程的应用:为什么使用AfxBeginThread,这样的线程是否可以不用控制,什么时候可以在一个线程结束时开启另一个线程?
记录可以,但是最好再把问题抽象一下。