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的主要内容,如果未能解决你的问题,请参考以下文章

如何从原始字节重建 PCM 样本?

如何使用 Microsoft Media Foundation 将原始 48khz/32 位 PCM 编码为 FLAC?

如何解释 MP3 文件中的原始 pcm 数据

如何使用 FFmpeg (C/C++) 将原始 pcm_f32le 音频编码为 AAC 编码音频?

使用 Android SDK 从原始 PCM 数据创建 WAV 文件

如何从原始 16 位、44100 赫兹、立体声 PCM 获得正确的声音(立体声)