[英]Why Safari on iOS is not showing my HTML5 video poster?
我有這個網頁:
http://healthpad.net/dashboard/
它有 10 個<video>
元素。
出於某種原因,當我在 iPad 上加載頁面時,它沒有顯示視頻海報。
請嘗試以下操作:
請告訴我為什么會這樣?
這是我已經排除的:
圖像內容類型標頭。
我已驗證圖像內容類型標頭已正確設置。 在上面的示例中, Content-Type
標題正確image/jpeg
。
干擾 video.js 庫
VideoJs 用於在桌面瀏覽器上顯示漂亮的播放按鈕並自定義控件。 但是,此庫不會干擾本機播放器。
只是為了確保,我創建了一個沒有 video-js 類的測試視頻頁面,因此庫不會選擇和處理該視頻。 事實上,測試頁面甚至不包含任何 JS 庫,它只是
<html><body>
<video
controls
height="400"
width="600"
poster="http://healthpad.net/media/CACHE/images/uploads/video_poster_1414/bd5fba5a68ddd0f4b3f61193f6908962.jpg"
src="http://healthpad.net/media/uploads/video_processed_720p_1414.mp4"
></video>
</body></html>
http://healthpad.net/rj_templates/test/zzz/
使用 Mobile Safari 可能不支持的任何視頻屬性
上面的測試頁面只有一個普通的視頻標簽。 我嘗試刪除除src
和poster
之外的所有其他屬性,但沒有幫助。
大多數關於該主題的 StackOverflow 問題只是說“重啟你的 iPad”
這就是它變得奇怪的地方:
如果您對此進行谷歌搜索,StackOverflow 上已被接受的答案通常會說“重新啟動您的 iPad,它為我做了”。
所以我嘗試做同樣的事情,起初我只是說它在我的情況下不起作用。
然后,我嘗試了這個:
(以下所有內容均在 iPad 模擬器上)
很明顯, Mobile Safari 在某些時候決定不再顯示任何視頻海報。 此外,顯然,我的網站觸發了這種情況。
說明:
當海報不再有效時,它不僅會出現在一個域中,也不會為任何其他站點加載視頻海報,無論它是否位於完全不同的域(例如來自http://www.videojs的演示視頻) .com/ )。
為了重置此行為,根據我所見,您必須殺死並重新啟動 Safari。 只是關閉並重新打開它不會重置此狀態。
有誰知道為什么會這樣? 有沒有辦法解決它?
編輯:看起來這不再有效。 考慮到 iOS 在過去 7 年中發生了多少變化,這並不令人震驚。
我通過使用 PNG 而不是 JPG 來完成這項工作。
奇怪的是,JPG 在本地的 iOS Safari 中工作(通過本地 wifi 上的 POW 服務器)但是當推送到登台時,海報圖像沒有加載。 本地代碼和暫存代碼都引用了 S3 上的同一個文件。
將文件格式更改為 PNG 並且可以正常加載。
我看到這個問題時不時地被點贊,盡管沒有答案。 所以這就是我最終做的:
在 iOS 上,我不會顯示視頻播放器(即使使用autoload=false
),我只會顯示海報和播放按鈕,兩個獨立的<img>
標簽。 當它們被點擊時,我從 javascript 創建視頻播放器並告訴它播放。 工作正常,用戶看不出太大區別。
我通過在我的代碼中添加 preload="none" 來修復它。
<video width="344" preload="none" height="217" poster="/themes/custom/xxxxxx">
在 Safari 設置中 [iOS7] 阻止彈出窗口關閉似乎可以解決這個問題,希望這會有所幫助。
好吧,如果有人仍然堅持這就是我在 React.js 中設法完成它的方式,但算法本身在任何框架中都應該有用:
首先,我在 useEffect 中使用以下內容檢測瀏覽器是否為 safari:
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
然后我將它設置在一個狀態對象中。
如果 safari 是真的,那么我不會顯示視頻,而是顯示一張以該海報為來源的圖像。 然后我在圖像標簽上有一個 onClick 處理程序,單擊它會將上述狀態更改回 false,因此圖像組件將停止顯示,而將顯示視頻。 現在您必須在這里解決的另一個問題是,在單擊圖像時,圖像將消失,視頻將出現,然后您必須再次單擊視頻才能播放。 那是糟糕的用戶體驗。 因此,您可以在設置狀態后簡單地將 ref 附加到視頻和圖像的點擊處理程序中:
videoRef.current.play()
這也將開始播放視頻。 我知道這是一個 hacky 解決方案,所以不要來找我,但這是我唯一能做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.