先說結論,試了以下兩個專案:
gstreamer
的參數,這篇會以紀錄 wds
為主。2017 年 5 月換租屋處後,客廳有台螢幕,雖然不大,但至少比筆電的螢幕還大。想說有時候筆電或手機可以把畫面投到上面用大螢幕看比較爽,然後又懶的接有線的 VGA 或 HDMI,就想說來買個無線投影裝置。
於是就在 6 月初左右就上網買了便宜的無線投影裝置,該裝置對於 iOS 裝置的支援是使用 DLNA,對於 Android 裝置的支援則是使用 Miracast,當時是我第一次知道 Miracast。
想說筆電是跑 Arch Linux,和 Android 一樣都是 based on Linux,所以應該也可以使用 Miracast 吧?才發現可以用的東西少的可憐,也不一定會動。在 GitHub 上找到了 2 看起來比較有希望的專案,花了好幾個小時,看程式碼、查閱相關文件,終於成功把筆電的畫面透過 Miracast 無線投影到螢幕上。
後來因為室友買了個攜帶型投影機送了 Chromecast 之後就沒有使用 Miracast 了,所以這篇算是個半殘文,但還是想紀錄一下,畢竟花了不少時間研究。
因為 MiracleCast 沒試成功,所以只會以紀錄 WDS 為主。
其實還有找到一個 openwfd,不過因為看起來已經年久失修了,所以就沒去試了。
首先,WDS 把使用 Miracast 的裝置區分為以下兩種:
然後把當時遇到的問題相關連結都先列出來一下:
WDS 會用到以下幾個程式,必須預先安裝:
wpa_supplicant
CONFIG_P2P=y
, CONFIG_WIFI_DISPLAY=y
, CONFIG_CTRL_IFACE_DBUS_NEW=y
這 3 個參數connman
gstreamer
接下來就可以照著以下步驟來嘗試:
git clone https://github.com/intel/wds.git
cd wds
gstreamer
的參數,不然只會出現黑的畫面,這部份可能因人而異,我只就我遇到的部份描述,附上 git diff,這個參數還有調整的空間就是。diff --git a/mirac_network/mirac-gst-test-source.cpp b/mirac_network/mirac-gst-test-source.cpp
index 12c2623..821e38a 100644
--- a/mirac_network/mirac-gst-test-source.cpp
+++ b/mirac_network/mirac-gst-test-source.cpp
@@ -42,7 +42,9 @@ MiracGstTestSource::MiracGstTestSource (wfd_test_stream_t wfd_stream_type, std::
} else if (wfd_stream_type == WFD_TEST_VIDEO) {
gst_pipeline = "videotestsrc ! videoconvert ! video/x-raw,format=I420 ! x264enc ! mpegtsmux ! rtpmp2tpay ! udpsink name=sink " + hostname_port;
} else if (wfd_stream_type == WFD_DESKTOP) {
- gst_pipeline = "ximagesrc ! videoconvert ! video/x-raw,format=I420 ! x264enc tune=zerolatency ! mpegtsmux ! rtpmp2tpay ! udpsink name=sink " + hostname_port;
+ gst_pipeline = "ximagesrc use-damage=0 ! videoscale ! videoconvert ! video/x-raw,format=I420,width=1440,height=900,framerate=50/1 ! x264enc aud=false bitrate=2048 dct8x8=true vbv-buf-capacity=1000 tune=stillimage+zerolatency byte-stream=true ! video/x-h264,profile=high ! muxer. pulsesrc device=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor ! audioconvert ! audio/x-raw,channels=2,rate=44100 ! faac ! audio/mpeg,mpegversion=4 ! muxer. mpegtsmux name=muxer alignment=0 ! rtpmp2tpay pt=33 ! udpsink name=sink sync=false " + hostname_port;
cmake .
make
sudo wpa_supplicant -i wlp0s20u1 -ddt -u
wlp0s20u1
請換成你的無線網卡裝置名稱-ddt
: 用來開啟比較詳細的 debug 訊息,且在訊息加上 timestamp-u
: 用來開啟 DBus control interface
wpa_supplicant
在編譯的時候沒有加入上面提到的 CONFIG_CTRL_IFACE_DBUS_NEW=y
的話,這個選項就不會有用。sudo connmand -r -n -d -i wlp0s20u1
wlp0s20u1
請換成你的無線網卡裝置名稱-r
: 不要開啟 DNS proxy
-n
: 不要在背景執行,方便看到 debug 訊息-d
: 開啟 debug 模式sudo connmanctl
connmanctl> enable wifi
connmanctl> enable p2p
connmanctl> scan p2p
connmanctl> peers
connmanctl> agent on
如果以上都正常的話,應該就會像官方在其 GitHub repo 的 wiki 所列出的截圖一樣:
connmanctl> scan
可以重新掃描附近的裝置connmanctl> peers
列出可以連線的裝置connmanctl> connect N
連線到該裝置還沒到完全能動,畫面有點卡,而且沒有聲音,猜測是還得去調整 gstreamer
的參數。
但就紀錄下來,也給可能有遇到這個問題想要解決的人參考,如果有幫助到你的話很歡迎留言跟我說一下,如果試出了更好的結果當然更棒就是。
如果覺得我的文章不錯的話,
請幫我按讚、追蹤、訂閱、留言、分享,
有任何問題也都歡迎留言討論,
也可以利用像是 Feedly 等 RSS Reader,
直接訂閱我的部落格:https://blog.m157q.tw。
iThome 這邊我應該只有鐵人賽的時候會使用。