ffmpeg在hls文件中跨分辨率使用相同的比特率
我们正在使用以下命令为给定视频生成dash和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
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优化输出,只提供所需的带宽,而用这就是为什么我想使用
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?嘿,在我的问题的编辑部分回答了您的评论,我可能应该在前面添加此内容,以免引起任何混淆。