AirPlay 协议 - 如何使用原始 PCM 而不是 ALAC
Posted
技术标签:
【中文标题】AirPlay 协议 - 如何使用原始 PCM 而不是 ALAC【英文标题】:AirPlay protocol - how to use raw PCM instead of ALAC 【发布时间】:2016-01-04 04:04:00 【问题描述】:我想使用 PCM 而不是 ALAC 将音频发送到兼容 AirPlay 的设备。设备。我使用的所有设备的 mDNS TXT 功能都至少有一个 cn=0 和一个 et=0,所以我假设我可以使用原始 PCM/L16 并且未加密。
但到目前为止,我发现的唯一文档仅在 ANNOUNCE RTSP 消息中提及 ALAC
宣布 rtsp://fe80::217:f2ff:fe0f:e0f6/3413821438 RTSP/1.0
CSeq: 3
内容类型:application/sdp
内容长度:348
用户代理: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】:您可以在 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;
【讨论】:
非常感谢您的回答,这是我目前正在使用的,但我正在跳跃,根据这些指南 nto.github.io/AirPlay.html 和 git.zx2c4.com/Airtunes2/about 我可以发送 pcm 帧而无需封装它们在 ALAC 中,特别是没有 ALAC 的非字节错位所需的丑陋的位级操作,这会在更温和的平台上导致大量 CPU 浪费以上是关于AirPlay 协议 - 如何使用原始 PCM 而不是 ALAC的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Microsoft Media Foundation 将原始 48khz/32 位 PCM 编码为 FLAC?
如何使用 FFmpeg (C/C++) 将原始 pcm_f32le 音频编码为 AAC 编码音频?