俄罗斯18videosex性欧美成人_国产一国产一级精品毛片_在线无码国产观看播放网址_久久国产天堂福利天堂

Airplay SDK—Airplay sever/Airplay鏡像傳輸 破解示例

bijienetwork 發(fā)布

AirPlay是蘋果公司的在iOS4.2OS X Mountain Lion中加入的一種播放技術,可以將iPhoneiPod touch、iPadMac(需要OS X Mountain Lion或更新版)上的視頻鏡像傳送到支持Airplay的設備(如:音箱、Apple TV)中播放。使用Airplay需要iOS4.2版本的設備或Mac電腦上的iTunes10.1以上版本。視頻鏡像則需要iOS 5OS X Mountain Lion。

當用戶的設備(Mac, PC, iPod touch, iPhone, iPad)與支持AirPlay技術的音箱在同一無線局域網(wǎng)(WIFI)內(nèi)的時候,用戶在MacPC上打開iTunes 10或更高版本后,就會在iTunes音量條旁邊(iTunes 10在窗口的右下角)看到一個AirPlay按鈕。點擊該AirPlay按鈕,然后選擇需要同步到的設備,就可以選擇將音樂或視頻無線同步到設備進行播放。而iPod touch, iPhoneiPad用戶則可以在相應的“音樂”,“視頻”以及支持AirPlay功能的第三方軟件界面找到AirPlay按鈕,操作同MacPC。

由于AirPlay并非是開源的而且需要逆向獲得AirPlay key,所以要實現(xiàn)AirPlay的難度不小,網(wǎng)上流傳的AirPlay協(xié)議都是非官方的,WirelessDisplay群里有下載好的協(xié)議,每次 IOS的升級都會對AirPlay協(xié)議進行一定的修改,給剛接觸想學習AirPlay的朋友推薦幾個簡單的AirPlay實現(xiàn)

第一個流傳出來的AirPlay是由James Laird大神發(fā)布的,原因就是他的女朋友想將自己的ipod無線投到音響上播放,當時只有蘋果官方的盒子才能夠支持,James Laird一怒之下破解了當時的AirPlay協(xié)議,并且公開了Private Apple AirPlay key。

//github.com/abrasive/shairport

這個daemon采用c語言編寫,可以進行ios7及以下設備的音頻投射,在公司用ipod實測可用。

//github.com/gpfduoduo/AirPlay-Receiver-on-Android

我天朝人發(fā)布的開源項目,支持IOS8.4之前的音視頻投屏以及圖片推送,經(jīng)過實測可用。

 

AirPlay版本繁多,協(xié)議也比較多:鏡像,非鏡像,圖片,視頻,音頻,第三方app等等各種協(xié)議之間都有差別,以后會慢慢給大家介紹的。

要實現(xiàn)AirPlay的第一步就是要實現(xiàn)iosAirPlay之間的相互發(fā)現(xiàn),可以使用zeroconf,mdns等開源協(xié)議來實現(xiàn),下一章會詳細介紹介紹這幾種發(fā)現(xiàn)協(xié)議。

要實現(xiàn)airPlay的鏡像Server端功能,要從以下幾個方面來考慮

  • 1.發(fā)現(xiàn)過程
  • 2.協(xié)商過程
  • 3.視頻傳輸
  • 4.解密過程

 

發(fā)現(xiàn)過程

使用Bonjour,可以參考mDNSResponder,jmdns,注冊兩個服務:airtunesairplayAirplayTxt以及RaopTxt照著demo填寫就可以了,也可以根據(jù)自己的要求修改其中的值,

需要注意的如下:

airtunes:?? “12345@wirelessdisplay” , ”_raop._tcp.”airplay:??? “wirelessdisplay” , ”_airplay._tcp.”

參數(shù)中”_airplay._tcp.”和’’_raop._tcp.”不可修改。

發(fā)布了服務之后,ios設備中應該就可以搜索到Server端了

協(xié)商過程

c-s: pair-setup

s-c: xxx

c-s: pair-verify

s-c: xxx

c-s: fp-setup

s-c: xxx

c-s: fp-setup

s-c: xxx

setup

setup response

setup

setup respnose

pair-setup,pair-verify配對驗證,Server端根據(jù)收到的信息進行回復,格式類似RTSP

fp-setup(第一次和第二次),Fairplay相關。

第一次setup階段會收到一大串數(shù)據(jù),是按照plist格式生成的,用相應的方法進行解析可以得到ekeyeiv等信息,用于后續(xù)的解密。

第二次setup階段獲得type,通過type來判斷視頻數(shù)據(jù)或音頻數(shù)據(jù),通知接收端建立傳輸通道準備進行音視頻數(shù)據(jù)的發(fā)送,加密過的屏幕鏡像數(shù)據(jù)通過指定的端口(一般為7100)發(fā)送到接收端。

接收端收到發(fā)送過來的數(shù)據(jù)后進行解密,解密后的數(shù)據(jù)就可以進行播放了。

