4

如何在 Linux 下使用 DLNA 投屏

 2 years ago
source link: https://os.51cto.com/article/703551.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
如何在 Linux 下使用 DLNA 投屏-51CTO.COM
如何在 Linux 下使用 DLNA 投屏
作者:Calvinlin 2022-03-09 14:43:38
我用 Python + FFmpeg + DLNA 完成了一个在 Linux 下的投屏方案。这个方案的不足是延迟有点大。

26b625e77964f163953279798c1e1844aaa09f.jpg

编者按:本文系 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: alsa_output.pci-0000_05_00.6.HiFi__hw_Generic_1__sink
  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-0000_05_00.6.HiFi__hw_Generic_1__sink.monitor
  Latency: 16676 usec, configured 16000 us...



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

mkdir screencast
mkdir screencast/cgi-bin



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

cat <<eof>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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
       valid_lft 58283sec preferred_lft 58283sec
    inet6 240e:3b3:2ee3:9530:d005:e492:6243:9/128 scope global dynamic noprefixroute 
       valid_lft 6738sec preferred_lft 3138sec
    inet6 240e:3b3:2ee3:9539:f289:6043:c56a:4e7b/64 scope global dynamic noprefixroute 
       valid_lft 7189sec preferred_lft 3589sec
    inet6 240e:3b3:2ee3:9539:3714:eaf0:c549:b8c9/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 7188sec preferred_lft 3588sec
    inet6 fe80::c746:2540:ab7b:20aa/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::3543:2637:e0fc:3630/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever



启动投屏的命令如下:

dlna play -d <URL> 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


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

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

c9e7be2737713070ec28165c80665ba0e7f284.jpg


作者简介:

calvinlin:一个普通的深圳初中生。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK