DLNA, PulseAudio, diffpatch, bash
http://antkillerfarm.github.io/
參考資料
http://www.miui.com/thread-647727-1-1.html
http://pie.pconline.com.cn/443/4434846.html
這兩篇文章從用戶的角度分析DLNA設備的使用方法。
http://en.wikipedia.org/wiki/List_of_UPnP_AV_media_servers_and_clients
這個網址提供了支持UPnP/DLNA的服務器和客戶端的名單。
http://jorgenmodin.net/index_html/archive/2009/12/26/list-of-open-source-dlnaupnp-av-software-devices
這個網址主要針對Linux平臺的UPnP/DLNA軟件。
http://www.right.com.cn/forum/thread-115634-1-1.html
http://www.right.com.cn/forum/forum.php?mod=viewthread&action=printable&tid=135975
這兩篇是如何向OpenWRT中添加DLNA、AirPlay功能的帖子。
http://mayecn.com/blog/2013/04/23/dlna/
這也是一篇AirPlay的帖子。
DLNA各種設備角色的分析
設備角色的定義
DLNA體系結構最重要的一個概念就是設備角色(Device Category)。
以下對其中主要的角色做一個通俗的解釋,至于準確的定義可查閱相關規范,這里就不贅述了。
Digital Media Server (DMS)。DMS就是存放多媒體數據的地方。
Digital Media Player (DMP)。DMP負責多媒體數據的解碼。
Digital Media Renderer (DMR)。DMR負責多媒體數據的展示,比如顯示圖片、視頻,輸出音頻等。
Digital Media Controller (DMC)。DMC負責媒體的播放控制,比如開始、停止、快進、快退等,相當于是個遙控器。
各種設備角色之間的交互
DLNA定義了兩大類的交互。
- 2-Box System
上圖是一個典型的2-box應用。DMP播放DMS中的多媒體數據。這類應用其實和通常的流媒體播放差不多,即使不用DLNA,也可以用類似FTP、Samba之類的協議,分享DMS中的多媒體數據,因此還談不上有多牛。
- 3-Box System
上圖是一個典型的3-box應用。DMR負責播放DMS的多媒體數據,但整個流程確是由DMC創建并控制的。舉個通俗的例子就是,DMC相當于淘寶網,客戶在網上下單,但淘寶網自己并沒有商品,于是它將訂單發給淘寶賣家(DMS),然后,DMS將商品交給快遞(DMR),DMR最終將商品交到客戶手中(將多媒體內容播放出來)。
2-Box System和3-Box System本身都是一大類的應用,上面圖中展示的只是其中的典型個例。
設備能力模型
在DLNA剛推出的時候,設備功能還比較簡單,采用設備角色模型運作的很好。但后來隨著設備功能的完善,這個模型缺點也暴露無遺。
以音箱為例,作為一個標準的輸出設備,它的角色應該是DMR。后來添加了各種音頻處理的功能之后,也可以算是DMP。再后來,集成了外接USB存儲設備,充當DMS似乎也是很自然的事。那么這個時候音箱的角色是什么呢?
針對這樣的情況,DLNA的新標準引入了設備能力模型,簡單的說就是在網絡通知的時候,告訴其他設備,自己有哪些能力(也就是自己能充當哪些角色)。
還是以上面的音箱為例,進化后的音箱可以聲稱自己具備DMR+DMP+DMS的能力。
各種Android音頻播放軟件能力對比
- QQ音樂
只能將在線音樂推送到DMR,不能推送本地音樂,也不能點播DMS中的音樂。
- 酷狗音樂
可以推送在線音樂和本地音樂到DMR,但不能點播DMS中的音樂。
- BubbleUPnP
功能最全,沒有什么干不了的。推薦使用這個軟件來調試設備的DLNA功能。
- Onkyo Remote
貌似只能點播DMS+DMP中音樂,純DMS的不行。換句話說它只是個DMC。
- iMediaShare(又名Flipps)
全功能。由于本身不自帶播放器,DMR/DMP需要借助其他的本地播放器來實現。這個是免費的,沒有BubbleUPnP的同學,可以用這個代替。
- UPnPlay
DMR+DMP+DMC。
各種服務端軟件能力對比
- Windows Media Player
功能齊全,沒有什么干不了的。
- ReadyMedia(又名MiniDLNA)
DMS。代碼開源。
項目地址:
http://minidlna.sourceforge.net/
- gmediarender
DMP+DMR。作為早期GNU項目的gmediarender,已經停止維護。2012年的時候,Henner Zeller為了將gmediarender移植到樹莓派上,重新發起了該項目,并命名為gmrender-resurrect。Ubuntu等發行版所提供的gmediarender,已經改用gmrender-resurrect項目的代碼。
gmrender-resurrect項目地址:
https://github.com/hzeller/gmrender-resurrect
- ushare
DMS,該項目已經很久沒有更新,不推薦使用。
- Rygel
全功能。官網為:
https://wiki.gnome.org/Projects/Rygel
該項目用vala語言編寫。Ubuntu中,可用以下命令安裝環境:
sudo apt-get install valac
DLNA環境搭建
網絡環境
PC和手機都用Wifi連接到同一個無線路由器上。這一點很重要,目前的手機軟件暫時還不能搜索到整個局域網里的所有DLNA設備。
Windows環境設置
由于Windows自帶的Windows Media Player已經具備完整的DLNA功能,因此可以首先在Windows上設置環境,用于確認手機和網絡的設置是否正常。并為后面的Linux環境設置,提供一個參考平臺。
Windows環境設置步驟(以Windows 7為例):
1.控制面板—>網絡和Internet—>網絡和共享中心,設置當前網絡為家庭或工作網絡。
2.控制面板—>網絡和Internet—>網絡和共享中心->高級共享設置->媒體流選項,啟用媒體流。
3.計算機->庫,選中“音樂”,右鍵菜單->共享,設置相應的共享權限。
4.控制面板->網絡和Internet->家庭組,選中“與設備共享媒體”。
5.打開Windows Media Player,頂部菜單->媒體流,選中“允許遠程控制我的播放器”和“自動允許設備播放我的媒體”。
這幾步都設好之后,打開BubbleUPnP,即可搜索到Media Player設備。
Linux環境設置(以Ubuntu為例)
這里的Linux環境可以用VirtualBox搭建。在設置網卡時,需要設置兩塊網卡,分別設置如下:
網卡1:WAN 橋接
網卡2:LAN NAT
由于Linux下現有的幾個全功能開源庫,對設備配置的要求比較高。這里打算采用兩個輕量級的開源庫分別實現DMS和DMR。
DMS:ReadyMedia
1.安裝
sudo apt-get install minidlna
2.修改minidlna配置
sudo gedit /etc/minidlna.conf
3.重啟minidlna服務
sudo /etc/init.d/minidlna force-reload
DMR:gmediarender
1.安裝
sudo apt-get install gmediarender
這里需要注意的是,gmediarender是在Ubuntu 14.10中添加到源里的,不過該軟件包在Ubuntu 14.04下亦可正常運行。因此,安裝的時候只要修改軟件源的配置即可。
2.啟動服務
gmediarender -d
3.添加gstreamer插件
gmediarender僅提供UPNP服務,真正的媒體播放使用gstreamer來完成。
Openwrt上的DLNA編譯過程
方案一:Rygel
這個方案可參見:
http://wiki.openwrt.org/doc/howto/rygel
但是由于
http://patchwork.openwrt.org/
最近已經無法訪問,因此該方案試了兩天也沒能弄出來,只好作罷了。
出現問題的原因在于Rygel是采用Vala語言編寫的,需要有專門的Vala處理的腳本,而這個在標準的Openwrt中是沒有的。
方案二:minidlna+gmediarender
1.minidlna
這個是目前官方支持的包。但是默認情況下,在Multimedia下并不可見。需要首先在Libraries下選擇libffmpeg-mini或者libffmpeg-full,然后才能在Multimedia下看見。
此外配置方式和PC也略有不同:
1)配置文件在/etc/config/minidlna。相比PC版的配置,除了格式有所差異外,內容基本一致。唯一需要注意的是,其比PC版多了一個interface的配置項,需要將該項的內容改為在/etc/config/network中配置的lan的名稱。
2)啟動命令為:
/etc/init.d/minidlna enable
/etc/init.d/minidlna start
3)修改圖標
圖標數據在icons.c中。可用xxd命令轉換png或者jpg文件為C的字節數組。
2.gmediarender
修改參見:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/openwrt_feeds
啟動命令:
/etc/init.d/gmediarender start
Airplay
Airplay是Apple推出的媒體共享協議,可用Shairport包實現之。
Shairport是James Laird發起的開源項目,其官網是:
https://github.com/abrasive/shairport
Shairport基于Airplay v1協議,僅可用于推送音頻流。(推送視頻、圖片需要用到Airplay v2協議)目前作者已經聲明不再維護該項目。該項目比較好的分支有:
https://github.com/mikebrady/shairport-sync
這個分支添加了多設備音頻流同步方面的內容。
參考:
http://raspberrypihq.com/how-to-turn-your-raspberry-pi-into-a-airplay-receiver-to-stream-music-from-your-iphone/
和DLNA、Airplay類似的協議還有Miracast和騰訊的QPlay,其中的QPlay基本山寨DLNA。
參考文獻:
http://www.leiphone.com/news/201406/airplay-dlna-miracast.html
這篇文章介紹了DLNA、Airplay和Miracast等協議。
http://www.wi-fi.org/discover-wi-fi/wi-fi-certified-miracast
這是Miracast協議的官網。
DLNA的Android開發
目前來說,在Android中用到的UPNP框架基本為cyberlink框架和cling框架。這兩個框架都是個人作品。
前者的作者是Satoshi Konno(個人主頁:http://www.cybergarage.org/),一個45歲左右的日本資深碼農,對云計算、物聯網、3D圖像、虛擬現實均有很深的造詣。
后者的作者是Christian Bauer(個人主頁:http://4thline.org/)。
cyberlink框架代碼參見:
https://github.com/CharonChui/CyberLink4Android
cling框架代碼參見:
http://4thline.org/projects/cling
cling框架的demo程序wireme可參見:
code.google.com/p/wireme
參考文獻:
http://blog.csdn.net/tkwxty/article/details/43342595
https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=25684
PulseAudio
PulseAudio是一個介于ALSA和應用層之間的聲音服務。和GStreamer的區別在于,后者是一個多媒體庫,需要應用程序調用,才能運行,而前者直接可以運行。
它的官網:
https://www.freedesktop.org/wiki/Software/PulseAudio/
相關資料:
https://rootprompt.apatsch.net/2013/04/23/raspberry-pi-network-audio-player-pulseaudio-dlna-and-bluetooth-a2dp-part-3-bluetooth/
無線話筒
傳統的無線話筒采用模擬信號傳輸,原理和收音機廣播類似。其無線信號發送頻段一般在FM、VHF和UHF上,總的趨勢就是頻率越來越高。目前主流的是UHF。
采用數字信號的無線話筒,其技術難點在于制定低延遲的音頻傳輸協議。
參考:
http://www.ca001.com/thread-380980-1-1.html
這篇文章講述了Dante網絡音頻傳輸協議。
http://www.studa.net/tongxin/091128/11441289.html
淺談Dante數字音頻傳輸技術。
https://www.audinate.com/
提出Dante協議的公司。
http://wenku.baidu.com/view/d0bcd929e2bd960590c67750.html
IEEE Ethernet AVB協議簡介。
diff&patch
diff/patch這對工具在數學上來說,diff是對2個集合求差,patch是求和。
{% highlight bash %}
diff -uNr A B > C #生成A和B的diff文件C,-uNr為最常用的選項
patch A C #給A打上diff文件得到B
patch -R B C #B還原為A
{% endhighlight %}
批量patch
給目錄應用patch。
patch -p1 <1.patch
這種情況適合1.patch中包含對多個文件的修改時。
批量應用patch
有的時候,patch不是一個patch文件,而是一個目錄中的若干個patch文件。這時可用如下辦法:
find . -name "*.patch">1.txt
sort 1.txt | xargs cat >2.patch
patch -p1 <2.patch
bash
查看當前使用的shell
實時查看:
ps | grep $$ | awk '{print $4}'
非實時查看:
echo $SHELL
return和exit的區別
return用于函數的返回,它只能用在函數中。
exit用于整個shell腳本的退出。
預定義變量
$?: 上條命令的返回值
$$: 當前shell的PID。
總結
以上是生活随笔為你收集整理的DLNA, PulseAudio, diffpatch, bash的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ALSA(二), makefile, A
- 下一篇: UPNP(一)