如何使用ffmpeg创建播放列表/不同的带宽?

时间:2016-05-21 15:20:03

标签: servlets ffmpeg streaming hls

我正在尝试从.mp4文件创建一个hls流。到目前为止,我可以创建一个清单+ .ts文件,但我没有playlist.m3u8来决定我应该根据用户的带宽给用户哪个manfest。我该怎么做?

这是我当前创建HLS流的命令(无播放列表):

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

这产生的是out.m3u8:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, 
out.ts
#EXTINF:10, 
out.ts

我想要创建的内容:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000
low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000
medium.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
high.m3u8

1 个答案:

答案 0 :(得分:4)

要首先执行adaptive streaming with HLS,您需要以您想要支持的比特率对视频进行编码。请看一下Apple的encoding recommendations作为一些例子。

完成后,您需要对每个视频进行细分并为其生成播放列表。最后一步是创建一个master playlist,您可以在其中添加变体播放列表的网址和有关每个流的信息,例如带宽,分辨率等等 - 这是您将用作视频源的播放列表玩家。

例如,假设您的源视频是以1080p拍摄的,并且您希望生成视频比特率为1200k的360p变体。您可以使用以下ffmpeg命令执行此类操作:

ffmpeg -i 1080p.mov -c:v libx264 -vprofile baseline -vlevel 3.1 -s 640x360 -b:v 1200k -strict -2 -c:a aac -ar 44100 -ac 2 -b:a 96k 360p.mov

请注意,您生成变体的(源)视频需要高质量 - 您无法对720p视频进行编码(不进行升级)。

接下来,运行与您问题中的命令类似的命令,以生成此视频的播放列表和细分:

ffmpeg -i 360p.mov -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_time 10 -segment_format mpegts -segment_list 360p/playlist.m3u8 -segment_list_type m3u8 360p/fileSequence%d.ts

现在创建一个主播放列表并添加刚刚创建的播放列表的(相对)URL。所以像这样:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1228800,CODECS="mp4a.40.2,avc1.4d401e",RESOLUTION=640x360
360p/playlist.m3u8

(带宽属性还应考虑音频的比特率,我在这里没有做过。)

对其他变种重复此过程。

播放器将使用有关播放列表中可用流的信息以及当时的可用带宽来确定哪个流最适合播放。