Ffmpeg转换为HLS-视频质量极低

Ffmpeg转换为HLS-视频质量极低,ffmpeg,video-streaming,http-live-streaming,transcoding,mpeg2-ts,Ffmpeg,Video Streaming,Http Live Streaming,Transcoding,Mpeg2 Ts,我正在构建一个使用FFMPEG的流媒体网络应用程序。客户端通过RTMP发送使用FFMPEG(在过程中将webm流转换为mpeg ts)的网络摄像头视频,媒体服务器接收mpeg ts流,将其转码为具有ABR多个质量级别的HLS(使用主播放列表) 到目前为止,我已经完成了所有这些工作,除了我的转码命令创建了质量极低的HLS段;视频非常像素化,最好的质量级别(1080p)看起来就像是240p放大到1080p。为了测试我的FFMPEG命令,我将一个高质量的1080p电影样本重新放入mpeg ts中(我检

我正在构建一个使用FFMPEG的流媒体网络应用程序。客户端通过RTMP发送使用FFMPEG(在过程中将webm流转换为mpeg ts)的网络摄像头视频,媒体服务器接收mpeg ts流,将其转码为具有ABR多个质量级别的HLS(使用主播放列表)

到目前为止,我已经完成了所有这些工作,除了我的转码命令创建了质量极低的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。不用说,我把这件事搞砸了,尽管命令本身可以工作,并且做我需要的事情(除了糟糕的质量)。有谁能帮我优化这个命令,让它转码的有损视频少得多

我把它修好了。我有两个问题:每个输出的比特率太低,而命令本身是错误的,因为我对所有输出使用了-b:v[bitrate],而不是像-b:v:0[bitrate]那样为每个比特率指定流。正确的工作输出命令如下:

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"

FWIW,这是一个我们试图在Mux解决的过程,如果你有兴趣谈论你正在构建的东西的话。