色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

學習使用FFmpeg進行HLS打包

LiveVideoStack ? 來源:OTTVerse ? 作者:Krishna Rao Vijayanag ? 2022-05-09 10:27 ? 次閱讀

在本文中,我們將學習使用FFmpeg進行HLS打包。使用FFmpeg的好處在于:你可以在不離開命令行的情況下,執行提取視頻、調整視頻尺寸、轉碼、打包以及傳輸視頻的所有操作。

我們首先看一下為VOD(點播)創建HLS打包的所有步驟,然后再來了解HLS實時流的打包。

如果你想了解HLS播放列表的更多信息,可以訪問我們的m3u8文件合集:https://ottverse.com/free-hls-m3u8-test-urls/,查看使用不同用例的不同廠商的示例。如果你剛剛接觸HLS,請閱讀我們之前的文章:什么是HLS(HTTP Live Streaming)?理解ABR及其工作原理

事不宜遲,讓我們開始吧!

使用FFmpeg進行HLS打包的基礎步驟

好,現在讓我們看下使用HLS打包點播文件的基礎步驟:

  1. 從磁盤讀取輸入視頻

  2. 將視頻縮放/調整(scale/resize)為所需的多種分辨率版本

  3. 將每個縮放后的視頻轉碼到所需碼率

  4. 音頻轉碼到所需碼率

  5. 將視頻與音頻組合,然后打包每一個音、視頻組合,再創建各TS視頻切片和播放列表(playlist)

  6. 創建一個主播放列表(master playlist),用于指向每個變體(variant)

現在,讓我們一步一步來解決。

FFmpeg將視頻調整為多種分辨率版本

第一步和第二步包括從磁盤中讀取視頻,然后將其調整為多種分辨率。上述操作僅需一個命令,如下所示:

ffmpeg -i brooklynsfinest_clip_1080p.mp4 -filter_complex "[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]"

[0:v]指輸入文件的第一個視頻流。在我們的例子中,只有一個視頻流,它被分成3個輸出[v1][v2][v3]。它們每一個都作為FFmpeg縮放函數的輸入,該縮放函數接受一個高度和寬度數值用于執行縮放。

這里,我們將輸入視頻調整為1080p、720p和360p。

這里的[v1out][v2out][v3out]是包含縮放過程的輸出變量。注意,這里我們假設縮放過程會保留長寬比(aspect ratio)。當然,你可以在必要時使用letterboxing來處理。

審校者注:letterboxing是指將以寬銀幕比例拍攝的電影轉換到標準寬度的視頻格式時,同時保留電影的原始寬高比,由此產生的視頻圖像上下都有黑條的這個過程;這些黑條是圖像的一部分(即視頻信號的每一幀)。LTBX是其縮寫,標識如此格式化的電影和圖像。這個術語來自于信箱的形狀,信箱是墻壁或門上的一個槽,郵件通過它來傳遞,它是長方形的,寬于它的高度。下圖是一個 2.35:1比例的 widescreen 圖像經過letterboxing 處理之后,放在 1.33:1 屏幕上的一個例子。如下:

fc51e34e-cf2b-11ec-bce3-dac502259ad0.png

除此之外,還有pillarboxing和windowboxing等常見轉換模式。

將視頻轉碼為多種碼率用于HLS打包

接著,我們進入第三步和第四步:我們必須將視頻轉碼為多種碼率,正如ABR技術常做的那樣。

記住,我們已經將視頻調整為所需的分辨率并存儲進 [v1out][v2out][v3out]的輸出。我們將直接使用它們作為轉碼步驟的輸入。

-map [v1out] -c0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b0 5M -maxrate0 5M -minrate0 5M -bufsize0 10M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 -map [v2out] -c1 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b1 3M -maxrate1 3M -minrate1 3M -bufsize1 3M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 -map [v3out] -c2 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b2 1M -maxrate2 1M -minrate2 1M -bufsize2 1M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 -map a:0 -c0 aac -b0 96k -ac 2 -map a:0 -c1 aac -b1 96k -ac 2 -map a:0 -c2 aac -b2 48k -ac 2 

