ffmpeg在hls文件中跨分辨率使用相同的比特率

ffmpeg在hls文件中跨分辨率使用相同的比特率,ffmpeg,avplayer,http-live-streaming,Ffmpeg,Avplayer,Http Live Streaming,我们正在使用以下命令为给定视频生成dash和hls文件: ffmpeg -y -nostdin -loglevel error -i input.mp4 \ -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:v:0 -map 0:a\?:0 \ -maxrate:v:0 350k -bufsize:v:0 700k -c:v:0 libx264 -filter:v:0 "scal

我们正在使用以下命令为给定视频生成dash和hls文件:

ffmpeg -y -nostdin -loglevel error -i input.mp4 \
        -map 0:v:0  -map 0:v:0 -map 0:v:0  -map 0:v:0  -map 0:v:0  -map 0:v:0 -map 0:a\?:0  \
        -maxrate:v:0 350k -bufsize:v:0 700k  -c:v:0 libx264 -filter:v:0 "scale=320:-2"  \
        -maxrate:v:1 1000k -bufsize:v:0 2000k -c:v:1 libx264 -filter:v:1 "scale=640:-2"  \
        -maxrate:v:2 3000k -bufsize:v:0 6000k -c:v:2 libx264 -filter:v:2 "scale=1280:-2" \
        -maxrate:v:3 245k -bufsize:v:3 600k -c:v:3 libvpx-vp9 -filter:v:3 "scale=320:-2"  \
        -maxrate:v:4 700k  -bufsize:v:3 1400k -c:v:4 libvpx-vp9 -filter:v:4 "scale=640:-2"  \
        -maxrate:v:5 2100k -bufsize:v:3 4200k -c:v:5 libvpx-vp9 -filter:v:5 "scale=1280:-2"  \
        -use_timeline 1 -use_template 1 -adaptation_sets "id=0,streams=v  id=1,streams=a" \
        -threads 8 -seg_duration 5 -hls_playlist true -f dash output/output.mpd
这也可以正常工作并生成hls文件,下面是一个示例m3u8文件:

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_A1",NAME="audio_6",DEFAULT=YES,URI="media_6.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=129663,RESOLUTION=320x168,CODECS="avc1.64000c,mp4a.40.2",AUDIO="group_A1"
media_0.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=129663,RESOLUTION=640x336,CODECS="avc1.64001e,mp4a.40.2",AUDIO="group_A1"
media_1.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=129663,RESOLUTION=1280x670,CODECS="avc1.64001f,mp4a.40.2",AUDIO="group_A1"
media_2.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=330756,RESOLUTION=320x168,CODECS="vp09.00.11.08,mp4a.40.2",AUDIO="group_A1"
media_3.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=329663,RESOLUTION=640x336,CODECS="vp09.00.21.08,mp4a.40.2",AUDIO="group_A1"
media_4.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=329663,RESOLUTION=1280x670,CODECS="vp09.00.31.08,mp4a.40.2",AUDIO="group_A1"
media_5.m3u8
现在,正如您所注意到的,带宽对于分辨率为
320x168
640x336
1280x670
的分辨率是相同的,这可能是因为视频的性质

但问题在于iOS的AVPlayer总是选择最小分辨率的流,而从不选择更好的分辨率流,即使它是可用的,因为相同的比特率

所以我想问的问题是:是否有一些选项可以确保-我总是在不同分辨率的比特率上有一些差异,或者更具体地说,比特率总是增加(可能只是几个字节)以增加分辨率


编辑 早些时候,我对每个输出使用了
-b:v
选项,而不是
-maxrate:v
,对于相同的视频,我得到了以下输出:

#EXT-X-STREAM-INF:BANDWIDTH=479663,RESOLUTION=320x168,CODECS="avc1.64000c,mp4a.40.2",AUDIO="group_A1"
media_0.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=1129663,RESOLUTION=640x336,CODECS="avc1.64001e,mp4a.40.2",AUDIO="group_A1"
media_1.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=3129663,RESOLUTION=1280x670,CODECS="avc1.64001f,mp4a.40.2",AUDIO="group_A1"
media_2.m3u8
如果你看到的话,带宽已经大大增加了,对于相同的视频和相同的视频质量,所有的文件大小也增加了4倍。正如我的理解:“代码>最大速率< /代码>选项,<代码> FFMPEG优化输出,只提供所需的带宽,而用 B:V选项,它强加了带宽给给定的值,在质量方面没有任何好处。所以基本上你可以在更高的带宽上获得同样质量的视频


这就是为什么我想使用
maxrate
选项,但要增加带宽。如果我使用
maxrate
选项手动将输出中的带宽更改为递增顺序,则自适应比特率将在iOS的AVPlayer中开始工作。

为每个输出添加
-b:v
选项,并与其他选项一样使用适当的流说明符。产生的
带宽
值将相应改变

其他材料:

考虑为每个输出添加
-bufsize
:否则您的
-maxrate
可能会被忽略

由于您要多次执行相同的筛选,因此在一个filtergraph中执行所有筛选并使用拆分筛选器复制工作会更有效:

-filer_complex "scale=320:-2,split[320a][320b];scale=640:-2,split[640a][640b];scale=1280:-2,split[1280][1280b]"

谢谢,是的,我正在使用bufsize,我现在也在答案中添加了它。我之前使用过
-b:v
选项,但它提高了比特率,即使在不需要的情况下,也能提供相同的视频质量。谢谢你的优化建议。@Saurabh那么你想在
master.m3u8
中更改
带宽
,但你不想用
-b:v
声明比特率?因为这个答案从字面上回答了最初的问题,所以我想我真的不知道现在的问题是什么。其次,您是否已确认
带宽
是罪魁祸首?您是否手动编辑了文件并将值更改为test?嘿,在我的问题的编辑部分回答了您的评论,我可能应该在前面添加此内容,以免引起任何混淆。