2015-10-19 92 views
2

我從一個高分辨率視頻文件開始,我想創建3個變體,低質量,中等質量和高質量的移動流。我希望將這些中/低/高變體分割成m3u8文件將指出的那些文件。有沒有辦法在ffmpeg的一行中做到這一點?使用FFMPEG創建HLS變體

我已經用ffmpeg成功生成了m3u8文件和ts段,我是否需要做這個3x並設置低/中/高的規格?如果是這樣,我怎樣才能讓單數m3u8文件指向所有變體而不是每個變體的變體?

這是我用來生成m3u8文件以及ts段的命令。

ffmpeg -i C:\Users\george\Desktop\video\hos.mp4 -strict -2 -acodec aac -vcodec libx264 -crf 25 C:\Users\user\Desktop\video\hos_Phone.m3u8

回答

7

是的,你需要編碼所有的變體和第一生成播放媒體(含段的播放列表)。

如果你想讓你可以在一個命令中完成,因爲ffmepg支持multiple inputs/outputs。例如:

ffmpeg -i input \ 
    ... [encoding parameters 1] ... output1 \ 
    ... [encoding parameters 2] ... output2 \ 
    ....[encoding parameters 3] ... output3 

您必須提供多種質量/比特率的變體,但縱橫比應保持相同。保持寬高比最初是強制性的,但在最新的HLS創作指南中將其降級爲推薦。

所有變體流必須是關鍵幀對齊的,因此使用-g選項設置GOP大小,禁用場景切換檢測並使用片段時間段hls_time,該時間段是您的關鍵幀間隔的倍數。

一旦您擁有了所有3x m3u8媒體播放列表,您就可以手動創建指向每個媒體播放列表的主播放列表。從Apple HLS documentation

例如,你必須根據自己的編碼選項更改帶寬,編解碼器,分辨率和播放列表文件名:

#EXTM3U 
#EXT-X-VERSION:6 
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2855600,CODECS="avc1.4d001f,mp4a.40.2",RESOLUTION=960x540 
medium.m3u8 
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5605600,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x720 
high.m3u8 
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1755600,CODECS="avc1.42001f,mp4a.40.2",RESOLUTION=640x360 
low.m3u8 
+0

您的答案和Apple HLS文檔都不解釋CODECS參數的含義。十六進制數字需要說明。沒有這個,你的答案是不可用的。 – DavidC

+2

@DavidC CODECS並不總是必需的。格式在[RFC 6381](https://tools.ietf.org/html/rfc6381)中進行了解釋,CODECS的用法在[HLS草案](https://tools.ietf.org/html/draft-潘託斯 - HTTP的實時流媒體-19)。 – aergistal

+0

如何計算「BANDWIDTH」值? (它不在輸入中。)根據[規範](https://tools.ietf.org/html/rfc8216#section-4.3.4.2),它應該是流的峯值帶寬。 – mjs

-1
  • 寬高比並不一定是相同的,這是沒有意義的。 你怎麼知道客戶可以玩什麼?

    對於非HD,長寬比爲4:3,對於HD變型,長寬比爲16:9。

  • 如果您的 需要段時間一致,則您不想在一個ffmpeg命令中執行所有變體。
  • 另外觀察轉碼向下,如果你從1080到360,那麼 可能是問題。我經常得到的是音頻降級,並且聽起來很奇怪。如果我想要高的質量,我會嘗試下去不超過一半。
  • @DavidC十六進制是編解碼器的版本號。