你能發現這里發生了什么嗎?我們已將三個變量[v1out][v2out][v3out]作為輸入,并使用libx264的slow預設置轉碼每個輸入到所需碼率。

注意:你也可以選擇你自己的編碼參數,并根據自己的喜好和要求進行修改。在這個示例中,我使用一些簡單的參數模擬CBR編碼。使用FFmpeg有無數方法可以轉碼你的視頻,你可以在預設置、crf值和CBR設置等不同參數組合之間任意選擇。

重要的是,我們已經將-keyint_min設置為48,它會強制設置關鍵幀出現的周期,這在ABR轉碼技術中非常重要。

現在,我們進行到下一個階段:為每一個碼率版本/變體(rendition/variant)創建HLS m3u8播放清單。

使用FFmpeg創建HLS播放清單(m3u8)

現在我們已經有了將視頻轉碼為不同碼率變體的命令,讓我們來使用FFmpeg創建HLS點播播放列表。

下面是進行HLS打包所需的重要設置:

  • hls_playlist_type=vod: 通過設置該值,FFmpeg創建了一個點播播放列表,將#EXT-X-PLAYLIST-TYPE:VOD插入到m3u8頭部中,并強制hls_list_size為0。

  • hls_time seconds:我們需要使用它設置目標切片長度(以秒為單位)。

  • 默認值為2秒,當2秒過去,切片將在下一個關鍵幀處被切片。

  • 之所以要求確保每個比特流變體在每N秒結束的時候都有一個關鍵幀(這點非常重要),因為ABR要求切片時候的關鍵幀要對齊,這樣才能無縫切換。

  • hls_segment_type:這里有兩個值:mpegts或fmp4,用于指定創建TS片段或fmp4(CMAF)片段,這對創建HLS和DASH的單一數據流很有用。

  • -hls_flags independent_segments:當確保播放列表中所有切片都以一個關鍵幀開始時,將#EXT-X-INDEPENDENT-SEGMENTS添加到播放列表中。

  • hls_segment_filename filename 用于在打包過程中為所創建的視頻切片命名。

下面是為單一視頻文件創建播放列表的示例:

-f hls -hls_time 2 -hls_playlist_type vod -hls_flags independent_segments -hls_segment_type mpegts -hls_segment_filename stream_%v/data%02d.ts -var_stream_map “v:0,a:0 v:1,a:1 v:2,a:2” stream_%v/stream.m3u8

如果你看到最后一行,你會注意到一個名為var_stream_map的功能選項。它是做什么的?

var_stream_map是一個FFmpeg功能選項,它幫助我們將各種視頻和音頻轉碼組合起來,以創建不同的HLS播放列表。如果你有兩個使用相同視頻但不同音頻的碼率版本,那么你可以選擇不同的視頻和音頻版本并將它們連接起來,而不是為了創建不同的播放列表而創建多個編碼。

比如,-var_stream_map "v:0,a:0 v:1,a:0 v:2,a:0"是指由a:0表示的音頻流被用于三種視頻碼率版本(rendition)。

FFmpeg獲取這些音頻和視頻的組合后,創建出名為stream_%v.m3u8的各變體的.m3u8 文件,其中%v 是一個迭代器,它從被打包的視頻流編號獲取對應的值。

使用FFmpeg創建主播放列表(m3u8)

如果你已經理解了如何使用FFmpeg創建HLS播放列表,那么使用FFmpeg創建主播放列表對你而言就很簡單了。如果你不知道什么是主播放列表的話,我可以告訴你:主播放列表就是一個文件,它列出了已由HLS打包的各個變體的播放列表。

為了使用FFmpeg創建主播放列表,只需將關鍵詞master_pl_name 添加到你的FFmpeg命令中,并提供你為主播放列表準備的名稱。比如,如果你想稱“主播放列表”為“master.m3u8”,只需寫下如下命令:

-master_pl_name master.m3u8

這就可以了。在FFmpeg執行該命令行之后,你將擁有一個HLS主播放列表,其中列出了其他播放列表的名稱。

使用FFmpeg-VOD進行HLS打包的最終腳本

