LINUX.ORG.RU
ФорумTalks

Помогите с синтаксисом ffmpeg (hls)

 


0

2

Товарищи, помогите неосилятору.

Вот есть скрипт:

c:\ffmpeg\bin\ffmpeg.exe -hide_banner -y -i F:\_FFMPEG-In\mm.mp4 ^
-sc_threshold 0 -g 30 -keyint_min 30 ^
-map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 ^
-c:v:0 h264 -profile:v:0 main -preset:v:0 medium -tune:v:0 film -crf:v:0 26 -maxrate:v:0 1M -bufsize:v:0 2M  -filter:v:0 "scale=w=3840:h=-1" ^
-c:v:1 h264 -profile:v:1 main -preset:v:1 medium -tune:v:1 film -crf:v:1 22 -maxrate:v:1 3M -bufsize:v:1 6M  -filter:v:1 "scale=w=3840:h=-1" ^
-c:v:2 h264 -profile:v:2 main -preset:v:2 medium -tune:v:2 film -crf:v:2 26 -maxrate:v:2 4M -bufsize:v:2 7M  -filter:v:2 "scale=w=4096:h=-1" ^
-c:v:3 h264 -profile:v:3 main -preset:v:3 medium -tune:v:3 film -crf:v:3 22 -maxrate:v:3 6M -bufsize:v:3 10M -filter:v:3 "scale=w=4096:h=-1" ^
-c:v:4 h264 -profile:v:4 main -preset:v:4 medium -tune:v:4 film -crf:v:4 24 -maxrate:v:4 8M -bufsize:v:4 14M -filter:v:4 "scale=w=7680:h=-1" ^
-c:a:0 aac -b:a:0 160k ^
-c:a:1 aac -b:a:1 160k ^
-c:a:2 aac -b:a:2 160k ^
-c:a:3 aac -b:a:3 160k ^
-c:a:4 aac -b:a:3 160k ^
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 v:3,a:3 v:4,a:4" ^
-master_pl_name master.m3u8 ^
-f hls ^
-hls_time 4 ^
-hls_playlist_type vod ^
-hls_list_size 0 ^
-hls_segment_filename "F:\_FFMPEG-Out\%%v\episode-%%03d.ts" "F:\_FFMPEG-Out\%%v\episode.m3u8"

Он, даже, работает. И видео потом играют, хлс работает и т.п.

Но я хочу в выходном каталоге иметь вложенные каталоги с более понятными названиями, чем «0, 1, 2, 3…». Хочется более понятное, типа 4k-low, 4k, 4k-max и т.п. Но я не осиливаю эту карту составить. Гуглится разное, но на практике применить что-то не могу.


Судя по доке, только %d, %v и поддерживаются. Потому, я бы завернул эту портянку в скрипт, который просто после работы ffmpeg переименует каталоги в нужный формат.
Можно даже что-то типа такого:

# Псевдокод.
formats = [{name: "4k-low", width: 100, height: 200},
           {name: "4k-max", width: 1000, height: 2000}]

cmd = "ffmpeg ...."
for f in formats:
    cmd += "-c:v:$i -width=$f.width -height=$f.height"

exec cmd
for f in formats:
    mv "..." "...${f.name}..."

urxvt ★★★★★
()

