必须先确认m3u8为多码率主播放列表(含多个#ext-x-stream-inf标签),单码率媒体列表无法切换清晰度;video.js需引入videojs-contrib-quality-levels和videojs-hls-quality-selector插件,并在player.ready()后调用hlsqualityselector();下载时可用n_m3u8dl-re按分辨率或带宽筛选指定清晰度。

要在网页播放器中手动切换m3u8视频的清晰度,必须先确认该M3U8资源是多码率主播放列表(Master Playlist),即文件开头含多个#EXT-X-STREAM-INF标签并指向不同分辨率/码率的子m3u8;若只是单个切片列表(Media Playlist),则根本不存在清晰度切换功能。
判断M3U8是否支持多码率
用浏览器打开.m3u8链接,或用文本编辑器查看其内容。出现类似以下结构即为支持多码率的主播放列表:
#EXTM3U<br>#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=720x480<br>480p.m3u8<br>#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720<br>720p.m3u8<br>#EXT-X-STREAM-INF:BANDWIDTH=5120000,RESOLUTION=1920x1080<br>1080p.m3u8
如果只看到#EXTINF后跟一堆.ts路径,说明这是单码率媒体列表,【无法切换清晰度】,强行添加切换按钮也无效。
Video.js播放器手动添加清晰度切换按钮
Video.js默认不显示清晰度菜单,需配合videojs-contrib-quality-levels与videojs-hls-quality-selector插件实现。
第一步:在HTML中引入必要资源(顺序不可错)
<link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet"><br><script src="https://unpkg.com/video.js/dist/video.js"></script><br><script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script><br><script src="https://unpkg.com/videojs-contrib-quality-levels/dist/videojs-contrib-quality-levels.min.js"></script><br><script src="https://unpkg.com/videojs-hls-quality-selector/dist/videojs-hls-quality-selector.min.js"></script>
第二步:初始化播放器并启用质量选择器
在<video></video>标签后添加如下脚本:
const player = videojs('my_video_1');<br>player.ready(() => {<br> player.hlsQualitySelector();<br>});
这一步必须等player.ready()触发后再调用hlsQualitySelector(),否则插件无法绑定到HLS源上,按钮会显示但点击无响应。
使用N_m3u8DL-RE命令行工具精准下载指定清晰度
当你需要下载而非在线播放,且目标M3U8含多个清晰度选项时,N_m3u8DL-RE提供8种过滤维度,避免下错流、浪费时间与空间。
方法一:按分辨率精确匹配
./N_m3u8DL-RE "https://example.com/master.m3u8" --select-video "res=1920x1080"
方法二:按带宽范围筛选(单位bps)
./N_m3u8DL-RE "https://example.com/master.m3u8" --select-video "bandwidth>=3000000&bandwidth
方法三:正则匹配URL路径中的标识符
./N_m3u8DL-RE "https://example.com/master.m3u8" --select-video "url=~2000\.m3u8"
注意:【必须用双引号包裹整个--select-video参数值】,否则Shell会将&、=等符号解析为命令分隔符,导致参数截断或报错。











