AirPlay协议 - 如何使用原始PCM而不是ALAC

时间:2016-01-04 04:04:01

标签: rtsp rtp airplay

我想使用PCM代替ALAC将音频发送到兼容的AirPlay。设备。我使用的设备在mDNS TXT功能中至少有一个cn = 0和et = 0,所以我假设我可以使用原始PCM / L16和未加密。

但到目前为止,我发现的唯一文档仅在ANNOUNCE RTSP消息中提到了ALAC

ANNOUNCE rtsp:// fe80 :: 217:f2ff:fe0f:e0f6 / 3413821438 RTSP / 1.0

CSeq:3

Content-Type:application / sdp

内容长度:348

User-Agent:iTunes / 10.6(Macintosh; Intel Mac OS X 10.7.3)AppleWebKit / 535.18.5

客户 - 实例:56B29BB6CB904862

V = 0

o = iTunes 3413821438 0 IN IP4 fe80 :: 217:f2ff:fe0f:e0f6

S = iTunes的

c = IN IP4 fe80 :: 5a55:caff:fe1a:e187

t = 0 0

m =音频0 RTP / AVP 96

a = rtpmap:96 AppleLossless

a = fmtp:96 352 0 16 40 10 14 2 255 0 0 44100

使用PCM / L16时,我找不到m =和各种a =(rtmap和fmtp)选项应该指示的内容。我知道RTP数据包类型应该是0x0a,但后来会出现这种情况。将rtmap:96更改为rtmap:10不起作用,我也不知道fmtp应该设置什么

谢谢

1 个答案:

答案 0 :(得分:0)

您可以在ALAC数据包中发送未压缩的PCM

这就是JustePort的做法

private static byte [] EncodeALAC( byte [] buffer )
{
    // Frame size is set as 4096 samples, stereo
    BitBuffer bitbuf = new BitBuffer( (4096 * 2 * 2) + 3 );

    bitbuf.WriteBits(1, 3);  // channels -- 0 mono, 1 stereo
    bitbuf.WriteBits(0, 4);  // unknown
    bitbuf.WriteBits(0, 12); // unknown
    bitbuf.WriteBits(0, 1);  // 'has size' flag
    bitbuf.WriteBits(0, 2);  // unknown
    bitbuf.WriteBits(1, 1);  // 'no compression' flag

    for( int i = 0; i < buffer.Length; i += 2 )
    {
        // endian swap 16 bit samples
        bitbuf.WriteBits(buffer[i+1], 8);
        bitbuf.WriteBits(buffer[i], 8);
    }

    return bitbuf.Buffer;
}