1. 程式人生 > 實用技巧 >使用ffmpeg將mp4切片成ts slice 並生成m3u8命令,同時讓IIS支援支援 m3u8

使用ffmpeg將mp4切片成ts slice 並生成m3u8命令,同時讓IIS支援支援 m3u8

使用ffmpeg將mp4切成ts片段的時候會碰到一個問題,就是生成的m3u8檔案裡只有最後的五個片段的資訊。

這是因為ffmpeg 預設的list size 為5,所以只獲得最後的5個片段。為了解決這個問題,需要指定引數-hls_list_size 0,這樣就能包含所有的片段

ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8

不過最常用的命令是:

ffmpeg -i foo.mp4 -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_list out.m3u8 -segment_time 10 out%03d.ts

為什麼要加上引數-vbsf h264_mp4toannexb

官方文件說Convert an H.264 bitstream from length prefixed mode to start code prefixed mode (as defined in the Annex B of the ITU-T H.264 specification).

這個問題在用ffmpeg從mp4裡提取碼流的時候(命令:ffmpeg -i foo.mp4 -vcodec copy -an foo.h264)也會碰到,生成的264檔案無法播放,碼流走中並沒有00 00 00 01來分隔每一幀,這是因為預設是使用length prefixed mode,而不是以00 00 00 01起始碼作為prefixed,也就是說沒使用start code prefixed mode.

所以從mp4裡提取碼流的時候也需要加上引數-vbsf h264_mp4toannexb

正確命令為:ffmpeg -i foo.mp4 -vcodec copy -an -vbsf h264_mp4toannexbfoo.h264

在IIS的mine中新增

<mimeMap fileExtension=".m3u8" mimeType="application/x-mpegURL" />
<mimeMap fileExtension=".ts" mimeType="video/MP2T" />