中間也可能會有GET_PARAMETER,SET_PARAMETER來調(diào)整音量等信息。

 

解密部分目前主要有兩種方法:

1.從apptvmacOS獲取。

2.從市面上已有的可投屏產(chǎn)品中獲取。

AIRPLAY鏡像投屏過程中,音視頻數(shù)據(jù)都是加密過的,對于接收端來說,需要正確解密后才能對音視頻數(shù)據(jù)進行處理,音頻和視頻的解密過程還不一樣。音頻相對簡單一點,視頻會復雜一些。這一塊的解密過程是沒有公開的,是蘋果自身的Fairplay DRM協(xié)議部分?,F(xiàn)在市面上的第三方Airplay接收端無非都是通過逆向過程破解了相關部分。

本文針對音頻的處理做一個介紹,音頻部分的處理相對簡單一點。

解密過程:

1 音頻采用AES CBC128進行加密,這一部分可以使用開源的openssl庫進行處理

2 該算法需要解密的輸入?yún)?shù)包括aeskey,aeskiv,通過ANNOUNCE請求中攜帶,ANNOUNCE請求同時還會攜帶音頻的編碼信息。

通過解密過程后,我們會得到AAC編碼的音頻數(shù)據(jù),播放器播放AAC數(shù)據(jù)還需要對其進行解碼。

在我們實現(xiàn)的接收端程序,協(xié)商出來的是AAC-ELD編碼。對于AAC的解碼,可以使用一些開源的庫,如fdk,ffmpeg等,也可以使用android提供的MediaCodec進行解碼。

但筆者曾經(jīng)在某些Android手機上發(fā)現(xiàn),解碼AAC-ELD有問題。推薦大家用fdk進行解碼。

使用fdkaac進行解碼,其實在網(wǎng)上也能找到很多例子,但筆者發(fā)現(xiàn)很多例子有一處錯誤,在低版本的fdk上不會出現(xiàn)錯誤,但是在高版本的fdk會出現(xiàn)crash這樣的問題。話不多說,直接通過部分代碼來說明過程。

初始化解碼器:

  1. UCHAReld_conf[]?=?{?0xF8,?0xE8,?0x50,?0x00?};??????????//44100,2channels,s16
  2. UCHAR*aac_eld_conf[]?=?{?eld_conf?};???????????????????//TODO?just?for?aac?eld?config
  3. staticUINT?aac_eld_conf_len?=?sizeof(eld_conf);
  4. decoder?=?aacDecoder_Open(TT_MP4_RAW,?1);
  5. AAC_DECODER_ERROR?ret?=?aacDecoder_ConfigRaw(decoder,?aac_eld_conf,?&aac_eld_conf_len);
  6. buffer?=?newINT_PCM[960];
  7. buffer_size?=?1920;
  8. pcm_size?=?960;

上述代碼中eld_conf這一塊的值對應android MediaCodec aacCSD buffer #0具體什么含義看規(guī)范吧。

每次編碼和發(fā)送的采用數(shù)為480,故下面申請對應長度的Buffer

 

解碼過程:

  1. bytesValid?=?dataLen;
  2. while(bytesValid){??
  3. ret?=?aacDecoder_Fill(decoder,?reinterpret_cast<UCHAR**>(&p_frame),?(UINT*)&size,?&bytesValid);
  4. if?(ret?!=?AAC_DEC_OK)?{
  5. printf(“aacDecoder_Fill?return?%x.\r\n”,?ret);
  6. return;
  7. }
  8. for(;;)?{
  9. ret?=?aacDecoder_DecodeFrame(decoder,?buffer,?pcm_size,?0);
  10. if(ret?==?AAC_DEC_OK)?{
  11. dump_audio_data((unsigned?char*)buffer,buffer_size);
  12. }?elseif?(ret?==?AAC_DEC_NOT_ENOUGH_BITS)
  13. break;
  14. else{
  15. printf(“aacDecoder_DecodeFrame?return?%x.\r\n”,?ret);
  16. return;
  17. }
  18. }
  19. }

aacDecoder_DecodeFrame填入的參數(shù)為pcm_size,其單位為short,而不是byte。網(wǎng)上的例子很多都是在這里錯誤。請各位務必注意。

必捷網(wǎng)絡現(xiàn)提供技術全國領先的Airpaly SDK蘋果無線投屏軟件開發(fā)工具包,支持同時多路,支持鏡像/視頻/圖片/音樂,支持MAC OS/iOS6/iOS7/iOS8/iOS9/iOS10/iOS11投屏,支持Linux/Android/Windows/X86/ARM/MIPS等,可根據(jù)需求定制開發(fā),通過電話或者在線咨詢聯(lián)系我們獲取更多無線投屏sdk(airplay sdk、miracast sdk)相關信息,歡迎咨詢!

?

???????????????????????????????????????????????????????????????????????????????????????????????????????????????