我正在从实时 rtsp 流中生成单比特率实时 hls 内容。我正在使用以下命令
ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \
-vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 -profile:v baseline \
-maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header \
-hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \
-start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8
我该如何修改上述 ffmpg 命令以生成多比特率输出内容?请帮帮我。
答案1
ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \
-vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \
-profile:v baseline -maxrate 400k -bufsize 1835k \
-pix_fmt yuv420p -flags -global_header \
-hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \
-start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8 \
-vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \
-profile:v baseline -maxrate 700k -bufsize 1835k \
-pix_fmt yuv420p -flags -global_header \
-hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \
-start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index2.m3u8
并创建指向上述流的 index.m3u8:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000
hls/index1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000
hls/index2.m3u8
答案2
使用 ffmpeg 从单个输入生成多个输出所需的概念在以下网址有非常清晰的演示(至少对我来说是这样):https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs
基本上,ffmpeg -i someinput [output_options] someoutput1 [output2_options] someoutput2
就是模式。看起来你已经知道如何使用 rtsp 作为输入,并且知道如何生成具有给定比特率的单个输出。你还想重复整个输出块(rtsp 输入字符串之后的所有内容),并且每次都更改分辨率和-s
比特率(你使用的是 -crf,因此你需要降低它以获得更高的分辨率/更高的质量,并增加它以获得更低的分辨率、更低的质量)。
就我个人而言,我会使用 crf 进行 HLS 演绎,而对于 libx265,我使用的规则是frame_width * frame_height * frame_rate * 0.1
获取给定帧大小的“理想”比特率。如果您想选择目标比特率,则必须翻转方程式,然后从中计算出帧大小。“.1”值可以更高,但一般不会看到太多好处(更复杂的内容最好使用更高的值),而且我很少低于 0.07。