如何在 Linux 下使用 DLNA 投屏
編者按:本文系 Linux 中國公開投稿計劃所接受的第一篇投稿,而且投稿作者是一位初中學(xué)生,讓我們?yōu)樗c贊!
一般來說,安卓設(shè)備和 Windows 設(shè)備投屏使用的是 miracast 協(xié)議,但是該協(xié)議要求網(wǎng)卡支持 p2pwifi,而 Linux 下大多數(shù)網(wǎng)卡驅(qū)動不支持 p2pwifi。
于是我用 Python + FFmpeg + DLNA 完成了一個在 Linux 下的投屏方案。這個方案的不足是延遲有點大。
設(shè)置
下面是如何實現(xiàn)。
先裝這個 DLNA 庫:
pip3 install dlna
然后用 ??pactl?
? 查找 “監(jiān)視器信源”(中文輸出) 或 “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...
然后創(chuàng)建一個 CGI 腳本 ??screen.flv?
?。首先。建立放置該腳本的目錄:
mkdir screencast
mkdir screencast/cgi-bin
然后通過 ??cat?
? 來直接創(chuàng)建該腳本:
cat <<eof>screencast/cgi-bin/screen.flv
#!/bin/bash
echo "Content-Type:video/x-flv"
echo
ffmpeg -f pulse -i <監(jiān)視器信源> -f x11grab -i :0 -vcodec h264_nvenc pipe:.flv
eof
請用上面獲得的監(jiān)視器信源替換文件中的 ??<監(jiān)視器信源>?
?。
并為它設(shè)置可執(zhí)行權(quán)限:
chmod +x screencast/cgi-bin/screen.flv
注意:如果沒有 Nvidia 顯卡,或者要使用其他的硬件加速,請把編碼方案 ??h264_nvenc?
? 替換為相應(yīng)的編碼方案。不建議采用軟解方式,延遲非常高。
投屏
需要投屏?xí)r,首先啟動本地 Web 服務(wù)器:
cd screencast
python3 -m http.server --cgi 9999&
然后,找到你的 DLNA 設(shè)備,然后把 ??location?
? 后面的 URL 復(fù)制下來:
dlna device
示例輸出:
=> Device 1:
{
"location": "http://192.168.3.118:1528/",
"host": "192.168.3.118",
"friendly_name": "Kodi",
...
找到你的 Linux 電腦的局域網(wǎng) 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://<局域網(wǎng) IP>:9999/cgi-bin/screen.flv
請相應(yīng)替換其中的 ??<URL>?
?? 和 ??<局域網(wǎng) IP>?
? 參數(shù),此處我替換后的命令是:
dlna play -d http://192.168.3.118:1528/ http://192.168.3.117:9999/cgi-bin/screen.flv
然后在你的電視上設(shè)置接受投屏,各種電視設(shè)備設(shè)置投屏方式不同,請參照具體設(shè)備說明。
稍等片刻,視頻就會出現(xiàn)在電視上了。投屏效果如下:
作者簡介:
calvinlin:一個普通的深圳初中生。