如何利用ffmpeg將影片轉換成HLS切片

HLS(HTTP Live Stream)是蘋果推出的影音串流的標準,目前可支援大多數的行動裝置與電視盒,如何利用ffmpeg將直播或影片進行切片(chunk)轉成HLS格式。
編碼參數說明不多敘述。

直播

以udp為例:

ffmpeg -y -i udp://@:10000 -c copy -hls_segment_type fmp4 -hls_time 6 -hls_list_size 10 -hls_flags delete_segments+append_list+split_by_time -hls_playlist_type event ~/hls/index_4000.m3u8

影音編碼器(Encoder)將直播訊號發送到轉碼用PC(Transcoding PC),將影音內容的編碼方式直接轉換(-c copy)。
-hls_time:設定每個切片(chunk)的長度(秒),這裡設定為6秒一個切片。
-hls_segment_type: fmp4 or mpegts,切片的格式為mp4或者為mpeg-2 ts格式,目前hls version 7以上可採用mp4格式類似於mpeg-dash
-hls_list_size:設定playlist播放清單最多的內容,如果是0則無限制。因此為直播內容,可預先保留最大的值,這裡設定為10,就是會預先切個10個切片的播放清單,前面hls_time設定為6秒,切十個,就是預留60秒的內容進行播放。相對的,就有會將近60秒的延遲。
-hls_flags:有很多參數可用,這裡使用了delete_segments, append_list, split_by_time, 分述如下:

  • delete_segments: 在segment的持續時間加上播放列表(playlist)的持續時間之後的一段時間之後刪除從播放列表中刪除的段文件(segment)。
  • append_list: 將新segment添加到舊segment列表的末尾,並從舊段列表中刪除#EXT-X-ENDLIST。
  • split_by_time: 允許segment在關鍵幀(key frame)以外的幀上啟動。 當關鍵幀之間的時間不一致時,這會改善某些玩家的行為,但可能會使其他播放器的情況變得更糟,並且在搜索過程中可能會導致一些奇怪的現象。 此標誌應與hls_time選項一起使用。

-hls_playlist_type: event,發出#EXT-X-PLAYLIST-TYPE:m3u8標題中的EVENT。 強制hls_list_size為0; 播放列表(playlist)只能附加到。

點播內容:

此應用就是將一個mp4的影音檔案進行切割成HLS的切面,因此,也就是mp4的檔案轉換程式:

ffmpeg -i $1 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls ${1%.*}.m3u8

為了讓多數的播放器,特別是行動裝置,這裡將影音的格式轉為mpeg-4, h264, baseline level 3.0的格式,以及640×360的影片大小,讓絕大多數的播放器都可以正常播放。
-start_number 0: 從一開始就進行切片
-hls_list_size 0: 如前述,這裡因為是要把整個mp4檔案轉換,所以就不限定playlist的內容大小了。

有關ffmpeg的HLS以及格式參數可參考這網址:https://ffmpeg.org/ffmpeg-formats.html

發佈留言