使用 ffmpeg 进行 HLS 缩略图预览

使用 ffmpeg 进行 HLS 缩略图预览

我有一个关于将 mp4 文件转换为 HLS 的问题。我还想将每个 ts 块的第一帧作为缩略图包含在 m3u8 文件中。是否可以使用 ffmpeg 中的单个命令来实现此目的?如能提供任何帮助,我将不胜感激。谢谢。

答案1

最简单的方法:创建文件后.ts,循环遍历它们(例如使用 shell 脚本),然后使用 ffmpeg 提取每个文件的第一帧,例如:

ffmpeg -i segment01.ts -frames:v 1 -s 320x240 thumbnail01.png

并行执行此操作肯定会加快速度,例如parallel

parallel echo ffmpeg -i {} -frames:v 1 -s 320x240 {.}.png ::: *.ts

要直接从 HLS 命令执行此操作,您需要生成另一个视频流。假设您有这个基本的纯视频 HLS 生成命令(我懒洋洋地改编自这里):

ffmpeg -f lavfi -i testsrc=duration=10:rate=24:size=1920x1080 \
  -filter_complex \
  "[0:v]split=3[v1][v2][v3]; \
  [v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]" \
  -map "[v1out]" -c:v:0 libx264 -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M -bufsize:v:0 10M -g 48 -sc_threshold 0 -keyint_min 48 \
  -map "[v2out]" -c:v:1 libx264 -b:v:1 3M -maxrate:v:1 3M -minrate:v:1 3M -bufsize:v:1 3M -g 48 -sc_threshold 0 -keyint_min 48 \
  -map "[v3out]" -c:v:2 libx264 -b:v:2 1M -maxrate:v:2 1M -minrate:v:2 1M -bufsize:v:2 1M -g 48 -sc_threshold 0 -keyint_min 48 \
  -f hls \
  -hls_time 2 \
  -hls_playlist_type vod \
  -hls_flags independent_segments \
  -hls_segment_type mpegts \
  -hls_segment_filename stream_%v/segment_%02d.ts \
  -master_pl_name master.m3u8 \
  -var_stream_map "v:0 v:1 v:2" stream_%v.m3u8

您需要再添加一个仅包含缩略图的视频流。我们增加了分割数,并添加了一个滤镜链,该滤镜链会缩小缩略图并将其帧速率降低到每 2 秒一个缩略图(即 0.5fps,因为 2 秒也是片段的持续时间):

ffmpeg -y -f lavfi -i testsrc=duration=10:rate=24:size=1920x1080 \
  -filter_complex \
  "[0:v]split=4[v1][v2][v3][thumbs]; \
  [v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out];[thumbs]scale=w=428:h=240,fps=fps=0.5[thumbsout]" \
  -map "[v1out]" -c:v:0 libx264 -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M -bufsize:v:0 10M -g 48 -sc_threshold 0 -keyint_min 48 \
  -map "[v2out]" -c:v:1 libx264 -b:v:1 3M -maxrate:v:1 3M -minrate:v:1 3M -bufsize:v:1 3M -g 48 -sc_threshold 0 -keyint_min 48 \
  -map "[v3out]" -c:v:2 libx264 -b:v:2 1M -maxrate:v:2 1M -minrate:v:2 1M -bufsize:v:2 1M -g 48 -sc_threshold 0 -keyint_min 48 \
    -f hls \
    -hls_time 2 \
    -hls_playlist_type vod \
    -hls_flags independent_segments \
    -hls_segment_type mpegts \
    -hls_segment_filename stream_%v/segment_%02d.ts \
    -master_pl_name master.m3u8 \
    -var_stream_map "v:0 v:1 v:2" \
    stream_%v.m3u8 \
  -map "[thumbsout]" \
    -c:v:3 png \
    -vsync:v:3 vfr \
    -f image2 \
    thumbs_%03d.png

这将与 HLS 流并行生成缩略图。

相关内容