Можно для каждого выходного потока задать свои параметры, типа такого:

ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 0 -hwaccel_output_format -hide_banner -y -i "$1" -threads 0 \
  -vf \"hwupload_cuda,scale_npp=640:360\" -gpu 0\
    -c:v h264_nvenc -profile:v high -crf 20 -sc_threshold 0 -g 25 -keyint_min 25 -level 4.1 -tune zerolatency \
    -c:a libfdk_aac -ar 48000\
    -map 0:v:0 -map 0:a\
      -hls_time 10 -hls_playlist_type vod \
      -b:v 800k -maxrate 856k -bufsize 1200k -b:a 96k \
      -hls_segment_filename \"$OUTPUT/360p_%03d.ts\" \"$OUTPUT/360p.m3u8\" \
  -vf \"hwupload_cuda,scale_npp=842:480\" -gpu 0\
    -c:v h264_nvenc -profile:v high -crf 20 -sc_threshold 0 -g 25 -keyint_min 25 -level 4.1 -tune zerolatency \
    -c:a libfdk_aac -ar 48000\
    -map 0:v:0 -map 0:a\
      -hls_time 10 -hls_playlist_type vod -b:v 1400k -maxrate 1498k -bufsize 2100k -b:a 128k \
      -hls_segment_filename \"$OUTPUT/480p_%03d.ts\" \"$OUTPUT/480p.m3u8\" \
   -vf \"hwupload_cuda,scale_npp=1280:720\" -gpu 0\
    -c:v h264_nvenc -profile:v high -crf 20 -sc_threshold 0 -g 25 -keyint_min 25 -level 4.1 -tune zerolatency  \
    -c:a libfdk_aac -ar 48000\
    -map 0:v:0 -map 0:a\
      -hls_time 10 -hls_playlist_type vod -b:v 2800k -maxrate 2996k -bufsize 4200k -b:a 128k \
      -hls_segment_filename \"$OUTPUT/720p_%03d.ts\" \"$OUTPUT/720p.m3u8\" \
  -vf \"hwupload_cuda,scale_npp=1920:1080\" -gpu 0\
    -c:v h264_nvenc -profile:v high -crf 20 -sc_threshold 0 -g 25 -keyint_min 25 -level 4.1 -tune zerolatency \
    -c:a libfdk_aac -ar 48000\
    -map 0:v:0 -map 0:a\
      -hls_time 10 -hls_playlist_type vod -b:v 5000k -maxrate 5350k -bufsize 7500k -b:a 192k \
      -hls_segment_filename \"$OUTPUT/1080p_%03d.ts\" \"$OUTPUT/1080p.m3u8\
altwazar ★★★★
()

Но я не осиливаю эту карту составить.

mv 0 4k
mv 1 4k-max
...
crutch_master ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Доо… симлинки я сделаю у себя на хосте, а контент перенесу на сервер.

dk__
() автор топика
Ответ на: комментарий от altwazar

Ох ты ж блин. Я же столько не выпью. Ну общая мысль вроде ясна, попробую адаптировать. Плюс надо еще мастер файл (или как его) создавать, с путями на эти.

map 0:v:0 -map 0:a

Эт конечно прям дичь у нас обоих. Неужели нельзя как-то «красивее» это записать.

dk__
() автор топика
Ответ на: комментарий от urxvt

Скрипт переименования - первое, что приходило в голову. Но это не очень удобно. Параметры сжатия (и число вложений) могут сильно меняться. И каждый раз надо править два скрипта (ффмпега и переименования), что неудобно.

dk__
() автор топика
Ответ на: комментарий от dk__

Эт конечно прям дичь у нас обоих. Неужели нельзя как-то «красивее» это записать.

Это отрывок из скрипта, который должен пережевывать разные файлы. Если файлы изначально все по одному стандарту и без изысков, map можно убрать. Это просто пример того, как разделить настройки для исходящих потоков транскодирования.

Плюс надо еще мастер файл (или как его) создавать, с путями на эти.

Его без ffmpeg-а проще шаблоном создавать:

cat > "$OUTPUT/playlist.m3u8" << EOF
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=842x480
480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p.m3u8
EOF

Путь относительный, можно просто создать файл копированием раскидывать.

altwazar ★★★★
()
Ответ на: комментарий от dk__

Так ты сделай один скрипт, как я предложил. Тогда параметры сжатия будут в одном экземпляре и менять их станет даже удобней.

urxvt ★★★★★
()
Ответ на: комментарий от altwazar

Зацени жуть:

Пытался запустить скрипт который из прореза 4к х 4к (квадрат, для VR180) делает HLS в 12 вложений (3 разрешения, по 4 варианта качества). И все не мог понять, чего оно не стартует. Решил начать сокращать число потоков (вложений). Дошел до 6 (даже 7 не запустилось). Оно запустилось. Но на старте сожрало все 64 памяти, свапнулось еще на 80гб (у меня свап в авто), и кое-как… Проц загружен на 20-25% (7950х), а память выжрана ВСЯ НАХРЕН ПРОСТО.

Чую придется жать по 2-3 потока, не более, и складывать скриптом воендино.

dk__
() автор топика
Ответ на: комментарий от dk__

Хм, прилично. Не обращал особо внимание на жор памяти, но у меня и разрешения до 4k. Скорее всего ресайз память сжирает. По идее, если кодируешь процессором, то от параллельных потоков профита нет.

Сложить воедино должно быть просто, так как на сами плейлисты последовательное кодирование не повлияет. Общий всё равно будет выглядеть одинаково.

altwazar ★★★★
()
Ответ на: комментарий от dk__

У меня на машине 32 гб памяти, транскодируются 4к видео в 4k/1080/720/480/360. Не обращал внимание на потребление, но для этого памяти хватало. Правда транскод на видюшке.

altwazar ★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)