Android 开发 AirPlay Server
安卓上开发 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的更多相关文章
- Android开发 ADB server didn't ACK, failed to start daemon解决方案
有时候在打开ddms的时候,会看到adb会报如题的错误,解决方案是打开任务管理器,(ctrl+shift+esc),然后关掉adb.exe的进程,重启eclipse就ok了. 还有许多无良商家开发的垃 ...
- android 开发adb server is out of date 解决方案
查看到底是哪个端口给占用了 输入红色部分命令 C:\Users\xxxxxx>netstat -ano | findstr "5037" TCP 127.0.0.1:5 ...
- (转) Android开发性能优化简介
作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...
- mac os 下搭建android开发环境
mac os 下搭建android开发环境 周银辉 mac os 下搭建android环境比较方便, 如下几个步骤: 1,安装jdk 先搞清楚自己是否已经安装,在命令行下:java -version, ...
- 搭建Android开发环境。
1. 从 http://developer.android.com/intl/zh-cn/sdk/index.html 下载ADK 2. 点击SDK.Manager.exe, 遇到闪退的问题,一开始还 ...
- 【Bugly 技术干货】Android开发必备知识:为什么说Kotlin值得一试
1.Hello, Kotlin Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 1. ...
- react-native —— 在Windows下搭建React Native Android开发环境
在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...
- android开发环境搭建日记和嵌入式Android开发环境初探
非常感谢博客园的各位,按照你们的博文,还有利用百度和谷歌逐渐建立了android的开发环境,只是给自己备份参考查看,看过的人可以忽略这篇文章. 本文章大部分参考了:http://www.cnblogs ...
- Android开发快速入门(环境配置、Android Studio安装)
Android是一种激动人心的开源移动平台,它像手机一样无处不在,得到了Google以及其他一些开放手机联盟成员(如三星.HTC.中国移动.Verizon和AT&T等)的支持,因而不能不加以学 ...
随机推荐
- android手机关于google play商店闪退的解决办法
部分android手机没有安装google play商店,这个可以通过类似“机锋”.“360手机助手”等应用市场下载. 安装google play商店后,点击打开却一闪而过:这个问题是因为手机没有安装 ...
- Database SQL script automation management tools investigation
Recently researched about database SQL scripts auto management tools, recorded the results here. Res ...
- hihocoder #1260 : String Problem I
题目链接 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们有一个字符串集合S,其中有N个两两不同的字符串. 还有M个询问,每个询问给出一个字符串w,求有多少S中的 ...
- [LeetCode]题解(python):069-Sqrt(x)
题目来源: https://leetcode.com/problems/sqrtx/ 题意分析: 实现一个整型的开根. 题目思路: 利用牛顿迭代法可以求解.首先讲数据类型转成浮点数,然后选取初始值为n ...
- linux下挂载第二块硬盘
1.第一步:添加硬盘/新建分区(fdisk) a.查看当前系统所有硬盘及分区情况:fdisk -lb.在指定的硬盘(例:/dev/sda)上创建分区:fdisk /dev/sda , 根据提示进行下一 ...
- DropBox为什么一直那么红——靠用户体验,旗帜鲜明,它要保存的是你的重要随身资料,并且开放API
链接:http://www.zhihu.com/question/19705960/answer/71742127来源:知乎 看到这个问题竟然从11年答到现在,有趣的是这几年里国内云存储行业变化也是蛮 ...
- MySql学习笔记(转载)
. 数值类型 -- a. 整型 ---------- 类型 字节 范围(有符号位) tinyint 1字节 - ~ ...
- 未能加载文件或程序集“DAL”或其他的某一个依赖项,系统找不到指定的文件
针对这个问题我在敲VB.NET机房收费系统的时候总共出现了两次,第一次是在使用反射+抽象工厂的时候出现的,第二次是在使用VS2012自带的打包工具生成可执行文件执行exe文件的时候出现的.具体看下图: ...
- WiFi密码破解CDlinux
好了,先说下提前要准备的东东吧:1.U盘一枚,最小1G空间.需进行格式化操作,提前保存内部文件.2.CDlinux镜像.帖子最后会提供一枚8月最新修改版,共135M. 1.CDlinux U盘启动 ...
- Android中图片处理相关问题
在Android的开发中,我们经常回去处理一些图片相关的问题,比如当加载图片到内存中产生的OOM(OutOfMemory)异常.图片加载到内存中占多大内存的问题.jpg png两种常见的图片的原理及区 ...