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

San*_*hah 2 streaming servlets ffmpeg http-live-streaming

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

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

ffmpeg -i test.mp4 -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_list out.m3u8 -segment_time 10 out%03d.ts
Run Code Online (Sandbox Code Playgroud)

这创建的是 out.m3u8:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, 
out.ts
#EXTINF:10, 
out.ts
Run Code Online (Sandbox Code Playgroud)

我想创造什么:

#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
Run Code Online (Sandbox Code Playgroud)

Sim*_*mon 6

首先要使用 HLS进行自适应流媒体,您需要以您想要支持的比特率对视频进行编码。请查看 Apple 的一些示例编码建议

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

例如,假设您的源视频是以 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
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

对其他变体重复此过程。

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