Предварительный просмотр миниатюр для HLS с использованием ffmpeg

У меня вопрос о преобразовании файла mp4 в HLS. Я также хотел бы включить первый кадр каждого фрагмента ts в качестве миниатюры в файл m3u8. Можно ли это сделать с помощью одной команды в ffmpeg? Любая помощь будет принята с благодарностью. Спасибо.

1 ответ

Самый простой способ: после того, как вы создалифайлы, переберите их в цикле (например, с помощью сценария оболочки) и используйте 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,5 кадра в секунду, поскольку 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.

Другие вопросы по тегам