用ffmpeg轉成HLS串流(m3u8)

用ffmpeg轉成HLS串流,原本內容有人反應太精簡了,而且用起來也有問題,所以2022重新調整過,整理如下。

轉成HLS串流

HLS串流其實是由m3u8檔案(文字檔)與許多小片段(Segment)的影音檔.ts/.mp4所構成, 所以我們在生成HLS串流時,可以指定片段的檔名格式, 及本身m3u8的檔案名稱。轉換指令如下:

ffmpeg -i {your-video} -c copy -f hls \
    -hls_list_size 0 -hls_time 5 -hls_flags split_by_time \
    -hls_segment_filename 'segment-%03d.ts' output.m3u8
  • -i {your-video} 指定轉換使用的來源影片
  • -c copy是指所有編碼(audio/video)都拷貝來源影片的,只作demux和mux
    如果你的來源影片不是mp4/ts檔案,可能會需要重新編碼,使用這個選項也會失敗(無法播放)
    需要重新編碼時,建議使用 -c:v h264 -crf 30 -c:a aac -b:a 192k 
  • -hls_list_size 0 表示不指定m3u8內的片段數量;預設只轉最後5個片段
  • -hls_time 5 切分影音片段秒數;預設是2秒
  • -hls_flags split_by_time 要求ffmpeg依照指定時間切分
    如果沒有指定split_by_time,則ffmpeg不一定依照上個-hls_time所指定的時間作切分依據,例如我手上幾個檔案就只會一整個檔案直接輸出,都沒切分
  • -hls_segment_filename 'segment-%03d.ts' 則是表示影音片段要輸出成這個檔名的形式, %03d是C/C++常用的printf的格式寫法,輸出的影音片段會是test-000.ts, test-001.ts, test-002.ts ..... 
以上這個設定只是一個基本形式,其他還有可指定第一個影音檔長度的hls_init_time

留言