編輯:關於Android編程
前段時間剛做完Airplay的相關應用,現在就開發的一點經驗和大家分享一下。
首先,說說Airplay吧,Airplay可以將iPhone,iPad或iPodtouch等設備上的視頻、音頻以及圖片傳輸到第三方認證設備上,一般是在AppleTV或Air port設備上,但其實,現在很多第三方的android設備也可以支持Airplay了,像阿裡雲或小米的盒子都支持Airplay投影了,而且效果都還不錯。
其實,Airplay算是蘋果公司定義的一種協議,或是一種技術吧,所以,按照慣例,這項技術是不開源的,對外封閉。而Android端,可以使用一套的多屏互動方案的,叫做DLAN,即Digital Living Network Alliance,它的協議是公開的。在次,得感謝諸多技術大牛,破解了Airplay,包括音頻投影服務中使用的RSA私鑰,和一份具體的協議說明(http://nto.github.io/AirPlay.html)。
下面,就Airplay協議內容大概的說明一下,當然,大家直接看上述地址中的內容也許更清楚,本人能力有限,大概的說說我的部分理解。
一般我們會發布兩個服務:AirTunes service(RAOP)和AirPlay Service,前者用於音頻流的投影,後者用於圖片和視頻內容的投影。
這裡音頻包是幾乎完全兼容RTP協議。RTP包按有效載荷的不同類型分為以下幾種:
Audio packets:其有效載荷為經過加密的audio data
Sync packets:服務端每秒鐘會收到一個同步包,來將RTP中的timestamps與用於始終同步的NTP time關聯起來
Retransmit packets:對丟失的audio packets進行重傳
Timing packets:用於音頻的主時鐘同步
Client:客戶端首先會用RSA公鑰,利用OAEP加密方式自動生成一個隨機的128位AES key,然後和rsaaes key,aesiv一起發送給Server。
Sever:服務端利用指定的RSA私鑰來解密AES key,然後將解密結果返回給Client。
Client:客戶端利用RSA公鑰要解密收到的數據,若解密結果和之前自動生成的隨機數一致,則表明服務端解密成功。
其中,PEM-encodedPKCS#8格式的私鑰為
/** * The AirTunes private key in PEM-encoded PKCS#8 format. * Original Key from shairport was in PEM-encoded PKCS#1 format */ private static final String PrivateKeyData = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDn10TyouJ4i2wf\n" + "VaCOtwVEqPp5RaqL5sYs5fUcvdTcaEL+PRCD3S7ewb/UJS3ALm85i98OYUjqhIVe\n" + "LkQtptYmZPZ0ofMEkpreT2iT7y325xGox3oNkcnZgIIuUNEpIq/qQOqfDhTA92k4\n" + "xfOIL8AyPdn+VRVfUbtZIcIBYp/XM1LV4u+qv5ugSNe4E6K2dn9sPM8etM5nPQN7\n" + "DS6jDF//6wb40Ird5AlXGpxon+8QcohV3Yz7movvXIlD7ztfqhXd5pi+3fNZlgPr\n" + "Pm9hNyu2KPZVn1maeL9QBoeqf0l2wFYtQSlW+JieGKY1W9gVl4JeD8h1ND7HghF2\n" + "Jc2/mER7AgMBAAECggEBAOXwDHL1d9YEuaTOQSKqhLAXQ+yZWs/Mf0qyfAsYf5Bm\n" + "W+NZ3xJZgY3u7XnTse+EXk3d2smhVTc7XicNjhMVABouUn1UzfkACldovJjURGs3\n" + "u70Asp3YtTBiEzsqbnf07jJQViKQTacg+xwSwDmW2nE6BQYJjtvt7Pk20PqcvVkp\n" + "q7Dto1eZUC+YlNy4/FaaiS0XeAMkorbDFm40ZwkTS4VAQbhncGtY/vKg25Ird2KL\n" + "aOaWk8evQ78qc9C3Mjd6C6F7RPBR6b95hJ3LMzJXH9inCTPC1gvexHmTSj2spAu2\n" + "8vN8Cp0HEG6tyLNpoD8vQciACY6K3UYkDaxozFNU82ECgYEA9+C/Wh5nGDGai2IJ\n" + "wxcURARZ+XOFZhOxeuFQi7PmMW5rf0YtL31kQSuEt2vCPysMNWJFUnmyQ6n3MW+V\n" + "gAezTGH3aOLUTtX/KycoF+wys+STkpIo+ueOd0yg9169adWSAnmPEW42DGQ4sy4b\n" + "2LncHjIy8NMJGIg8xD743aIsNpECgYEA72//+ZTx5WRBqgA1/RmgyNbwI3jHBYDZ\n" + "xIQgeR30B8WR+26/yjIsMIbdkB/S+uGuu2St9rt5/4BRvr0M2CCriYdABgGnsv6T\n" + "kMrMmsq47Sv5HRhtj2lkPX7+D11W33V3otA16lQT/JjY8/kI2gWaN52kscw48V1W\n" + "CoPMMXFTyEsCgYEA0OuvvEAluoGMdXAjNDhOj2lvgE16oOd2TlB7t9Pf78fWeMZo\n" + "LT+tcTRBvurnJKCewJvcO8BwnJEz1Ins4qUa3QUxJ0kPkobRc8ikBU3CCldcfkwM\n" + "mDT0od6HSRej5ADq+IUGLbXLfjQ2iecR91/ng9fhkZL9dpzVQr6kuQEH7NECgYB/\n" + "QBjcfeopLaUwQjhvMQWgd4rcbz3mkNordMUFWYPt9XRmGi/Xt96AU8zA4gjwyKxi\n" + "b1l9PZnSzlGjezmuS36e8sB18L89g8rNMtqWkZLCiZI1glwH0c0yWaGQbNzUmcth\n" + "PiLJTLHqlxkGYJ3xsPSLBj8XNyA0NpSZtf35cO9EDQKBgQCQTukg+UTvWq98lCCg\n" + "D16bSAgsC4Tg+7XdoqImd9+3uEiNsr7mTJvdPKxm+jIOdvcc4q8icru9dsq5TghK\n" + "DEHZsHcdxjNAwazPWonaAbQ3mG8mnPDCFuFeoUoDjNppKvDrbbAOeIArkyUgTS0g\n" + "Aoo/jLE0aOgPZBiOEEa6G+RYpg==\n" + "";
/reverse:協商請求
/scrub: POST方式為seek請求, GET方式為獲取播放位置
/volume: 設置音量:0.000000為靜音,1.000000為最大
/play: 播放請求:攜帶播放鏈接,本地文件播放為http,網絡文件播放為m3u8地址
/rate: 播放與暫停:0.000000為暫停,1.000000為播放
/stop: 停止播放
/photo: 推送圖片:在HTTP的Body發送實際圖片
/playback-info: 獲取播放端的狀態:總時長、緩沖時長、播放位置、播放器狀態(LOADING、PLAYING、PAUSED、STOP)等信息
/server-info: 獲取服務器信息:主要是mac地址信息
做安卓一年有余,意識到網絡請求框架算是很重要的一塊,考慮到Volley是谷歌自帶的,決定好好研究研究源碼,去理理邏輯思路首先呢,Volley去哪裡獲取,看下圖即可,在安卓
由於我的版本最低是2.2,所以只有把源碼下下來自己改,如果你覺得太多了可自己編譯成jar引用,本人不才,對java不是很熟悉,如果此版本中有錯誤還請大家指出來,此圖顯示的
騰訊開放平台的接入是非常麻煩的, open.qq.com,騰訊開放平台的文檔很多很雜,社交功能的api接口也很多還有。我現在只接了他的登錄跟支付。 一、登錄。 登錄相對來
准備花一些時間研究下androd動畫,因為一些酷的效果是離不開動畫的,但是所有的知識都是要從最基本的講起,只有把基礎打好,學一些高級的技術或者效果才會有思路,而不會在某一