我想使用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应该设置什么
谢谢
答案 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;
}