?

基于JSP的流媒體播放的設計與實現

2016-11-02 23:11楊子祥林鵬
電腦知識與技術 2016年18期
關鍵詞:流媒體

楊子祥 林鵬

摘要:隨著Internet的發展,網頁視頻播放的使用越來越多。但是,目前如果直接通過HTML5的

3 基于JSP的在線流媒體播放的實現

在第二節中,本文通過Chrome的Http包的追蹤功能,截取了視頻在播放控制過程中不同播放位置請求的包。通過圖2、圖3和圖4的追蹤結果可以看到他們的Request Headers以及Response Headers中的部分頭文件字段是不同的,具體的信息比較如表1所示。

由表1中可以看到,三個圖中的Http包中只有Range、Content-Range字段是不同的,其他的字段的內容根本就沒有發生變化。其中,Range是Request Headers中的字段,Content-Range是Response Headers中的字段。在表1中還可以發現,Content-Range字段的內容和Range字段的內容有一定的關系;Content-Range內容中“-”前的數值和Range是一致的。同時,在表1中也可以發現,Content-Range字段和Content-Length字段有一定的關系;Content-Range內容中“/”后的數值和Content-Length是一致的。我們知道,Http包中的Content-Length的作用主要是記錄文件的長度,因此可以在服務器端通過程序求出文件的大小。

由于Http包中的Request Headers是由瀏覽器進行發出并封裝的,因此本文的程序無法控制包中的Request Headers內容。但是,Http包中的Response Headers是由服務器封裝后返回給瀏覽器的;因此,本文的程序設計將會根據Http包中的Request Headers字段內容,對Http包中的Response Headers字段進行封裝返回給服務器。根據以上的分析,本文通過JSP進行程序設計如下:

@RequestMapping(value = { "/videos/{path}" })

public String displayVideo(HttpServletRequest request,

HttpServletResponse response, @PathVariable String path) {

try {String filePath = videoDir + path + ".mp4";

File file = new File(filePath);

if (!file.exists()) {

response.sendError(404);

LOG.error("未找到文件" + file.getCanonicalPath());}

Long fileLength = file.length();

LOG.debug("文件找到了,大小為" + fileLength);

String range = request.getHeader("range");

if (range != null && !range.equals("")) {

LOG.debug("請求的名字是range,內容是" + range); }

Long startPos = 0l;

if (range != null && !range.equals("")) {

Pattern pattern = Pattern

.compile("^bytes\\=(\\d+)(?:\\-(\\d+)?)?$");

Matcher matcher = pattern.matcher(range);

LOG.debug(matcher.matches());

startPos = Long.parseLong(matcher.group(1), 10);

LOG.debug("成功截獲range,開始位置是" + startPos);

response.setStatus(206);

} else {

response.setStatus(200);

LOG.debug("從頭開始傳送");}

InputStream is = new FileInputStream(file);

OutputStream os = response.getOutputStream();

byte[] buffer = new byte[1024];

response.addHeader("Content-Range", "bytes " + startPos + "-"

+ (fileLength - 1) + "/" + fileLength);

response.addHeader("Content-Length", fileLength.toString());

response.setCharacterEncoding("UTF-8");

response.setContentType("video/mp4");

response.setHeader("Accept-Ranges", "bytes");

is.skip(startPos);

int length = is.read(buffer);

while (length > 0) {

os.write(buffer, 0, length);

length = is.read(buffer); }

os.flush();

os.close();

is.close();

} catch (Exception err) {

if (err.getClass()

.getName()

.equals("org.apache.catalina.connector.ClientAbortException")) {

LOG.debug("客戶掛斷了");

} else {

err.printStackTrace();}}

return null; }

在本文的程序設計中,瀏覽器的視頻請求URL路徑的后端是通過JSP中的Spring框架進行控制,在路徑中的/videos/{paths}即是視頻路徑存儲在磁盤的相對位置;在程序中,視頻的讀取并沒有經過中間的流媒體服務器,而是直接讀取在磁盤中的視頻文件。經過程序發布在Tomcat7上測試之后,視頻在播放的過程中,用戶可以根據需求隨意拖拽,解決了Html5中

4 結論

本文通過分析Windows Media Services流媒體服務器中視頻拖拽播放控制過程中,Chrome瀏覽器發送的Http包的信息,得出了瀏覽器播放視頻時播放控制和Http包中Request Headers、Response Headers頭文件的關系。并且,本文通過JSP程序語言的設計,成功實現了流媒體服務器控制視頻播放的原理。本文設計的程序發布到Tomcat后,經過該程序訪問的視頻都可以在瀏覽器端隨意拖拽播放視頻,解決了Html5的

參考文獻:

[1] 蔣太杰. Windows Media Services及其在遠程教育中的應用[J]. 指揮技術學院學報, 2001, 12(6): 81-85.

[2] 王雪婷, 于勇. Windows Media Services流媒體技術與實現[J]. 信息技術與信息化, 2006(1): 51-53+64.

[3] 李學俊. Windows Media Services及其在遠程教育中的應用[J]. 現代遠程教育研究, 2002(3): 27-29.

[4] 高劍. 利用Windows Media流媒體技術構建網絡直播系統[J]. 中國高新技術企業, 2010(30): 62-64.

猜你喜歡
流媒體
基于云服務的P2P流媒體技術在遠程教學視頻傳輸中的應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合