ffmpeg -i brooklynsfinest_clip_1080p.mp4 -filter_complex "[0:v]split=3[v1][v2][v3]; [v1]copy[v1out]; [v2]scale=w=1280:h=720[v2out]; [v3]scale=w=640:h=360[v3out]" -map [v1out] -c0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b0 5M -maxrate0 5M -minrate0 5M -bufsize0 10M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 -map [v2out] -c1 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b1 3M -maxrate1 3M -minrate1 3M -bufsize1 3M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 -map [v3out] -c2 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b2 1M -maxrate2 1M -minrate2 1M -bufsize2 1M -preset slow -g 48 -sc_threshold 0 -keyint_min 48 -map a:0 -c0 aac -b0 96k -ac 2 -map a:0 -c1 aac -b1 96k -ac 2 -map a:0 -c2 aac -b2 48k -ac 2 -f hls -hls_time 2 -hls_playlist_type vod -hls_flags independent_segments -hls_segment_type mpegts -hls_segment_filename stream_%v/data%02d.ts -master_pl_name master.m3u8 -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" stream_%v.m3u8

讓我們看下該腳本的輸出。

它首先生成一個主播放列表,三個文件夾包含獨立的切片,以及三個變體的播放列表。

fc86401c-cf2b-11ec-bce3-dac502259ad0.png

下面是master.m3u8文件:

#EXTM3U#EXT-X-VERSION:6#EXT-X-STREAM-INF:BANDWIDTH=5605600,RESOLUTION=1920x1080,CODECS="avc1.640032,mp4a.40.2"stream_0.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3405600,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"stream_1.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1205600,RESOLUTION=640x360,CODECS="avc1.64001e,mp4a.40.2"stream_2.m3u8

你可以看到,主播放列表引用了分別用于1080p、720p和360p的HLS變體播放列表。

現在,我們來看看1080p HLS變體。它很明確地表明它是一個VOD播放列表,視頻切片都是獨立的,每個切片長度是2秒(按照我們的設置)。

#EXTM3U#EXT-X-VERSION:6#EXT-X-TARGETDURATION:2#EXT-X-MEDIA-SEQUENCE:0#EXT-X-PLAYLIST-TYPE:VOD#EXT-X-INDEPENDENT-SEGMENTS#EXTINF:2.002000,data00.ts#EXTINF:2.002000,data01.ts#EXTINF:2.002011,data02.ts#EXTINF:2.002000,data03.ts#EXTINF:2.002000,data04.ts#EXTINF:2.002000,data05.ts#EXTINF:2.002000,data06.ts#EXTINF:2.002000,data07.ts#EXTINF:2.002011,data08.ts#EXTINF:2.002000,data09.ts#EXTINF:0.041711,data10.ts#EXT-X-ENDLIST

使用FFmpeg進行HLS直播打包

如果你想通過FFmpeg創建一個直播HLS播放列表,這個過程和我們剛剛講過的VOD步驟區別不是很大。下面是你需要做出的更改:

  1. 刪除-hls_playlist_type vod

  2. 添加-hls_list_size ,并將其設置為一個數字,該數字表示各個變體播放列表中的切片數(你希望設置的數字)。

比如,如果我們將-hls_list_size 設置為2,那么整個播放列表將只包含兩個切片,FFmpeg將通過添加新的切片及刪除舊切片來重寫這個播放列表。

下面是一個示例:

#EXTM3U#EXT-X-VERSION:6#EXT-X-TARGETDURATION:2#EXT-X-MEDIA-SEQUENCE:1#EXT-X-INDEPENDENT-SEGMENTS#EXTINF:2.002000,data01.ts#EXTINF:2.002011,data02.ts

幾秒之后,切片data01.ts被刪除,并被切片data03.ts所取代。

#EXTM3U#EXT-X-VERSION:6#EXT-X-TARGETDURATION:2#EXT-X-MEDIA-SEQUENCE:2#EXT-X-INDEPENDENT-SEGMENTS#EXTINF:2.002011,data02.ts#EXTINF:2.002000,data03.ts

FFmepg中其他有用的HLS打包選項

