跳转到内容

Streamlink — 把网页直播流接到本地播放器

是什么

Streamlink 是一个 Python 库 + 命令行工具:从 Twitch、YouTube 等网站提取直播流地址,再管道给 VLC 等本地播放器,绕开网页里臃肿的前端播放器。

日常类比:网页直播站像「只能在自家餐厅用餐」——你必须打开他们的页面、看他们的广告。Streamlink 像外卖取餐员:只帮你把厨房做好的菜(视频流)端到你熟悉的播放器里吃。

最小用法:

Terminal window
pip install streamlink
streamlink "https://www.twitch.tv/somechannel" best

best 表示自动选最高画质;默认会拉起 VLC 播放。

为什么重要

不理解 Streamlink,流媒体工具链会缺一环:

  • 直播 URL 不是直链:页面里是 m3u8 / DASH manifest,需要插件解析才能拿到可播放地址
  • 本地播放器更轻:VLC、mpv 比浏览器标签页省 CPU,适合长时间挂机看直播
  • 录制与二次处理入口--output file.ts 可把流落盘,再接 ffmpeg 切片或转码
  • 插件架构可扩展:新平台只需写 extractor,不必 fork 整个项目

核心要点

  1. 插件系统:每个网站一个 plugin,负责把页面 URL 翻译成 HLS/DASH/HTTP 流列表。类比:各国签证柜台,同一本护照(CLI)走不同窗口。

  2. CLI + Python API 双入口:命令行适合个人看直播;import streamlink 适合写自动化录制脚本。

  3. 画质选择语法best720paudio_only 等,按可用流排序挑选。不懂协议时先用 streamlink URL 列出全部流再选。

  4. 输出方式多样:除默认拉起播放器,还支持 --stdout 管道、--output 写文件、--record 分段存档,同一解析结果可走不同下游。

  5. ffmpeg 衔接自然:很多用户把 streamlink ... -O - | ffmpeg -i pipe:0 ... 当固定配方,实现边拉边转码。

实践案例

案例 1:列出可用画质

Terminal window
streamlink "https://www.youtube.com/watch?v=xxxx" --json

输出 JSON 含各分辨率与 codec,便于脚本里选 720p60 而非盲目 best

案例 2:录制到文件

Terminal window
streamlink "https://www.twitch.tv/channel" best -o ~/record.ts

边下边存;长直播注意磁盘空间,.ts 可用 ffmpeg 转 mp4。

案例 3:管道给 mpv 并禁交互

Terminal window
streamlink URL best --player mpv --player-args "--no-input-terminal"

适合无人值守录制或嵌入 OBS 等场景。

案例 4:Python API 定时检查是否开播

import streamlink
session = streamlink.Streamlink()
try:
streams = session.streams("https://www.twitch.tv/channel")
print(streams["best"].url)
except streamlink.exceptions.NoPluginError:
print("无可用插件")

脚本可在 cron 里轮询:有 best 就启动录制,无则休眠——比整页爬虫更省资源。

踩过的坑

  1. 网站改版导致插件失效:extractor 依赖页面结构,平台更新后需等上游发新版 Streamlink。

  2. 需要登录的私密流:部分源要 --http-cookie 或 OAuth,公开文档未必覆盖。

  3. 地区限制:解析出的 CDN 地址仍可能 geo-block,换节点不等于 Streamlink 能绕过。

  4. 默认播放器路径:没装 VLC 时要 --player mpv 或指定可执行文件路径。

  5. HTTPS 证书或代理环境:公司代理下需配置 HTTP_PROXY,否则解析成功但拉流失败。

  6. 流列表为空:有时页面显示「直播中」但 extractor 尚未适配新 API,升级版本或查 issue 是正道。

适用 vs 不适用场景

适用

  • 本地观看网页直播且不想开浏览器
  • 学习 HLS/DASH 如何从「页面 URL」走到「可播放流」
  • 轻量录制公开直播源

不适用

  • 需要完整网页互动(弹幕、打赏面板)
  • 破解 DRM 付费内容(Streamlink 不做解密)
  • 生产级大规模爬流(需自建解析与合规审查)

历史小故事(可跳过)

  • 2011–2014:Livestreamer 项目活跃,做同类「网页流 → 本地播放器」
  • 2016:原项目停更,社区 fork 为 Streamlink 延续维护
  • 至今:插件列表持续扩站,CLI 文档与 PyPI 包保持双轨更新
  • 生态位置:常与 obs-studioffmpeg、mpv 组合,构成「看播 / 录播」个人工具链

学到什么

  1. 直播站点的「播放」分两层:页面壳子 vs 真实 manifest URL
  2. 插件化是应对网站碎片化的正解:核心管道稳定,站点逻辑外置
  3. CLI 的 best 是启发式而非魔法:列流再选更可控
  4. ffmpeg、播放器三角协作:提取 → 转码 → 呈现各管一段
  5. 读插件源码是学爬虫协议的好入口:比直接抓包更容易看到「页面 → manifest」映射

延伸阅读

关联

  • ffmpeg —— 录制文件后处理
  • nginx —— 自建 HLS 服务时对照服务端
  • [[hls.js]] —— 浏览器如何消费 m3u8
  • [[dash.js]] —— DASH 协议另一侧
  • [[video.js]] —— 网页播放器封装
  • obs-studio —— 推流端与拉流端互补
  • webrtc-rs —— 实时通信另一技术栈
  • shaka-player —— 企业级播放器如何消费同源 manifest

反向链接

  • [[dash.js]] —— dash.js — 浏览器 MPEG-DASH 参考播放器
  • ffmpeg —— FFmpeg — 多媒体转码与封装瑞士军刀
  • [[hls.js]] —— hls.js — 浏览器里播放 HLS 直播
  • mediasoup —— mediasoup — WebRTC 选择性转发 SFU
  • nginx —— nginx — 高性能 Web 服务器
  • nginx-rtmp-module —— nginx-rtmp-module — 用 nginx 搭 RTMP/HLS 直播服务
  • obs-studio —— OBS Studio — 开源直播录制与推流
  • pion —— Pion — 纯 Go 实现的 WebRTC 协议栈
  • shaka-player —— Shaka Player — Google 自适应流媒体播放器
  • [[video.js]] —— Video.js — Web 视频播放器框架
  • webrtc-rs —— webrtc-rs — Rust 纯实现 WebRTC 协议栈,对标 Go 世界的 Pion