一、 运行平台和所需软件:

运行平台: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的转换,转换成功后,进行修复和截图,重复之前的操作。