最后,讓我們來快速瀏覽一些FFmpeg為點播和直播HLS打包所提供的一些其他有趣選項:

  1. hls_base_url baseurl:可用于將baseurl表示的值追加到播放列表的每個條目。

  2. hls_fmp4_init_filename filename : 設置文件名為分片文件頭文件,默認文件名為init.mp4。當你把片段類型設置為fmp4而非mpegts時,就會用到這個文件。

  3. hls_fmp4_init_resend:在m3u8文件每次刷新時,重新發送init文件,默認為0。


    審校者注:當var_stream_map設置為兩個或多個變體流時,文件名模式必須包含字符串"%v",這個字符串指定變體流索引在生成的init文件名中的位置。這時候可以結合上面的 hls_fmp4_init_resend 重新發送init文件。

  4. iframes_only : 將#EXT-X-I-FRAMES-ONLY添加到包含視頻切片并只能在 #EXT-X-BYTERANGE 模式下播放I幀的播放列表中。

結語

現在,我希望你已經很好地理解了如何通過FFmpeg來執行HLS流媒體協議轉碼和打包。有關使用 FFmpeg 進行 HLS 打包的完整選項列表,請查看 FFmpeg文檔:

https://ffmpeg.org/ffmpeg-formats.html#hls-2

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 磁盤
    +關注

    關注

    1

    文章

    375

    瀏覽量

    25201
  • HLS
    HLS
    +關注

    關注

    1

    文章

    129

    瀏覽量

    24097
  • ffmpeg
    +關注

    關注

    0

    文章

    46

    瀏覽量

    7395

原文標題:使用FFmpeg進行HLS打包——FFmpeg簡單學

