安卓上开发  AirPlay Server  主要是参考了和修改了 DroidAirPlay项目 , 和Airplay 协议

1, 将DroidAirPlay 下载下来

2, Eclipse 新建一个 Android 项目, 并 添加JRE Library(防止报错,仅仅编译使用),项目中使用如下几个jar包, 自行下载, 别忘了加入网络及存储的权限

base64-2.3.8.jar
bcprov-ext-jdk16-1.46.jar
dd-plist.jar jmdns-3.4.0.jar
netty-3.2.4.Final.jar
(以上jar包可从 search.maven.org 搜索下载)

3, 将DroidAirPlay 项目的src下的包拷贝到 新建的项目的src 下

4, 新建Activity , 在 onCreate 方法中 使用如下代码 启动服务

AirPlayServer dwa = AirPlayServer.getIstance();
dwa.setRtspPort(8998); new Thread(new Runnable() {
@Override
public void run() { dwa.run();
}
}).start();

5, 需要修改的地方,都在 nz.co.iswe.android.airplay.audio.AudioOutputQueue 这个类中, 参考了这篇文章

1, audioTrack的实例化
//create the AudioTrack
//audioTrack = new AudioTrack(streamType, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes, mode);
audioTrack = new AudioTrack(streamType, sampleRateInHz, AudioFormat.CHANNEL_CONFIGURATION_STEREO, audioFormat, bufferSizeInBytes, mode);//FIXME
2, 采集数据处理
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
  }
}

6, 修改完后应该可以运行了, 但是使用iPhone连接后播放音乐会发现音量调整不了,因为android中 AudioTrack 最大音量为 1.0, 而根据AirPlay 协议文档的说明

The volume is a float value representing the audio attenuation in dB. A value of –144 means the audio is muted. Then it goes from –30 to 0.

需要修改 nz.co.iswe.android.airplay.audio.RaopAudioHandler  如下地方(大约744 行),

if ("volume".equals(name)) {
if (audioOutputQueue != null){
float vol = Math.abs(Float.parseFloat(value));
vol = (float) (1.0 - (vol / 29.0));
audioOutputQueue.setRequestedVolume(vol);
}
}

然后修改 AudioOutputQueue 的 setStereoVolume 方法

//注释掉如下两行
leftVolume = AudioTrack.getMaxVolume();
rightVolume = AudioTrack.getMaxVolume();

8, 修改设备名, 默认iPhone会搜索到名字为 localhost(wlan0) 的设备, 通过修改 nz.co.iswe.android.airplay.AirPlayServer, 可以定制设备名

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

9, 以上代码 大神F2 测试通过, 但是在C8650 这款老机器上发现没声音, 通过log猜测是设备处理能力不足引起, 不知道是不是这个原因...

Android 开发 AirPlay Server的更多相关文章

  1. Android开发 ADB server didn't ACK, failed to start daemon解决方案

    有时候在打开ddms的时候,会看到adb会报如题的错误,解决方案是打开任务管理器,(ctrl+shift+esc),然后关掉adb.exe的进程,重启eclipse就ok了. 还有许多无良商家开发的垃 ...

  2. android 开发adb server is out of date 解决方案

    查看到底是哪个端口给占用了 输入红色部分命令 C:\Users\xxxxxx>netstat -ano | findstr "5037" TCP    127.0.0.1:5 ...

  3. (转) Android开发性能优化简介

    作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...

  4. mac os 下搭建android开发环境

    mac os 下搭建android开发环境 周银辉 mac os 下搭建android环境比较方便, 如下几个步骤: 1,安装jdk 先搞清楚自己是否已经安装,在命令行下:java -version, ...

  5. 搭建Android开发环境。

    1. 从 http://developer.android.com/intl/zh-cn/sdk/index.html 下载ADK 2. 点击SDK.Manager.exe, 遇到闪退的问题,一开始还 ...

  6. 【Bugly 技术干货】Android开发必备知识:为什么说Kotlin值得一试

    1.Hello, Kotlin Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 1. ...

  7. react-native —— 在Windows下搭建React Native Android开发环境

    在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...

  8. android开发环境搭建日记和嵌入式Android开发环境初探

    非常感谢博客园的各位,按照你们的博文,还有利用百度和谷歌逐渐建立了android的开发环境,只是给自己备份参考查看,看过的人可以忽略这篇文章. 本文章大部分参考了:http://www.cnblogs ...

  9. Android开发快速入门(环境配置、Android Studio安装)

    Android是一种激动人心的开源移动平台,它像手机一样无处不在,得到了Google以及其他一些开放手机联盟成员(如三星.HTC.中国移动.Verizon和AT&T等)的支持,因而不能不加以学 ...

随机推荐

  1. Java 多线程 socket 取款例子 runnable callable

    socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...

  2. Qt多线程编程总结(二)——QMutex

    QMutex类提供的是线程之间的访问顺序化. QMutex的目的是保护一个对象.数据结构或者代码段,所以同一时间只有一个线程可以访问它.(在Java术语中,它和同步关键字“synchronized”很 ...

  3. C++模板:二分查找

    bool find(int x,int l,int r){ if(l>r)return false; int mid=(l+r)/2; if(s[mid]==x) return true; el ...

  4. HDOJ 1423 Greatest Common Increasing Subsequence(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1423 思路分析:[问题定义]给定两个序列A[0, 1,..., m]和B[0, 1, ..., n], ...

  5. JAVA面试中的几个重要基础问题

    1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...

  6. webscraping documentation — webscraping documentation

    webscraping documentation - webscraping documentation webscraping documentation¶ Introduction Backgr ...

  7. 自制的七个C,总结的太好了

    拿破仑·希尔把它叫做:“自制的七个C”: 1.控制自己的时间(Clock). 时间虽不断流逝,但也可以任人支配.你可以选择时间来工作.游戏.休息.烦恼..虽然客观的环境不一定能任人掌握,但人却可以自己 ...

  8. Jmeter接口測试

    一.创建project.引包 1.创建JAVAproject 2.引入Jmeter中lib\ext基础包:ApacheJMeter_java.jar.ApacheJMeter_core.jar 3.引 ...

  9. HDU4712+随机算法

    随机算法 求n个20位的2进制串的MinDist. Dist:两个串的异或结果中1的个数 /* 随机算法 */ #include<algorithm> #include<iostre ...

  10. Backbone入门教程

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...