小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JAVA系統(tǒng)下的FLASH,FLV視頻應(yīng)用解決方案

 looline 2007-04-19
JAVA系統(tǒng)下的FLASH,FLV視頻應(yīng)用解決方案 2006年11月20日15:59星期一  [資料] 追蹤此文的RSS

最近網(wǎng)絡(luò)上FLV視頻應(yīng)用越來越多了.使用這種方案的好處是:一定程度上可以保護(hù)作品版權(quán),易于視頻作品在網(wǎng)絡(luò)上傳播,更高的商業(yè)運(yùn)作價(jià)值.這一切特點(diǎn)都是因?yàn)镕LV是基于FLASH播放器的一種流媒體格式.

我們知道,FLASH是一種易于開發(fā)的網(wǎng)絡(luò)媒體.FLASH開發(fā)人員可以不需要太復(fù)雜的工作便可以制作一個(gè)FLV視頻播放器.此篇文章重點(diǎn)不在于教你怎么制作FLV播發(fā)器,我們著重講解下如何在服務(wù)器端將用戶上傳的視頻文件轉(zhuǎn)換為FLV格式,以及如何在我們制作的FLASH里使用這個(gè)FLV等關(guān)鍵環(huán)節(jié).

軟件環(huán)境

WEB應(yīng)用程序環(huán)境
JAVA
操作系統(tǒng)
WINDOWS
視頻編/解碼程序
FFMEPG
用戶接口設(shè)計(jì)

由于用戶所上傳的視頻文件一般都很大,所以使用簡(jiǎn)單的表單FILE控件來上傳顯然是不明智的.我們注重給用戶更佳的操作體驗(yàn).

通常開發(fā)者會(huì)使用javascript來實(shí)現(xiàn)一些例如文件上傳進(jìn)度反饋等效果.這做法非常不錯(cuò),不過在這里我推薦的是使用FLASH8所支持的文件上傳功能.其好處是可以通過FLASH編程達(dá)到更加豐富的用戶交互體驗(yàn).

在附件中帶有該功能的FLASH源文件實(shí)例.
在"視頻處理過程"中講述了如何在JAVA程序下實(shí)現(xiàn)這一功能的服務(wù)器端操作.

客戶端交互效果:

顯示文件上傳信息
支持批量上傳
文件格式過濾
文件長(zhǎng)度限制
視頻處理過程

文件上傳處理
我想,一些常用的J2EE文件上傳組件會(huì)在你采用FLASH作為文件上傳控件的時(shí)候令你束手無策.這是作者本人經(jīng)歷過的.至少,你需要煩瑣的編碼,甚至采取重寫這些開源組件的手段以達(dá)到使其能夠處理FLASH控件所提交過來的文件的目的.現(xiàn)在,我向你介紹的這個(gè)組件可能會(huì)減少你在這塊的編程工作.
我采用的是oreilly提供的servlet輔助處理工具COS,并且使用其中的MultipartRequest來處理FLASH提交過來的文件流.

文件上傳處理示例代碼:
ControllerServlet.java
//...... ............
//你的Servlet中需要放置的代碼
if (request.getContentLength() == 0)return null;
String tempFilePath = "c:/" //文件存放目錄
videoBO.uploadVideoFile(request,tempFilePath);

//..................

在Servlet中我們需要關(guān)注的是FLASH在一次文件提交操作時(shí)會(huì)向服務(wù)器發(fā)送兩次請(qǐng)求.第一次附帶的信息為空,第二次提交的才是正式的文件上傳內(nèi)容.如不在Servlet里判斷request里的內(nèi)容長(zhǎng)度是否為0,則下面的程序執(zhí)行時(shí)必定會(huì)拋出空指針的異常

