家庭网络中的组播电视分发
摘要
关于使用ffmpeg和组播路由协议在家庭网络上设置组播电视分发的技术指南,包含本地和路由场景的示例。
暂无内容
查看缓存全文
缓存时间: 2026/07/25 23:12
# 家庭网络中的多播电视分发
来源:https://www.apalrd.net/posts/2026/isp_mcast/
今天我们来聊聊多播这个奇特的世界——数据包会被投递多次,并且我们使用反向路由表进行路由。不过,一旦你理解了它的工作原理,一个全新的内容分发世界将为你敞开!受 @TallPaulTech 早期视频的启发,我以直播电视分发为例,展示多播的工作原理,以及它在某些小众场景下可能成为网络重大升级的原因。
## 视频⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#video)
缩略图 (https://youtu.be/nHzU-sspN54)
## 相关参考⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#prior-art)
以下视频/资料对我很有帮助,或者我认为你会喜欢:
- Tall Paul Tech 关于搭建 IPTV 的播放列表 (https://www.youtube.com/playlist?list=PLGvkW0sr-RWZHi-5XtnWxIjMLhjG8UffL)
- Tall Paul Tech 关于该主题的原始视频 (https://www.youtube.com/watch?v=KI0LuIcFM98)
## 链路本地示例⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#link-local-examples)
以下所有示例都可在本地网络中运行,但如果不开启 MLD/IGMP 侦听,可能会带来糟糕的体验(尤其对无线客户端而言)。
## 基础文件(不进行转码)⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#basic-file-wo-transcoding)
如果你的客户端能够解码视频/音频,可以直接发送原始数据,从而节省大量 CPU 资源。以下示例将媒体文件中的音频和视频轨道复制后,复用成 MPEG-TS 传输流,再发送出去。
```
# -re 表示实时处理
# -i bbb.mov 为输入文件(Big Buck Bunny)
# -c:v 和 -c:a 表示直接复制视频和音频流
# -f mpegts "udp://[ff02::69@eth0]:5002?pkt_size=1200" 指定复用格式及 UDP 输出
ffmpeg -re -i bbb.mov -c:v copy -c:a copy -f mpegts "udp://[ff02::69@eth0]:5001?pkt_size=1200"
```
## 基础文件(进行转码)⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#basic-file-w-transcoding)
如果你的媒体格式不太常见(尽管在 VLC 中播放几乎支持所有格式),可能需要进行转码。本示例使用基础的 x264 + AAC 编码,并打包成 MPEG-TS 传输流。
```
# -re 表示实时处理
# -i bbb.mov 为输入文件(Big Buck Bunny)
# -c:v libx264 -preset veryfast -profile:v high -level 4.1 -pix_fmt yuv420p 为视频转码参数
# -c:a aac -b:a 128k 为音频转码参数
# -f mpegts "udp://[ff02::69@eth0]:5002?pkt_size=1200" 指定复用格式及 UDP 输出
ffmpeg -re -i bbb.mov -c:v libx264 -preset veryfast -profile:v high -level 4.1 -pix_fmt yuv420p -c:a aac -b:a 128k -f mpegts "udp://[ff02::69@eth0]:5002?pkt_size=1200"
```
## YLE 电视⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#yle-tv)
我住在芬兰,因此可以访问国家广播公司 YLE 的频道。当然,你可能无法在所在国家访问这些内容。这个示例展示了我如何操作。
```
# 运行 yle-dl,加载 tv1 频道,通过管道传给 ffmpeg
# yle-dl 最终从 YLE 基础设施请求 HLS 播放列表,并使用 ffmpeg 下载为 Matroska 容器
# ffmpeg 实时处理,从标准输入读取,映射流和元数据,直接复制(不转码),输出 MPEG-TS 到 UDP
yle-dl tv1 --pipe | ffmpeg -re -i - -map 0 -map_metadata 0 -c copy -f mpegts "udp://[ff02::69%eth0]:5003?pkt_size=1200"
```
## 路由多播⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#routed-multicast)
对于需要跨越子网/VLAN 的大型网络,可以使用路由多播。我采用源特定多播(SSM),它比任意源多播更容易配置,而且我们不需要关心汇聚点(RP)。
## FRR 配置⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#frr-configuration)
以下是我在 FRR 中使用的配置(我承认并非最优):
```
log syslog informational
interface eth0
description upstream
ipv6 pim
ipv6 pim hello 10 40
!
interface eth1
description downstream
ipv6 pim
ipv6 mld
ipv6 mld version 2
ipv6 mld query-interval 60
ipv6 mld query-max-response-time 15
ipv6 mld last-member-query-interval 10
#如果使用下面的访问列表
#ipv6 mld access-list mld-groups
!
router pim6
ssm prefix-list ssm6
!
ipv6 prefix-list ssm6 seq 5 permit ff3e::/16 ge 16
!
#MLD 侧的备选过滤
#ipv6 access-list mld-groups seq 5 permit ipv6 any ff3e::1/128
#ipv6 access-list mld-groups seq 10 permit ipv6 any ff3e::2/128
#ipv6 access-list mld-groups seq 100 deny ipv6 any ff3e::/16
#同时过滤组和源
#ipv6 access-list mld-groups seq 5 permit ipv6 2001:db8:1::10/128 ff3e::1/128
#ipv6 access-list mld-groups seq 10 deny ipv6 any ff3e::/16
```
## 基础文件(路由模式)⌗ (https://www.apalrd.net/posts/2026/isp_mcast/#basic-file-routed)
本示例通过多播流式传输文件,并额外使用了源特定多播选项和正确的跳数限制。
你可以参照这些选项修改前面任意链路本地示例,使其适用于路由多播。
```
# -re 表示实时处理
# -i bbb.mov 为输入文件(Big Buck Bunny)
# -c:v 和 -c:a 表示直接复制视频和音频流
# -f mpegts 现在需要跳数限制,类似于 IPv4 中的 TTL
ffmpeg -re -i bbb.mov -c:v copy -c:a copy -f mpegts "udp://[ff35::69]:5004?hops=32&pkt_size=1200"
```
相似文章
如何在客厅中通过静态IP自托管服务器
一份使用L2TP隧道和静态IP在家中自托管服务器的指南,绕过CGNAT等ISP限制。
Free-TV/IPTV
一个开源的M3U播放列表,包含来自世界各地的免费电视频道,按国家组织,可在GitHub上获取。
HomeLab #1: MikroTik 作为家庭路由器
实用指南:设置MikroTik路由器用于家庭实验室,涵盖如何识别ISP连接类型(IPoE与PPPoE)以及WAN IPv4地址(公网与CGNAT/DS-Lite),以便正确配置路由器。
Starting my own Content Delivery Network
作者通过拥有自己的自治系统(AS)和BGP任播,并利用DNS,搭建了一个分布在全球三台服务器上的个人内容分发网络(CDN),以优化用户连接延迟。文章详细介绍了BGP任播的工作原理和流量工程方法。
LLM与MikroTik网络配置
一篇博客文章,详细介绍了作者使用LLM配置MikroTik网络设备的经验,包括技巧和最佳实践。