Ffmpeg конвертирует в HLS - видео крайне низкого качества - PullRequest
0 голосов
/ 07 января 2019

Я создаю потоковое веб-приложение, которое использует FFMPEG. Клиент отправляет видео с веб-камеры, используя FFMPEG (в процессе конвертируя поток webm в mpeg-ts), через RTMP, а сервер мультимедиа принимает поток mpeg-ts, транскодирует его в HLS с несколькими уровнями качества для ABR (используя основной список воспроизведения) ,

Пока у меня все это работает, за исключением того, что моя команда транскодирования создает сегменты HLS, которые имеют чрезвычайно низкое качество; видео очень пиксельное, а наилучший уровень качества (1080p) выглядит как 240p с разрешением до 1080p. Чтобы проверить мою команду FFMPEG, я повторно смешал образец высококачественного фильма 1080p в mpeg-ts (я проверил качество, оно выглядит так же, как и оригинал), и я использую эту команду для перекодирования этого фильма в HLS для теста :

ffmpeg.exe -threads 4 -filter_complex_threads 4 -vsync 1 -i output.ts -filter_complex 
"[v:0]split=5[s0][s1][s2][s3][s4]; 
[s0]scale=w=1920:h=1080:flags=lanczos,yadif[v0];
[s1]scale=w=1280:h=720:flags=lanczos,yadif[v1];
[s2]scale=w=854:h=480:flags=lanczos,yadif[v2];
[s3]scale=w=480:h=360:flags=lanczos,yadif[v3];
[s4]scale=w=426:h=240:flags=lanczos,yadif[v4]" 
-map "[v0]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v 3400k -preset medium -profile:v baseline -keyint_min 24 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map "[v1]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v 1725k -preset medium -profile:v baseline -keyint_min 24 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map "[v2]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v 960k -preset medium -profile:v baseline -keyint_min 24 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map "[v3]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v 510k -preset medium -profile:v baseline -keyint_min 24 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1  
-map "[v4]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v 320k -preset medium -profile:v baseline -keyint_min 24 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -c:a aac -b:a 96k -af “aresample=async=1:min_hard_comp=0.100000:first_pts=0” 
-f hls -var_stream_map "v:0,a:0 v:1,a:1, v:2,a:2, v:3,a:3, v:4,a:4" 
-hls_wrap 24 -hls_time 10 -master_pl_name master.m3u8 "C:/Users/John/Desktop/ffmpeg-20181218-978c935-win64-static/bin/vs%v/manifest.m3u8"

Я очень новичок в FFMPEG, я сослался на эту статью для опций видео и изменил ее, чтобы создать HLS вместо mp4. Само собой разумеется, я справился с этим довольно плохо, хотя сама команда работает и делает то, что мне нужно (кроме дерьмового качества). Может ли кто-нибудь помочь мне оптимизировать эту команду, чтобы она транскодировала видео с гораздо меньшими потерями?

1 Ответ

0 голосов
/ 07 января 2019

Я исправил это. У меня было две проблемы: битрейт для каждого выхода был слишком низким, а сама команда была неправильной в том смысле, что я использовал -b: v [битрейт] для всех выходов вместо указания потока для каждого битрейта, например -b: v: 0 [ битрейт]. Правильная рабочая команда вывода:

ffmpeg.exe -threads 4 -filter_complex_threads 4 -vsync 1 -i output.ts -filter_complex 
"[v:0]split=5[s0][s1][s2][s3][s4]; 
[s0]scale=w=1920:h=1080:flags=lanczos,yadif[v0];
[s1]scale=w=1280:h=720:flags=lanczos,yadif[v1];
[s2]scale=w=854:h=480:flags=lanczos,yadif[v2];
[s3]scale=w=480:h=360:flags=lanczos,yadif[v3];
[s4]scale=w=426:h=240:flags=lanczos,yadif[v4]" 
-map "[v0]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v:0 12M -preset medium -profile:v baseline -keyint_min 24 -level 3.0 -s 1920:h=1080 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map "[v1]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v:1 7.5M -preset medium -profile:v baseline -keyint_min 24 -level 3.0 -s 1280:h=720 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map "[v2]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v:2 4M -preset medium -profile:v baseline -keyint_min 24 -level 3.0 -s 854:h=480 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map "[v3]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v:3 1.5M -preset medium -profile:v baseline -keyint_min 24 -level 3.0 -s 480:h=360 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1  
-map "[v4]" -pix_fmt yuv420p -r 23.976 -vcodec libx264 -b:v:4 1M -preset medium -profile:v baseline -keyint_min 24 -level 3.0 -s 426:h=240 -g 48 -x264opts no-scenecut -strict experimental -map_metadata -1 
-map a:0 -map a:0 -map a:0 -map a:0 -map a:0 -c:a aac -b:a 96k -af “aresample=async=1:min_hard_comp=0.100000:first_pts=0” 
-f hls -var_stream_map "v:0,a:0 v:1,a:1, v:2,a:2, v:3,a:3, v:4,a:4" 
-hls_wrap 24 -hls_time 10 -master_pl_name master.m3u8 "C:/Users/John/Desktop/ffmpeg-20181218-978c935-win64-static/bin/vs%v/manifest.m3u8"
...