You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

移动开发者技术咨询:Android设备向Shairport Sync服务器投射音乐的实现方法及示例代码获取

嘿,作为同是移动开发者的人,我完全懂你想在Android上实现AirPlay音乐投射的需求!先直接给你明确答案:Android设备是可以将音乐投射到AirPlay服务的,不过原生Android系统并没有内置AirPlay的发送支持,得靠第三方实现或者自己动手撸协议~

Android设备投射音乐到AirPlay服务的解决方案

关于可行性说明

你用Shairport Sync搭建的是AirPlay接收端(模拟AirPlay音箱),而Android端需要的是AirPlay发送端的实现——原生Android没有这个功能,但通过实现AirPlay的核心协议(RAOP+RTSP),或者借助开源库,完全能搞定这个需求。

寻找发送端代码/示例的靠谱方向

1. 借助开源的Android AirPlay发送库

已经有开发者实现了Android上的AirPlay发送功能,你可以在代码托管平台搜索关键词比如「Android AirPlay sender」「RAOP Android」,能找到不少包含完整流程的项目:从mDNS发现AirPlay设备、建立RTSP连接,到音频编码传输的逻辑都有现成实现,省得自己从零开始撸协议。

2. 手动实现核心协议

如果想自己掌控整个流程,AirPlay音频传输的核心是RAOP(Real-Time Audio Over Protocol),上层用RTSP做控制,核心步骤大概是:

  • 通过mDNS发现局域网内的Shairport Sync设备(它会主动广播AirPlay服务)
  • 与设备建立RTSP连接,完成握手、认证(如果你的Shairport Sync开启了认证的话)
  • 将本地音频编码为ALAC或AAC格式(AirPlay常用的编码标准)
  • 通过RAOP的UDP/TCP通道把音频流发送到服务器

简单的代码框架示例

这里给你一个基础的流程框架(替换你之前的占位代码),仅作逻辑示意,实际需要补充协议细节:

// 示例为流程框架,需补充RTSP握手、音频编码等完整实现
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class AirPlaySender {
    private DatagramSocket raopSocket;
    private InetAddress serverAddress;
    private int raopPort;

    // 初始化与Shairport Sync的连接
    public void setupAirPlayConnection(String serverIp, int port) throws Exception {
        serverAddress = InetAddress.getByName(serverIp);
        raopPort = port;
        raopSocket = new DatagramSocket();
        // 此处需实现RTSP握手逻辑:发送OPTIONS、ANNOUNCE等请求完成认证与会话建立
    }

    // 开始音频投射
    public void startStreamingAudio() {
        // 1. 配置音频录制/读取参数
        int sampleRate = 44100;
        int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
        
        AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                sampleRate, channelConfig, audioFormat, bufferSize);
        
        byte[] buffer = new byte[bufferSize];
        audioRecord.startRecording();
        
        // 2. 读取音频并通过RAOP发送
        while (true) {
            int bytesRead = audioRecord.read(buffer, 0, buffer.length);
            if (bytesRead > 0) {
                // 此处需将PCM编码为ALAC/AAC格式,再封装成RAOP数据包发送
                // raopSocket.send(new DatagramPacket(buffer, bytesRead, serverAddress, raopPort));
            }
        }
    }
}

额外小提示

  • 如果你用Shairport Sync的默认配置,它会通过mDNS广播服务,Android端可以用NsdManager自动发现设备,不用手动输入IP地址。
  • 注意Shairport Sync支持AirPlay 1和部分AirPlay 2功能,实现时要对应匹配协议版本。

内容的提问来源于stack exchange,提问作者Shadow23548

火山引擎 最新活动