DLPlay開發(fā)故事:為了在Apple TV上看一場球賽,我開發(fā)了一個APP

https://apps.apple.com/app/dlplay/id6448221325
DLPlay 是一款在 Apple TV 上實現(xiàn) DLNA 投屏的軟件,經過若干次的迭代,軟件基本能適配大部分國內使用率高的視頻軟件。軟件一開始開發(fā)出來的目的原本只是為了用咪咕視頻投屏看球賽,隨著用戶越來越多,客戶的需求也越來越多。主要分為三類:
投送嗶哩嗶哩/騰訊視頻/優(yōu)酷等視頻類。
投送斗魚/虎牙/抖音等直播類
投送 Nas/Jellyfin/迅雷本地視頻類
DLPlay 對這三種場景都做了適配,可以選用三種不同的播放器(native/mpv/vlc)應對這三種場景。
0. 源起
0.1 從樹莓派進化到Apple TV
去年(2022年),由于疫情,我有了很多居家辦公的機會,居家辦公時少不了摸魚看劇/電影。因為我有兩臺顯示器,一臺用來辦公,一臺作為電視顯示器,每一次看劇我都要拔下筆記本電腦,插到另一臺顯示器上看劇,很不方便,有時候還很容易錯過工作消息,剛好手頭一臺樹莓派4B,于是接上硬盤盒,安裝上了kodi,這個樹莓派就成為了我的第一個電視盒子,為了方便遙控,我還特地買了一個飛鼠,配合kodi,當時覺得還不錯,只是樹莓派的解碼能力實在太低,解碼4k非??D,基本不可用。
我又買了一個小型迷你電腦作為電視盒子,但是遙控的問題又來了,我的遙控器是一個飛鼠,有一個小型鍵盤,用這個鍵盤輸入特別麻煩,安裝的是Ubuntu系統(tǒng),經常出問題,不是kodi假死就是系統(tǒng)假死,還有要求輸入密碼,升級之類的,有時候想看個電影要折騰一番,心情沒了,有時候看到一半要折騰一番,心情沒了,于是想買個專業(yè)的電視盒子。這時候Apple TV 4k恰好發(fā)布,我想都沒想,入手了,不得不說Apple TV配合Infuse看電影刷劇非常舒服。
0.2 看電影刷劇很爽,看足球很麻煩
上面說道,2022年我有很多機會看電影電視劇,但是到下半年,電影電視劇已經不能給我?guī)硇迈r感了,也不能說是劇荒,更像是「電子陽痿」的表現(xiàn),而且心情也被防控搞得很壓抑,這時候刷到了夏奇拉的南非世界杯主題曲《waka waka》和推廣曲《旗開得勝》,這兩首歌真的很歡快很有氛圍,壓抑的心情一下舒展了,看到里面的人自由自在的舞動歌唱,瞬間羨慕起這種氣氛,原來恰好世界杯就要舉辦了,我便開始期待世界杯的來臨,我本不是球迷,我那時對足球世界的了解僅限于高中時座位旁邊幾位同學的口中,我高中時期是13-16年,那時候梅西和C羅正值職業(yè)巔峰期,bbc組合和msn組合在西甲和歐冠賽場的爭奪給了我周圍的同學很多話題,我也耳濡目染。到了大學,我就再也沒有關注過足球世界。
話說回來,我發(fā)現(xiàn)在Apple TV上觀看世界杯賽事還是真是件麻煩事,在世界杯上觀看世界杯賽事主要有兩個渠道,一個是CCTV-5一個是咪咕視頻,CCTV-5可以通過IPTV觀看,但是大部分IPTV源都很差,非??D,根本看不了,而咪咕視頻不支持通過AirPlay投屏,只支持DLNA投屏,于是又在Apple TV上安裝了kodi,kodi并沒有上架App Store,只能通過Xcode側載的方式安裝,由于是開發(fā)者證書,還得每7天重新安裝一次,那個時候我萌生了開發(fā)一個DLNA投屏軟件的想法。
1. 開始行動
隨著安裝kodi的次數(shù)越來越多,我開發(fā)軟件的想法越來越強烈,希望能一次性解決投屏的問題。為了了解其他與我有同樣困擾的用戶,我在V2EX也發(fā)起了一個問答。從那天開始,我也開始了行動。
2. 開發(fā)故事
2.1 初出茅廬
我本是一個Java后端程序員,因為也是開發(fā)老油條了,我沒打算先學習Swift或者iOS開發(fā)再寫程序,而是直接新建文件夾開始項目,除了一些特性比如Swift協(xié)議,泛型,擴展讓我很不習慣外,Swift語言和Java大部分都是相通的,當然,兩者的編碼風格也是不同的,作為Java程序員我很自然的就用Java風格來寫這個程序,一個多月后,第一個版本開發(fā)出來了,上架了App Store,在V2EX首發(fā),我很高興的告訴了其他同樣有這個需求的用戶,送出了一些兌換碼和testfilght邀請他們測試。當天就有十幾個用戶購買,讓我很受激勵。
2.2 繼續(xù)完善
這個軟件本來開發(fā)設計出來只是為了用咪咕投屏看球賽而已,所以只測試了一些基本的視頻軟件,由于各方的對DLNA協(xié)議(DLNA只是一個標準)的實現(xiàn)不同,所以兼容性并不強,很多軟件投不了,隨著用戶越來越多,他們通過郵件,私信和反饋群給了我各種寶貴意見和建議,我最終準備重構一個大版本,幾乎花了一個多月,重寫了幾乎所有代碼,重新設計了架構,改用了Swift的編碼風格(這時候我已經愛上了Swift這個編程語言),新版本我很滿意,把版本號標記為2.0,表示這是一次巨大的更新,新版也解決了大多數(shù)軟件的投屏兼容性問題。
2.3 還有問題
作為一個投屏軟件,我以為2.0版本已經很完善了,隨后收到直播音畫不同步的反饋,由于我一直用屏幕鏡像來調試App,沒有辦法發(fā)出聲音,也很少投虎牙,斗魚直播,一直沒發(fā)現(xiàn)這個問題,后來排查,發(fā)現(xiàn)是vlckit對直播的兼容性不是很好,只能想辦法集成mpv播放器。mpv與vlc不同,vlc通過vlckit暴露了自己的api,但是mpv是個裸的庫,通過命令的方式來調用,還好找到了一些開源項目和官方案例供參考。通過2.0版本也積累了大量經驗和代碼,新的架構也對集成新播放器是包容的,集成mpv播放器比我想象得快,用了大概一周時間就完成了,至此,作為一個投屏應用,這個軟件已經適配了大部分場景了。
3. DLPlay VS AirPlay
大家知道,對于視頻投屏,Apple平臺一直有一個非常好用的解決方案:AirPlay,DLPlay相對于AirPlay有什么優(yōu)勢呢,我總結出了下面四點
從任何平臺的 DLNA 客戶端投送視頻。iOS 可以投,Android 可以投,Windows 也可以投。
支持視頻格式多。相比于 AirPlay ,DLPlay 集成了三個播放器,幾乎可以播放任何格式的視頻。
針對投屏個各個場景優(yōu)化。比如針對 NAS 場景優(yōu)化的 VLC 播放器,擁有切換音軌,字幕軌道,倍速播放等高級功能,針對直播場景我們集成了對直播兼容性更好的 MPV 播放器。
無需保持在投屏界面