負(fù)責(zé)文件上傳處理的方法
VideoBO.java
public String uploadVideoFile(HttpServletRequest request, String path){
File dir = new File(path);
if (!dir.exists()) {
dir.mkdir();
}
MultipartRequest multi;
try {
multi = new MultipartRequest(request, path, 100 * 1024 * 1024,"UTF-8");
Enumeration files = multi.getFileNames();
if (files.hasMoreElements()) {
String name = (String) files.nextElement();
File f = multi.getFile(name);
return f.getName();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

看起來代碼似乎很簡(jiǎn)單^^
解決文件上傳處理后,我們接著需要針對(duì)上傳過來的視頻文件做格式的轉(zhuǎn)換.

視頻格式轉(zhuǎn)換
我們采用FFMEPG作為視頻編/解碼工具.相關(guān)FFMEPG的介紹請(qǐng)搜索網(wǎng)絡(luò)
(FFMEPG二進(jìn)制版本已經(jīng)在附件中提供下載)
將得到的FFMEPG目錄下的所有dll文件和exe文件復(fù)制到windows/system32目錄下.我們將在java環(huán)境下調(diào)用系統(tǒng)命令的方式執(zhí)行編碼工作.
FFMEPG是采用命令行的方式進(jìn)行編譯工作,所以,我們需要把這些命令寫在一個(gè)批處理文件里.
在c盤根目錄下建立一個(gè)批處理文件
c:encode.bat
內(nèi)容:
ffmpeg.exe -i %1 -y -s 400x300 -deinterlace -b 256 -ab 64 -ar 22050 -ac 2 %2 2>encode.txt

以上的命令表示:
%1 :接收參數(shù)一
%2 :接受參數(shù)二
-y :默認(rèn)覆蓋已存在的輸出文件
>encode.txt :將打印信息暫存在encode.txt中,以避免打印信息出現(xiàn)在java控制臺(tái)中影響java程序執(zhí)行.

另外我們還需要獲取視頻內(nèi)容的縮略圖
c:makeimg.bat
ffmpeg.exe -i %1 -y -f image2 -ss 5 -t 0.001 -s 120x90 %2 2>encode.txt



更多的FFMEPGM命令解釋請(qǐng)參考網(wǎng)絡(luò)

在java程序中執(zhí)行這個(gè)批處理文件
/*
*String fileIn,視頻原文件地址
*String fileOut,轉(zhuǎn)換后輸出到目標(biāo)目錄
*String fileName ,轉(zhuǎn)換后的視頻文件名稱,例如:xxx.flv.注意文件名必須以.flv結(jié)束.
*/
public synchronized static boolean encode(String fileIn,String fileOut,String fileName){
String fullPath = fileOut+"\"+fileName; //完整文件路徑
String cmd = "c:\encoder.bat "+fileIn+" "+fullPath; //命令字串
try {
//如果目錄路徑不存在則創(chuàng)建
File file = new File(fileOut);
if(!file.exists()){
file.mkdirs();
}
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();//java程序等待執(zhí)行過程完畢
File filePath = new File(fullPath);

//如果文件存在,并且長(zhǎng)度不為0,則表示轉(zhuǎn)換成功.
boolean success = filePath.exists()&&filePath.length()>0;
if(success){
//創(chuàng)建縮略圖
Runtime.getRuntime().exec("c:\makeimg.bat "+fullPath+" "+fileOut+"\"+new MD5Helper().getMD5ofStr(fileName)+".jpg");
//依據(jù)FLV的文件名,我們有必要將縮略圖名稱用MD5加密,這樣可以保護(hù)我們的FLV源文件地址信息泄露.
}
return success;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

視頻轉(zhuǎn)換過程是一個(gè)及其消耗系統(tǒng)性能的過程.所以,我們必須限制其系統(tǒng)進(jìn)程數(shù)量.通過對(duì)JAVA方法的鎖定(synchronized),可保持每次操作系統(tǒng)僅執(zhí)行一個(gè)進(jìn)程.

3.視頻調(diào)用/輸出
在FLASH中獲取外部信息的方式很多,在此不累述.例如loadvars,xml,socket,webservice等.另外,使用FLASH中的NetStream類也可以直接播FLV放視頻流.
我們需要在FLASH中播放服務(wù)器轉(zhuǎn)換后的FLV文件.并且考慮采用哪一種數(shù)據(jù)交換方式最為恰當(dāng).
分析:
loadvars,xml等方式具有域的限制,也就是說僅可以獲取與FLASH同一個(gè)域內(nèi)的數(shù)據(jù)(即同一個(gè)站點(diǎn)域名下).顯然,此類數(shù)據(jù)交換形式不適合我們將視頻內(nèi)容在網(wǎng)站外部傳播的需求.
NetStream僅可以載入flv,mp3流媒體文件,而我們通常希望能夠?qū)⒁恍┪谋拘畔⒓尤氲紽LASH中,例如我們的廣告,更新信息等.所以,這種方法也不是最好的.

最后,我們推薦webservice.
webservice具有分布式,支持對(duì)象傳遞等特性,可以不受域的限制.并且其對(duì)象傳輸模式極有利于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)編程.也就是說,JAVA對(duì)象可以直接在FLASH使用.

在JAVA中搭建webservice框架
我們采用apache提供的axis作為我們的webservice服務(wù)容器.
在javaweb應(yīng)用中配置axis并不復(fù)雜.
axia程序包可以在http://ws./獲宮....類包添加至classpath中
在web.xml中配置axis
將所需要的類包添加至classpath中,
在WEB-INF目錄下放置部署描述符號(hào)
一個(gè)axis配置大致是以下內(nèi)容,(復(fù)制到web.xml中<web-app></web-app>節(jié)點(diǎn)中即可)
<!--WebService-->
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAP Monitor Service</display-name>
<servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/webservices/*</url-pattern>
</servlet-mapping>
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>



配置部署描述符
在WEB-INF目錄下建立server-config.wsdd
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml./axis/wsdd/"
xmlns:java="http://xml./axis/wsdd/providers/java"
xmlns:handler="http://xml./axis/wsdd/providers/handler"
xmlns:xsi="http://www./2001/XMLSchema-instance"
name="defaultClientConfig" xsi:type="deployment">
<globalConfiguration name="defaultClientConfig">
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<requestFlow name="RequestFlow1" type="">
<handler name="Handler1" type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler name="Handler2" type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
</requestFlow>
</globalConfiguration>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<transport name="http" type="">
<parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
<requestFlow name="RequestFlow1" type="">
<handler name="Handler1" type="URLMapper"/>
<handler name="Handler2" type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
</transport>
<transport name="local" type="">
<responseFlow name="ResponseFlow1" type="">
<handler name="Handler1" type="LocalResponder"/>
</responseFlow>
</transport>
<!--
<service name="AdminService" type="" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml./axis/wsdd/</namespace>
</service>
<service name="Version" type="" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>
-->
<!-- 自定義一個(gè)服務(wù),在以下節(jié)點(diǎn)中配置你的webservice -->
<service name="PlayerService" type="" provider="java:RPC"
style="rpc" use="encoded">
<parameter name="scope" value="Request"/>
<parameter name="className" value="com.hizon.web.service.PlayerService"/>
<parameter name="allowedMethods" value="*"/>
<namespace>http://service.web.</namespace>
</service>
</deployment>


部署描述文件可以由axis提供的工具生成,直接修改這個(gè)文件內(nèi)容也可.

PlayerService類
package com.hizon.web.service;
import java.util.Map;
public class PlayerService {
public Map getVideo(String id) {
Map videoMap = new HashMap();
//code
return videoMap;
}
}

PlayerService是一個(gè)普通的javabean,或者你可以直接在部署描述符中將負(fù)責(zé)數(shù)據(jù)提供的類指向你的POJO.
......
<parameter name="className" value="xxx.xxx.MyPOJO"/>
......
視頻表現(xiàn)方式

通過webservice,我們可以自由的獲取服務(wù)器端提供的數(shù)據(jù)信息.包括視頻作者資料,FLV文件地址等.接下來的工作便是如何在FLASH使用這些數(shù)據(jù)的問題了.由于時(shí)間和篇幅有限,不再累述.

總結(jié)

通過這篇文章,我們知道了如何flash和 MultipartRequest類的協(xié)助搭建我們的flash文件上傳系統(tǒng).

如何使用在java程序中使用ffmepg轉(zhuǎn)換視頻格式.以及如何使用axis搭建webservice容器為FLASH客戶端提供數(shù)據(jù).


文章所做的只是一個(gè)技術(shù)方案層面上的概述.并未涉及太多的編碼細(xì)節(jié).如有興趣,請(qǐng)登錄http:///bbs和殮....術(shù),或者訪問我的blog: http:///roller/bhlove

我將和你探討更多的相關(guān)知識(shí),以及與你共同解決存在的問題.
文章轉(zhuǎn)載請(qǐng)注明出處:http:///roller/bhlove,并且保持全文完整性,^^

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多