谷动谷力

 找回密码
 立即注册
查看: 620|回复: 0
收起左侧

如何在 Linux 下使用 DLNA 投屏

[复制链接]
发表于 2022-7-26 16:50:42 | 显示全部楼层 |阅读模式
如何在 Linux 下使用 DLNA 投屏

作者: Calvinlin
| 2022-03-09 11:00   评论: 8   

编者按:本文系 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> 参数,此处我替换后的命令是:
然后在你的电视上设置接受投屏,各种电视设备设置投屏方式不同,请参照具体设备说明。
稍等片刻,视频就会出现在电视上了。投屏效果如下:
105924fhgh0z00k0930sc9.jpg



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2022-9-27 12:29 , Processed in 0.098912 second(s), 32 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表