在 VLC 里播网络流只要一个地址,或用一份 m3u 播放列表。 m3u 就是一个文本文件,规则和 m3u8 一样。
7.3.2 列了功能,这一节只讲「播网络流」这一件事。 7.4 转到 EasyDarwin,那是服务端的另一条路线。
一、三种打开方式
① 媒体菜单里打开网络串流:适合临时看一次,粘地址就行。 ② 命令行带地址:适合脚本与批处理,可重复。 ③ 播放列表文件:适合一组固定的流,一次配好长期用。
命令行方式最实用,因为它能顺手做别的事:
vlc rtsp://a/live --sout '#std{access=http,mux=ts,dst=:8080}'
一条命令就把 VLC 变成了转发服务器。
注意 --sout 那串引号必须留着:
里面的大括号与逗号会被 shell 拆开,不加引号就变成几个独立参数了。
二、m3u 播放列表
它就是一个文本文件,三行就能写完:
#EXTM3U 开头、每个流前面一行 #EXTINF:-1,名字、然后一行地址。
实测一份两条流的 m3u 只有 111 字节。
#EXTINF:-1 里的 -1 表示「时长未知」——直播就该这么写。
解析规则和 m3u8 完全一样:# 开头是元信息、其余是地址。
所以 m3u8 其实就是「UTF-8 编码的 m3u」,多了一些 HLS 专用标签。
一个容易踩的点:m3u 的编码不一定是 UTF-8。 老文件常是 GBK 或 Latin-1,名字里有中文就会乱码。 所以读 m3u 时最好按「先试 UTF-8、失败再试 GBK」来处理。
三、播网络流时常见三个问题
① 打得开但不播:多半是地址里少了端口,或者协议写成了 http。
先用 ffplay 试一下同一个地址,能播就说明是 VLC 的模块问题。
② 播几秒就断:通常是网络抖动或服务端超时。
可以加缓存参数 --network-caching=1000(毫秒)缓冲更久。
③ 画面卡但声音正常:基本上是解码跟不上。
硬件解码没开或者显卡不支持,试着换输出模块。
这三条覆盖了绝大多数「VLC 播不了」的场景。 排查顺序也建议按这个来:先确认地址对不对,再看网络,最后看解码。
四、动手 Demo:播放网络串流——播放列表就是个文本文件
写一份两条流的 m3u,量它的字节数。 再用十几行把它解析成「名称 + 地址」的列表。
m3u = ("#EXTM3U\n"
"#EXTINF:-1,测试流一\n"
"rtsp://127.0.0.1/live/1\n"
"#EXTINF:-1,测试流二\n"
"http://127.0.0.1:8080/live.flv\n")
print("m3u 共 %d 字节、%d 行" % (len(m3u.encode()), m3u.count("\n")))
items, title = [], ""
for ln in m3u.splitlines():
ln = ln.strip()
if not ln:
continue
if ln.startswith("#EXTINF:"):
title = ln.split(",", 1)[1] if "," in ln else ""
elif not ln.startswith("#"):
items.append((title, ln))
for i, (t, u) in enumerate(items, 1):
print("%d. %-6s %s" % (i, t, u))
print("解析出 %d 条" % len(items))
实跑输出:
--------------------------------------------------------------------
播放网络串流——播放列表就是个文本文件
--------------------------------------------------------------------
**① m3u 和 pls 长得不一样,作用一样**
**m3u 一共 111 字节:**
#EXTM3U
#EXTINF:-1,测试流一
rtsp://127.0.0.1/live/1
#EXTINF:-1,测试流二
http://127.0.0.1:8080/live.flv
**`#EXTINF:-1` 里的 -1 表示「时长未知」,直播就该这么写。**
**② 解析它只要十几行**
序号 名称 地址
--------------------------------------------------------
1 测试流一 rtsp://127.0.0.1/live/1
2 测试流二 http://127.0.0.1:8080/live.flv
**解析出 2 条,规则就是「`#` 开头是元信息、其余是地址」。**
**和 m3u8 是同一套逻辑——只不过 m3u8 是 UTF-8 版的 m3u。**
**③ VLC 打开网络串流的三种方式**
方式 适合
-----------------------------------------
媒体菜单打开网络串流 临时看一次
命令行带地址 脚本与批处理
播放列表 一组固定流
**命令行方式最实用:**
**`vlc rtsp://a/live --sout '#std{access=http,mux=ts,dst=:8080}'`**
**一条命令就把 VLC 变成了转发服务器。**
111 字节装两条流,播放列表比你想的小得多。
splitlines() 比 split("\n") 稳,它能同时处理 CRLF 与 LF。
split(",", 1) 的第二个参数限一次,否则名字里有逗号就被切碎。
30 秒实验
- 把地址改成
rtsp://127.0.0.1(不带端口),想想会怎样——默认走 554,连不上就报超时。 - 在
#EXTINF:-1里把 -1 改成 3600,看解析结果变不变——不变,我们只取了逗号后面的名字。 - 把文件另存成 GBK 编码再读,看中文——乱码,这就是「m3u 编码不确定」的实际表现。
常见误区
- 「m3u 和 m3u8 是两种格式」——m3u8 只是 UTF-8 版的 m3u。
- 「播放列表必须是 .m3u8」——.m3u 一样能用,VLC 都认。
- 「-1 表示负一秒」——表示时长未知。
自测三问(点开对答案)
1. 三种打开网络串流的方式? —— **菜单打开、命令行带地址、播放列表文件。** 2. `#EXTINF:-1` 的 -1 是什么意思? —— **时长未知**,直播的播放列表就这么写。 3. 播网络流加缓存用哪个参数? —— **`--network-caching`,单位毫秒。**- ☐ (本节完,下一节 7.4.1 EasyDarwin 开源项目)