Предварительный просмотр миниатюр для HLS с использованием ffmpeg
У меня вопрос о преобразовании файла mp4 в HLS. Я также хотел бы включить первый кадр каждого фрагмента ts в качестве миниатюры в файл m3u8. Можно ли это сделать с помощью одной команды в ffmpeg? Любая помощь будет принята с благодарностью. Спасибо.
1 ответ
Самый простой способ: после того, как вы создали
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.