如何在 Linux 下使用 DLNA 投屏

我用 Python + FFmpeg + DLNA 完成了一个在 Linux 下的投屏方案。

如何在 Linux 下使用 DLNA 投屏

编者按:本文系 Linux 中国公开投稿计划所接受的第一篇投稿,而且投稿作者是一位初中学生,让我们为他点赞!

一般来说,安卓设备和 Windows 设备投屏使用的是 miracast 协议,但是该协议要求网卡支持 p2pwifi,而 Linux 下大多数网卡驱动不支持 p2pwifi。

于是我用 Python + FFmpeg + DLNA 完成了一个在 Linux 下的投屏方案。这个方案的不足是延迟有点大。

设置

下面是如何实现。

先装这个 DLNA 库:

“`
pip3 install dlna

“`

然后用 pactl 查找 “监视器信源”(中文输出) 或 “Monitor Source”(英文输出):

“`
pactl list sinks

“`

示例输出:

“`
Sink #0
State: RUNNING
Name: alsaoutput.pci-00000500.6.HiFihwGeneric1sink
Description: Family 17h (Models 10h-1fh) HD Audio Controller Speaker + Headphones
Driver: module-alsa-card.c
Sample Specification: s16le 2ch 44100Hz
Channel Map: front-left,front-right
Owner Module: 9
Mute: no
Volume: front-left: 53814 / 82% / -5.14 dB, front-right: 53814 / 82% / -5.14 dB
balance 0.00
Base Volume: 65536 / 100% / 0.00 dB
Monitor Source: alsa
output.pci-00000500.6.HiFihwGeneric1sink.monitor
Latency: 16676 usec, configured 16000 us…

“`

然后创建一个 CGI 脚本 screen.flv。首先。建立放置该脚本的目录:

“`
mkdir screencast
mkdir screencast/cgi-bin

“`

然后通过 cat 来直接创建该脚本:

“`
cat <screencast/cgi-bin/screen.flv

!/bin/bash

echo “Content-Type:video/x-flv”
echo

ffmpeg -f pulse -i <监视器信源> -f x11grab -i :0 -vcodec h264_nvenc pipe:.flv
eof

“`

请用上面获得的监视器信源替换文件中的 <监视器信源>

并为它设置可执行权限:

“`
chmod +x screencast/cgi-bin/screen.flv

“`

注意:如果没有 Nvidia 显卡,或者要使用其他的硬件加速,请把编码方案 h264_nvenc 替换为相应的编码方案。不建议采用软解方式,延迟非常高。

投屏

需要投屏时,首先启动本地 Web 服务器:

“`
cd screencast
python3 -m http.server –cgi 9999&

“`

然后,找到你的 DLNA 设备,然后把 location 后面的 URL 复制下来:

“`
dlna device

“`

示例输出:

“`
=> Device 1:
{
“location”: “http://192.168.3.118:1528/”,
“host”: “192.168.3.118”,
“friendly_name”: “Kodi”,

“`

找到你的 Linux 电脑的局域网 IP 地址:

“`
ip addr

“`

示例输出:

“`
3: wlp2s0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 74:4c:a1:82:2e:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.3.117/24 brd 192.168.3.255 scope global dynamic noprefixroute wlp2s0
validlft 58283sec preferredlft 58283sec
inet6 240e:3b3:2ee3:9530:d005:e492:6243:9/128 scope global dynamic noprefixroute
validlft 6738sec preferredlft 3138sec
inet6 240e:3b3:2ee3:9539:f289:6043:c56a:4e7b/64 scope global dynamic noprefixroute
validlft 7189sec preferredlft 3589sec
inet6 240e:3b3:2ee3:9539:3714:eaf0:c549:b8c9/64 scope global dynamic mngtmpaddr noprefixroute
validlft 7188sec preferredlft 3588sec
inet6 fe80::c746:2540:ab7b:20aa/64 scope link
validlft forever preferredlft forever
inet6 fe80::3543:2637:e0fc:3630/64 scope link noprefixroute
validlft forever preferredlft forever

“`

启动投屏的命令如下:

“`
dlna play -d http://<局域网 IP>:9999/cgi-bin/screen.flv

“`

请相应替换其中的 <URL><局域网 IP> 参数,此处我替换后的命令是:

“`
dlna play -d http://192.168.3.118:1528/ http://192.168.3.117:9999/cgi-bin/screen.flv

“`

然后在你的电视上设置接受投屏,各种电视设备设置投屏方式不同,请参照具体设备说明。

稍等片刻,视频就会出现在电视上了。投屏效果如下:

如何在 Linux 下使用 DLNA 投屏

via: https://www.bilibili.com/read/cv15488839

作者:calvinlin 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

主题测试文章,只做测试使用。发布者:eason,转转请注明出处:https://aicodev.cn/2022/03/09/%e5%a6%82%e4%bd%95%e5%9c%a8-linux-%e4%b8%8b%e4%bd%bf%e7%94%a8-dlna-%e6%8a%95%e5%b1%8f/

Like (0)
eason的头像eason
Previous 2022年3月9日
Next 2022年3月9日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信