Android实现AirPlay,DriodAirPlay开发

来源:互联网 发布:合肥兆度网络怎么样 编辑:程序博客网 时间:2024/06/13 01:28

      AirPlay的介绍就不多说了,在Android上实现AirPlay我们主要参考的是国外大神破解出来的DriodAirPlay。下载DroidAirPlay源码

      DroidAirPlay是一个Maven工程,这是能在PC上跑起来的。在PC上实现性能杠杠的!!

      接下来我们需要把它转化成我们想要的Android工程:


   1.新建一个Android工程,将对应DroidAirPlay项目src下的包拷贝到 新建的项目的src 下,同时将项目中用到的jar包拷贝到Android的lib目录下。

  需要添加的jar包:

                               

  这些是在Android工程中不需要用到的可以直接删掉:

                                                               

  在MainActivity onCreate 方法中启动服务:

                  

<span style="font-size:24px;">// 打开AirPlayString transformation = "RSA/None/OAEPWithSHA1AndMGF1Padding";try {Cipher rsaPkCS1OaepCipher = Cipher.getInstance(transformation);} catch (Exception e) {e.printStackTrace();}airPlayServer = AirPlayServer.getIstance();airPlayServer.setRtspPort(5000);thread = new Thread(airPlayServer);thread.start();System.out.println("开启AirPlay");</span>

   2.需要修改的部分,在 nz.co.iswe.android.airplay.audio.AudioOutputQueue 这个类中将播放器使用Android的AudioTrack:

<span style="font-size:24px;">//============================创建 AudioTrack==============================      // 32000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率sampleRateInHz      // 44100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD, MP3)所用采样率       //audioTrack = new AudioTrack(streamType, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes, mode);         audioTrack = new AudioTrack(streamType, sampleRateInHz, AudioFormat.CHANNEL_CONFIGURATION_STEREO, audioFormat, bufferSizeInBytes, mode);</span>
   3. 采样数据处理:

<span style="font-size:24px;">    byte bytTemp = 0x00;      if (convertUnsignedToSigned) {          /* The line expects signed PCM samples, so we must          * convert the unsigned PCM samples to signed.          * Note that this only affects the high bytes!          */          for(int i=0; i < samplesConverted.length; i += 2){              samplesConverted[i] = (byte)((samplesConverted[i] & 0xff) - 0x80);              //add by ville              bytTemp = samplesConverted[i];              samplesConverted[i] = samplesConverted[i + 1];              samplesConverted[i + 1] = bytTemp;              //end          }      }  </span>
  4. 现在是可以运行了, 但是连接后播放音乐音量不能调整,因为android中最大音量为 1.0, 和AirPlay 协议文档上定义的不同,我们可以通过打印音量的值来修改成Android上的音量。需要修改 nz.co.iswe.android.airplay.audio.AudioOutputQueue

<span style="font-size:24px;">/** * Sets the AudioTrack the Stereo Volume * * @param leftVolume * @param rightVolume *  */private void setStereoVolume(float leftVolume, float rightVolume) {if(leftVolume==-144.0f){leftVolume=0.0f;rightVolume=0.0f;audioTrack.setStereoVolume(leftVolume, rightVolume);return;}leftVolume =leftVolume +30;leftVolume =(float) (leftVolume /1.875*0.0625);rightVolume=leftVolume;audioTrack.setStereoVolume(leftVolume, rightVolume);}</span>
 5.我们可以修改设备名, 默认搜索到名字是localhost(wlan0), 通过修改 nz.co.iswe.android.airplay.AirPlayServer

//157 行//networkUtils.getHostUtils();
String hostName = "tomorrow_p";






 




1 0