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的转换,转
换成功后,进行修复和截图,重复之前的操作。
原创作者:蔡越锐
* 原创:蔡越锐
* 本人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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28