我在公共 S3 存盤桶中有很多長(45 分鐘 - 90 分鐘)MP4 視頻,我想在我的 iOS 應用程式中使用AVPlayer.
我正在AVPlayerViewController播放它們,但我需要等待幾分鐘才能開始播放,因為它會下載整個視頻而不是流式傳輸。
我在本地快取它,所以這只是第一次發生,但我很想流式傳輸視頻,這樣用戶就不必等待整個視頻下載。
有些人指出我需要 Cloudfront 來流式傳輸視頻,但在檔案中,我讀到只有當您有很多人流式傳輸相同的檔案時才需要這樣做。我正在構建一個 MVP,所以我只需要一個簡單的解決方案。
有什么方法可以從 S3 存盤桶流式傳輸 MP4 視頻,AVPlayerViewController而無需在將檔案播放給用戶之前完全下載檔案?
uj5u.com熱心網友回復:
TLDR
AVPlayer不支持您定義的“流式傳輸”(HTTP 范圍請求),因此要么使用替代的視頻播放器,要么使用真正的媒體流協議,如AVPlayer&支持的 HLS,將在下載所有視頻之前啟動視頻。
CloudFront 通常非常適合交付,但并不是真正需要 - 您可能已經看到由于 CloudFront 
問題與 AVPlayer
不幸的是,AVPlayer不支持使用 HTTP 范圍請求和 HTTP 206 部分內容回應的“流式傳輸”。我已經通過在 Xcode 中創建演示 iOS 應用程式手動驗證了這一點。
這與 S3 無關- 如果您將這些檔案存盤在任何其他云提供商或檔案服務器上,您會看到檔案在播放之前仍然完全加載。
可能的解決方案
現在問題很清楚了,有2個解決方案。
使用其他視頻播放器
最簡單的解決方案是使用支持位元組范圍提取的替代視頻播放器。我不是 iOS 開發方面的專家,所以很遺憾我無法推薦替代方案,但我敢肯定會有一個流行的庫,業界更喜歡內置的AVPlayer. 這將為您提供“流媒體”的(非常常見的)定義。
使用視頻流協議
但是,如果您必須使用AVPlayer,解決方案是使用視頻流協議實作真正的媒體流 - 真正的流還允許您利用自適應位元率切換、實時音頻切換、許可等功能。
有很多這樣的協議可用,如DASH(HTTP 上的動態自適應流)、SRT(安全可靠傳輸)和最后但并非最不重要的HLS(HTTP 實時流)。
今天,互聯網上使用最廣泛的流媒體協議是蘋果自己創建的 HLS(嘿,也許不支持范圍請求的原因是強迫你使用該協議)。如果您有興趣,Apple 自己的檔案非常適合深入研究。
無需過多了解協議細節,HLS 將允許播放開始更快,快進可以更快,并在觀看真正的流媒體體驗時提供視頻。
繼續使用 HLS:
使用AWS Elemental MediaConvert將您的 MP4 檔案轉換為 HLS 格式 -
.M3U8除了.ts媒體段檔案之外,生成的輸出將是 1 個(或更多)清單檔案將結果輸出上傳到 S3
點
AVPlayer到.M3U8檔案
let asset = AVURLAsset(url: "https://ermiya.s3.eu-west-1.amazonaws.com/videos/video1playlist.m3u8")
let item = AVPlayerItem(asset: asset)
...
- 享受近乎即時的視頻加載
CloudFront
關于Amazon CloudFront,它本身不是必需的,在這種情況下 S3 就足夠了,但是快速的 Google 搜索會提到它提供的大量好處,尤其是快取,它可以幫助您以后節省 S3 成本。
結論
如果可以的話,我會選擇轉換為 HLS,因為它會產生更多的可能性,并且通常是更好的真實流媒體體驗,但由于 iOS 的AVPlayer限制,使用替代視頻播放器也能正常作業。
是否使用 CloudFront,將取決于您的用戶群、S3 的使用情況和其他因素。
在創建 MVP 時,我建議您將 MP4 檔案批量轉換為 HLS 格式,而不使用 CloudFront,這會增加云配置的復雜性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/409191.html
標籤:
上一篇:如何在AndroidStudio的TextView段落中創建和設定可點擊的行內鏈接的樣式,而不設定完整的TextView樣式?
