我想通過後端帶有tapestry5(5.3.5)的HTML5視頻標籤將視頻流式傳輸到我的iPad。通常服務器端框架甚至不應該在這方面發揮作用,但它不知道如何。視頻流式傳輸到ipad不適用於Tapestry5
無論如何,希望這裏有人能幫助我。請記住,我的項目是一個原型,我所描述的內容被簡化/簡化爲相關部分。如果人們沒有迴應強制性的「你想做錯事」或與問題無關的安全/性能問題,我將非常感激。
所以這裏有雲:
設置
我從蘋果HTML5拍攝的視頻展示,所以我知道該格式是不是一個問題。我有一個簡單的tml頁面「播放」,只包含一個「視頻」標籤。
問題
我開始通過實施處理通過打開引用的視頻文件,並將其流媒體客戶端從視頻控制的請求RequestFilter。這是基本的「如果路徑以'文件'開始,然後將文件輸入流複製到響應輸出流」。這對Chrome非常適用,但不適用於Ipad。好吧,我雖然,一定是我失蹤的一些標題,所以我再次看着Apple Showcase,幷包含相同的標題和內容類型,但沒有喜悅。
接下來,我想,讓我們看看如果我讓t5服務文件會發生什麼。我將視頻複製到了webapp上下文,禁用了我的請求過濾器,並將簡單文件名放在視頻的src屬性中。這適用於Chrome和iPad。 這讓我感到驚訝,並促使我看看T5如何處理靜態文件/上下文請求。到目前爲止,我只是覺得有兩種不同的方式,我已經通過使用@Path(「context:」)將硬連線「視頻src」切換到資產來確認。這又一次適用於Chrome,但不適用於iPad。
所以我真的迷失在這裏。在「簡單的上下文」請求中,這個祕密果汁是什麼使它能夠在IPad上工作?沒有什麼特別的,但它是唯一的方法。問題是,我真的不能從我的web應用程序上下文服務於那些西元...
解決方案
所以,事實證明,有這個所謂的「範圍」 HTTP頭和iPad的,不同於Chrome使用它與視頻。那麼「祕訣」就是靜態資源請求的servlet處理程序知道如何處理範圍請求,而T5則不知道。這是我的自定義實現:
OutputStream os = response.getOutputStream("video/mp4");
InputStream is = new BufferedInputStream(new FileInputStream(f));
try {
String range = request.getHeader("Range");
if(range != null && !range.equals("bytes=0-")) {
logger.info("Range response _______________________");
String[] ranges = range.split("=")[1].split("-");
int from = Integer.parseInt(ranges[0]);
int to = Integer.parseInt(ranges[1]);
int len = to - from + 1 ;
response.setStatus(206);
response.setHeader("Accept-Ranges", "bytes");
String responseRange = String.format("bytes %d-%d/%d", from, to, f.length());
logger.info("Content-Range:" + responseRange);
response.setHeader("Connection", "close");
response.setHeader("Content-Range", responseRange);
response.setDateHeader("Last-Modified", new Date().getTime());
response.setContentLength(len);
logger.info("length:" + len);
byte[] buf = new byte[4096];
is.skip(from);
while(len != 0) {
int read = is.read(buf, 0, len >= buf.length ? buf.length : len);
if(read != -1) {
os.write(buf, 0, read);
len -= read;
}
}
} else {
response.setStatus(200);
IOUtils.copy(is, os);
}
} finally {
os.close();
is.close();
}
這是有用的信息;沒有理由爲什麼Tapestry無法在標準資產處理代碼中自動處理;我們只是不知道它需要做什麼。將這一級別的信息添加到我們的JIRA是第一步。 –
優秀的答案。馬上就像魅力一樣工作。非常感謝。 –