+ -
当前位置:首页 → 问答吧 → FLV转换方案(原创作者:蔡越锐)

FLV转换方案(原创作者:蔡越锐)

时间:2008-08-15

来源:互联网

一<!--
* 原创:蔡越锐
* 本人blog提供原创技术文档,想知道最多,再登录我的Blog http://hi.baidu.com/43840397
* power by rany <[email protected]>
-->



运行平台和所需软件:

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

                                                                                                                                        原创作者:蔡越锐

作者: caiyuerui   发布时间: 2008-08-14

好文,先mark再看。

作者: zwws   发布时间: 2008-08-14

需要这方面的资料啊。

作者: myBe   发布时间: 2008-08-15