文章出處:【微信號:livevideostack,微信公眾號:LiveVideoStack】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux文件壓縮打包的各種姿勢

    1.文件打包與壓縮 1.什么是文件壓縮? 將多個文件或目錄合并成為一個特殊的文件。比如: 搬家…腦補畫面 img. 2.為什么要對文件進行壓縮? 當我們在傳輸大量的文件時,通常都會選擇將該文件進行
    的頭像 發表于 12-02 09:25 ?191次閱讀

    使用TMS320C6000 MCBSP進行數據打包

    電子發燒友網站提供《使用TMS320C6000 MCBSP進行數據打包.pdf》資料免費下載
    發表于 10-26 10:54 ?0次下載
    使用TMS320C6000 MCBSP<b class='flag-5'>進行</b>數據<b class='flag-5'>打包</b>

    優化 FPGA HLS 設計

    優化 FPGA HLS 設計 用工具用 C 生成 RTL 的代碼基本不可讀。以下是如何在不更改任何 RTL 的情況下提高設計性能。 介紹 高級設計能夠以簡潔的方式捕獲設計,從而
    發表于 08-16 19:56

    一種在HLS中插入HDL代碼的方式

    很多人都比較反感用C/C++開發(HLS)FPGA,大家第一拒絕的理由就是耗費資源太多。但是HLS也有自己的優點,除了快速構建算法外,還有一個就是接口的生成,尤其對于AXI類接口,按照標準語法就可以很方便地生成相關接口。
    的頭像 發表于 07-16 18:01 ?730次閱讀
    一種在<b class='flag-5'>HLS</b>中插入HDL代碼的方式

    如何移植FFmpeg

    的全方位解決方案,深入掌握FFmpeg已成為每一位多媒體開發工程師的必修課。今天就跟各位小伙伴分享一篇共創社的學習筆記,探討一下如何移植FFmpeg。配置交叉編譯環
    的頭像 發表于 06-07 15:28 ?1655次閱讀
    如何移植<b class='flag-5'>FFmpeg</b>

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-如何移植FFmpeg

    的全方位解決方案,深入掌握FFmpeg已成為每一位多媒體開發工程師的必修課。今天就跟各位小伙伴分享一篇共創社的學習筆記,探討一下如何移植FFmpeg。 配置交叉編譯環境ELFbord官方
    發表于 06-06 09:32

    飛凌嵌入式ElfBoard ELF 1板卡-如何移植FFmpeg

    的全方位解決方案,深入掌握FFmpeg已成為每一位多媒體開發工程師的必修課。今天就跟各位小伙伴分享一篇共創社的學習筆記,探討一下如何移植FFmpeg。 配置交叉編譯環境ELFbord官方
    發表于 06-06 09:17

    《深入理解FFmpeg閱讀體驗》FFmpeg攝像頭測試

    零、前期工作 上文FFmpeg移植完成后,需要將x264/lib文件夾下的庫文件拷貝到開發板的/lib/目錄下,將ffmpeg_install/lib文件夾下的庫文件全部拷貝到開發板的/lib/目錄
    發表于 04-17 19:06

    《深入理解FFmpeg閱讀體驗》

    , not stripped pkgconfig:directory 二、編譯FFmpeg 首先從FFmpeg官方網站http://ffmpeg.org/download.html上下載FF
    發表于 04-16 22:54

    【米爾-芯馳D9360商顯板試用評測】FFmpeg移植

    ,介紹了FFmpeg封裝、編解碼和濾鏡部分的API使用操作,相關操作均以實例方式進行說明,包括新舊API的操作方法和異同,并給出了大量的API使用、自定義功能模塊、基于FFmpeg的API開發
    發表于 04-16 22:48

    【米爾-芯馳D9360商顯板試用評測】使用ffmpeg實現遠程視頻監控

    】 通過ffmpeg實現采集視頻,并推流給服務器,就可以實現遠程的視頻查看。也可以定義在服務器中對他進行傳發、錄像。
    發表于 04-11 13:07

    《深入理解FFmpeg閱讀體驗》ffmpeg安裝

    書中講了如何編譯安裝,我看了一下比較復雜,所以下載安裝包進行安裝,下載網址:Download FFmpeg 下載完后解壓出來在bin目錄下面有三個文件: 復制這個目錄: C:\\\\Users
    發表于 01-25 21:35

    《深入理解FFmpeg閱讀體驗》初識有感

    言中《如何閱讀本書》指出我們如何開始學習FFmpeg。老師建議從頭開始,上篇為基礎篇,下篇為API使用以及開發。 第三,書中還給我們指出如何從FFmpeg官方文檔、wiki以及推薦雷霄驊博士的
    發表于 01-07 19:48

    《深入理解FFmpeg閱讀體驗》+ 書收到了,嶄新的開篇

    今天收到了《深入理解FFmpeg》 嶄新的書,一個在2022年較近距離接觸過卻尚未深入研究的領域圖像處理。最近剛好在作這方面的研究,希望自己可以把握這次機會,好好學習FFMpeg,相信可以讓自己
    發表于 01-07 18:57

    AMD-Xilinx的Vitis-HLS編譯指示小結

    使用a=b,不允許使用 a=a+1,個人理解,合并過后的循環執行次數可能和原來不一樣,HLS會自動進行優化) 包含 FIFO 讀取的循環無法合并。合并會更改讀取順序。從 FIFO 或 FIFO接口執行讀取
    發表于 12-31 21:20
    主站蜘蛛池模板: 女生下面免费看| 黄色网址在线看| 欧美精品3atv一区二区三区| 欧美亚洲综合另类无码| 中国人泡妞xxxxxxxx19| 國產日韓亞洲精品AV| 某上海少妇3P黑人完整版BD| 亚洲综合色在线视频久| 蝴蝶中文娱乐| 亚洲国产高清在线| 国产网红主播精品福利大秀专区| 十七岁日本免费完整版BD| 成人无码国产AV免费看直播| 成人在线观看播放| 免费高清在线影片一区| 午夜免费小视频| 国产精品嫩草影院| 欧美激情一区二区三区视频| 99热国产这里只有精品免费| 国产精品自在自线亚洲| 翁熄性放纵交换300章| japanese幼儿videos| 女人张开腿让男人添| 99久久99久久精品免费看子| 美女的让男人桶爽网站| 亚洲中文字幕在线第六区| 寂寞夜晚免费观看视频| 亚洲视频欧美在线专区| 成人天堂婷婷青青视频在线观看| 热热久久超碰精品中文字幕| 变形金刚7免费观看完整| 日本美女抠逼| 第一福利视频网站在线| 暖暖 免费 高清 日本视频5| 在线高清电影理论片4399| 久青草国产在线视频| 91热久久免费精品99| 欧美深夜0000XXXX疯狂| 超污视频带污疼免费视频| 受被三个攻各种道具PLAY| 国产人A片在线乱码视频|