网络技术,黑客,WEB编程,热门网站,热门软件,学院
23 Jul
一、 运行平台和所需软件:
运行平台:Windows + java + SQL Server2000
所需软件:Mencoder 视频转换
Ffmpeg 视频截图
Md5sum 获取文件“指纹”(MD5)
二、 视频上传:(大文件上传)
Flash插件 + FileUpload 完成。
三、 FLV转换:
目标:实时 + 队列 + 多服务器(可以预留)
过程:
1、 需要两套程序同时运行:
前台用户上传程序。
后台监控程序 + 转换程序
2、 数据库表的建立:
需要四个表:
MediaLib : 用于记录已完成转换的视频,并用于前台的显示。
WaitMedia : 用于记录刚上传并需要转换的视频,但未完成转换。
FileHash : 用于记录文件的Hash值。
Server : 记录服务器,可能用多台服务器进行转换。(预留)
注:为什么不用一个表记录视频,用状态区分?
因为WaitMedia 是后台程序要不停查询的表,而且MediaLib是记录视频的表,里面含有多个text数据类型的字段,会大大降低性能。
MediaLib :(此表省略)
Create table MediaLib
(
MediaLibId,
Status,
MediaName
其他字段省略
);
WaitMedia :
Create table WaitMedia
(
WaitMediaId int(4),
Path varchar(255), 记录未转换视频路径
Status tinyint(1), 记录视频状态 (未转,正在转,出错)
MediaLibId int(4),
ServerId 服务器ID
FileSize 文件大小
AddTime 添加时间
ErrCounter 出错次数的记录
);
FileHash:
Create table FileHash
(
FileHashId
MediaLibId
FileHash 记录文件“指纹”
);
Servers:
Create tabel Servers
(
ServerId
ServerIp 服务器IP
ServerIndex 服务器权重
)
说明:多台服务器转换,目前先不考虑。
思路:
一、文件上传和文件状态处理:
1、 用户上传。
2、 判断是否是FLV文件:
是:直接写MediaLib表,在WaitMedia表中标识为“转换成FLV,未截图”,并复制FLV文件(用户直接上传在temp文件夹中)到用户文件夹。结束程序。
否:查询FileHash表,检查文件“指纹”。
3、 判断文件“指纹”是否已存在。(查询FileHash表)
是:根据MediaLibId查询MediaLib表得到对应的记录,后插入新的记录到MediaLib表,并复制FLV文件和省略图到用户文件夹,并在表MediaLib标识为“转换成FLV,已截图”,结束程序。
否:插入新的记录到WaitMedia表,并在表WaitMedia中标识为“未转换成FLV,未截图”。
到此:上传和文件的状态已做出了明确的标识。接下来开始处理FLV的转换。
二、开始转换FLV:
1、让JAVA开启两个线程,和一个缓存区。
2、线程ToFlvThread : 负责FLV转换的线程。
3、线程GetDataThread : 负责读数据库,表WaitMedia中的数据。
4、线程GetDataThread读数据库的数据到CircularBuffer,并将数据放在缓存区CircularBuffer 中, 线程ToFlvThread将缓存区CircularBuffer的数据取走,并做相应的处理(转换)。
5、CircularBuffer是一个存放数据库记录的数组,两个进程对这个数组进行操作。(说明:启用缓存区是为了提高程序的效率,不要让两个进程的等待时间过长)。
同时,在缓存区中还取得当前运行的线程的进程,和进程运作的最后时间是多少。
(说明:目的是为了防止外部应用程序因出错,而被被卡死。让程序可以主动的杀死被卡死的进程)。
6、当应用程序一启动时,就激活两个进程。
四、两个线程的工作流程:
1、线程GetDataThread读数据库中的数据库,普通的数据库查询操作。
2、线程ToFlvThread :
A 、先判断文件的状态:
已转未截图 : 那么此时只提供截图操作,截图前程序会先对FLV 文件做修复操作,并更新MediaLib表中的状态为“转换成FLV,已截图,未审 核”,截图成功和更新操作成功后,删除WaitMedia表中的记录,并将文件的 MD5码插入到FileHash中。不成功,将 WaitMedia表中的状态修改为原来的 状态,并错误次数ErrCounter加1
未转未截图:先选择用 mencoder 还是 Ffmpeg 进行视频flv的转换,转换成功后,进行修复和截图,重复之前的操作。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。