Linux下DIY DLAN投屏方案

大雄45發表於2022-03-22
導讀 我用 Python + FFmpeg + DLNA 完成了一個在   下的投屏方案。這個方案的不足是延遲有點大。

Linux下DIY DLAN投屏方案Linux下DIY DLAN投屏方案

一般來說,安卓裝置和 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 <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
       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區域網 IP>:9999/cgi-bin/screen.flv

請相應替換其中的和 <區域網 IP> 引數,此處我替換後的 是:

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

然後在你的電視上設定接受投屏,各種電視裝置設定投屏方式不同,請參照具體裝置說明。

稍等片刻,影片就會出現在電視上了。投屏效果如下:

Linux下DIY DLAN投屏方案Linux下DIY DLAN投屏方案

作者簡介:

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

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2882724/,如需轉載,請註明出處,否則將追究法律責任。

相關文章