数字音频传输

1、数字音频传输的优点

传统的模拟音频传输存在信号损耗、电磁干扰和接地干扰等问题;而数字音频传输抗干扰能力强,整个系统的信噪比及失真与传输距离无关,保真度更高。

2、数字音频传输的发展

1.1 IEC 60958

IEC 60958标准包含AES3(IEC 60958 type I)与S/PDIF(IEC 60958 type II)。

1.1.1 AES3

AES3也称为AES/EBU,全称为Audio Engineering Society/European Broadcasting Union
(录音师协会/欧洲广播系统联盟) ,是由AES和EBU一起开发的数字音频传输标准,传输媒介有:

  1. 110欧姆屏蔽双绞线+XLR 3线接口
  2. 75欧姆同轴电缆+BNC接口(称为AES-3id,是AES3标准的一个子集)

1.1.2 S/PDIF

S/PDIF全称为Sony/Philips Digital Interconnect Format,Sony和Philips为主要设计者,是以AES3为基础针对消费级音频设备短距离传输场景设计的标准,可以使用成本较低的硬件实现数字信号传输。传输媒介有:

  1. 75欧姆同轴电缆+RCA接口
  2. 光纤传输+TOSLINK光纤接口。


    图1 AES/EBU与S/PDIF

1.2 AES10(也称为MADI)

AES3只能传输两通道数字音频,为了解决此问题,AES10被制订。AES10使用了多路时分复用技术,可以传输56通道(48kHz)或32(96kHz)24bit的数字音频信号。

1.3 AoIP(Audio over IP)

上述的格式都是点对点传输,存在以下缺点:

  1. 需要使用专用的接口和线缆,价格昂贵
  2. 只能传输音频信号,并需要专门的时钟源进行同步
  3. 只能点对点传输,应用间传输需要大量布线,难以管理,检修与操作都很麻烦

而AoIP成本低,部署简单,易于管理。
目前音频网络标准主要集中在OSI网络体系的第二层和第三层。

二层音频标准 三层音频标准
AES51 Ravenna
AVB Dante
Cobranet AES67
RAVE Q-Lan
Ethersound WheatNet-IP
REAC Livewire

第二层音频标准的弊端在于构建音频网络时需要专用的交换机,无法利用现有的以太网络,导致费用增加,限制了这类标准的使用范围。而第三层音频标准能让音频数据在标准的路由器中传输,从而大大提高了经济性。目前主流的音频网络标准为Dante、Ravenna和AES67。

1.3.1 Dante

Dante是Audinate公司开发的专利技术,是一个封闭式标准。其相位同步基于IEEE1588标准,采用Zeroconf协议。它的优势在于硬件工作稳定,大部分主流音频设备生产商都采用Dante。

1.3.2 Livewire

Livewire由Axia Audio公司开发,与Dante类似,Livewire是一个综合性的音频网络,除了音频,Livewire网络中还传输Livewire网络同步信号、控制信号、状态检测信号等。

1.3.3 AES67

由于上述的协议互不兼容,无法互通,限制了AoIP的发展,因此AES67被制订。AES67并不是要建立一种全新的标准,而是要在现有标准的基础上定义一个让不同类型协议互通的规范。目前Ravenna,Dante,Q-Lan,Liveware等协议均已实现对AES67的兼容。

1.3.4 Ravenna

Ravenna是一种免费开放的标准,无需专门进行标准认证。其整体架构与AES67类似,不过增加了更多选择。譬如采样率方面,Ravenna除了可以选择48kHz,还可以选择192kHz与384kHz;AES67规定荷载为PCM,而Ravenna还可以传输DSD/DXD码流。

技术标准 Dante Livewire+ AES67 Ravenna
研发公司 Audinate Telos/Axia AES Ravenna
同步协议 PTPv1 PTPv2 PTPv2 PTPv2
授权方式 销售统一的硬件和软件产品 授权Telos联盟旗下公司使用 技术标准 由RAVENNA授权免费使用
最小延时时间 小于150us 小于1ms 小于10ms 小于1ms
发现协议 Bonjour/SAP Axial Discovery SAP
Qos DiffServ DiffServ DiffServ DiffServ

3 AES67

AES67协议的目标是实现不同音频网络协议的互通,它仅关注传输部分。

图2 与Dante这类解决方案相比,AES67只关注传输部分

AES67对同步、媒体时钟、网络传输、编码、会话描述和连接管理方面做出了相应的规定,它包含3个现有的标准:PTP精确时钟协议RTP协议SDP协议

3.1 同步

3.1.1 为什么需要严格的时钟同步?

在AoIP中,时钟频率同步和相位同步是不同音频信号在不同设备间协同工作的前提。
温度(容易受cpu负载影响)、大气压与时钟振荡器的差异导致每个设备的时钟信号都会有一定量的偏差,这种偏差就会导致数字信号不精确,从而影响到音频的质量。
时钟恶化通常来自抖动与漂移。

3.1.1.1 抖动

图3 蓝色是理想的时钟信号,红色为发生抖动的时钟信号

抖动会引起数字信号的失真,如下图4所示:


图4 抖动导致波形发生形变

这种失真也被称为数字信号的相位噪声,它在高频信号上更加明显。抖动引起的失真会导致多声道的空间感丢失。

3.1.1.2 漂移

当设备间的时钟频率不一致(一个走得慢一个走得快)便会导致漂移。随着时间的推移,漂移导致的差异会变得越发显著,最终导致同步失败。同时,播放与采集设备间的时钟漂移也会导致AEC算法无法收敛。

3.1.2 如何实现时钟同步?

不同设备同步到一个公共时钟能确保所有流以相同速率采样和还原,同一速率的多个流可以被接受端轻易合成。在AES67中,通过PTP(IEEE 1588-2008)实现时钟频率和相位的同步。

  • 相位同步(Phase synchronization):信号之间的相位差恒为零
  • 频率同步(Frequency synchronization):信号之间保持恒定相位差


    图5 相位同步与频率同步

3.1.2.1 PTP基本概念

1、PTP域

我们将应用了PTP协议的网络称为PTP域。PTP域内有且只有一个同步时钟,域内的所有设备都与该时钟保持同步。

2、PTP端口

我们将设备上运行了PTP协议的端口称为PTP端口。如下面图6所示,PTP端口的角色可分为以下三种:

  • 主端口(Master Port):发布同步时间的端口,可存在于BC或OC上。
  • 从端口(Slave Port):接收同步时间的端口,可存在于BC或OC上。
  • 被动端口(Passive Port):既不接收同步时间、也不对外发布同步时间的端口,只存在于BC上。
3、时钟节点

PTP域中的节点称为时钟节点,PTP协议定义了以下三种类型的基本时钟节点:

  • OC(Ordinary Clock,普通时钟):该时钟节点在同一个PTP域内只有一个PTP端口参与相位同步,并通过该端口从上游时钟节点同步时间。此外,当时钟节点作为时钟源时,可以只通过一个PTP端口向下游时钟节点发布时间,我们也称其为OC。
  • BC(Boundary Clock,边界时钟):该时钟节点在同一个PTP域内拥有多个PTP端口参与相位同步。它通过其中一个端口从上游时钟节点同步时间,并通过其余端口向下游时钟节点发布时间。此外,当时钟节点作为时钟源时,可以通过多个PTP端口向下游时钟节点发布时间的,我们也称其为BC,如图6中的BC 1。
  • TC(Transparent clock,透明时钟):与BC/OC相比,BC/OC需要与其它时钟节点保持相位同步,而TC则不与其它时钟节点保持相位同步。TC有多个PTP端口,但它只在这些端口间转发PTP协议报文并对其进行转发延时校正,而不会通过任何一个端口同步时间。TC包括以下两种类型:
    • E2ETC(End-to-End Transparent Clock,端到端透明时钟):直接转发网络中非P2P(Peer-to-Peer,点到点)类型的协议报文,并参与计算整条链路的延时。
    • P2PTC(Peer-to-Peer Transparent Clock,点到点透明时钟):只直接转发Sync报文、Follow_Up报文和Announce报文,而终结其它PTP协议报文,并参与计算整条链路上每一段链路的延时。


      图6 时钟节点示意图
4、PTP域网络拓扑

PTP域有边界时钟和透传时钟两种组网模式。
边界时钟模式下的网络中间节点设备有多个1588端口,其中一个端口作为从时钟和上级时钟保持同步,其他端口则作为下一级网元的主时钟。设备收到1588v2报文之后进行终结,然后生成新的报文再向下游传递。


图7 边界时钟模式

透传时钟下的网络节点设备接收到来自时钟源的1588v2报文之后不进行终结,而是根据报文的驻留时间和链路时延,修正报文的时间戳信息,并将其传送给下游设备。


图8 透传时钟模式
  • 精度对比:边界时钟模式下,由于分组网络的不稳定性,中间节点不可能百分之百地恢复原始时钟,而是存在或多或少的误差,这样传递给下游的时钟就产生了漂移,并且这样的漂移还会随着跳数的增加而不断累积。而透传时钟模式下,中间节点只修正时延,对跳数并不敏感,故其理论上的精度高于边界时钟。然而在实际使用中,由于边界时钟模式下的漂移是不定向的,可能不断累积增大,也可能多个节点之间产生的漂移可能相互抵消,所以实际上两种模式的精度相当。
  • 性能对比:边界时钟模式下,BC交换机收到PTP信号后就作为时钟的边界以主钟Master方式将同步信号分散到下面链路上的终端设备中去,交换机完全承担了同步负载压力,顶层同步机的压力就会很小。在大规模系统中为确保上百个锁相终端的同步安全,BC交换机是首选。而透传时钟模式下,透传时钟交换机链接的所有终端都得透过交换机去和同步机锁相握手,当同步终端众多时同步机的负载压力加大会导致崩溃。
5、主从关系

主从关系(Master-Slave)是相对而言的,对于相互同步的一对时钟节点来说,存在如下主从关系:

  • 发布同步时间的节点称为主节点,而接收同步时间的节点则称为从节点。
  • 主节点上的时钟称为主时钟,而从节点上的时钟则称为从时钟。
  • 发布同步时间的端口称为主端口,而接收同步时间的端口则称为从端口。
6、最优时钟

如图6所示,PTP域中所有的时钟节点都按一定层次组织在一起,整个域的参考时间就是最优时钟(Grandmaster Clock,GM),即最高层次的时钟。通过各时钟节点间PTP协议报文的交互,最优时钟的时间最终将被同步到整个PTP域中,因此也称其为时钟源。
最优时钟可以通过手工配置静态指定,也可以通过BMC(Best Master Clock,最佳主时钟)协议动态选举。

手工配置指手动将目标节点的priority1值设置成最小,BMC算法首先比对信号发生器的priority1参数,谁的数值最小谁的PTP优先级就最高谁就是BMC最佳主时钟。

如果系统中存在多个priority1数值相同的GM时钟,那么交换机就进行动态BMC推举算法。
动态选举的过程:
1、各时钟节点之间通过交互的Announce报文中所携带的最优时钟优先级、时间等级、时间精度等信息,最终选出一个节点作为PTP域的最优时钟,与此同时,各节点之间的主从关系以及各节点上的主从端口也确定了下来。通过这个过程,整个PTP域中建立起了一棵无环路、全连通,并以最优时钟为根的生成树。
2、此后,主节点会定期发送Announce报文给从节点,如果在一段时间内,从节点没有收到主节点发来的Announce报文,便认为该主节点失效,于是重新进行最优时钟的选择。

7、PTP报文

PTP通过主从节点间交互报文,实现主从关系的建立、相位和频率同步。根据报文是否携带时间戳,可以将PTP报文分为两类,事件报文和通用报文。

  • 事件报文:时间概念报文,进出设备端口时打上精确的时间戳,PTP根据事件报文携带的时间戳,计算链路延迟。事件报文包含以下4种:Sync、Delay_Req、Pdelay_Req和Pdelay_Resp。
  • 通用报文:非时间概念报文,进出设备不会产生时间戳,用于主从关系的建立、时间信息的请求和通告。通用报文包含以下6种:Announce、Follow_Up、Delay_Resp、Pdelay_Resp_Follow_Up、Management和Signaling,目前设备不支持Management、Signaling报文。

3.1.2.2 PTP同步原理

PTP通过记录主从设备之间事件报文交换时产生的时间戳,计算出主从设备之间的路径延迟和时间偏移,实现主从设备之间的时间和频率同步,设备支持两种携带时间戳的模式,分别为:

  • 单步时钟模式(One step),指事件报文Sync和Pdelay_Resp带有本报文发送时刻的时间戳,报文发送和接收的同时也完成了时间信息的通告。
  • 两步时钟模式(Two step),指事件报文Sync和Pdelay_Resp不带有本报文发送时刻的时间戳,而分别由后续的通用报文Follow_Up和Pdelay_Resp_Follow_Up带上该Sync和PDelay_Resp报文的发送时间信息。两步时钟模式中,时间信息的产生和通告分两步完成,这样可以兼容一些不支持给事件报文打时间戳的设备。
1、频率同步

假设时钟节点A要同步到时钟节点B。不考虑路径延时和驻留时间的变化,如果A和B的时钟频率相等,则在相同的时间间隔内,A和B的时间累积的偏差应该是一样的,也就是说t_{2n}-t_{20}=t_{1n}-t_{10}。如果t_{2n}-t_{20}大于t_{1n}-t_{10},说明A的时钟频率比B快,要调慢A的时钟频率;如果t_{2n}-t_{20}小于t_{1n}-t_{10},说明A的时钟频率比B慢,则要调快A的时钟频率。(t_{1n}为B点的第n个Sync报文发送的时间,t_{2n}为A点接收第n个Sync报文的时间点。)

图9 Follow_Up报文为两步时钟模式发送的通用报文,携带Sync报文的发送时间戳
2、相位同步

PTP相位同步有两种延时测量机制:请求应答机制和端延时机制, 且这两种机制都以网络对称为前提。

请求应答机制(End to End)
图10 请求应答机制
  1. 主设备在时刻t_{1}发送Sync报文。如果主设备为one-step模式,t_{1}随Sync报文传送到从设备;如果主设备为two-step模式,则t_{1}在随后的Follow_Up报文中传送到从设备;
  2. 从设备在时刻t_{2}接收到Sync报文,并从Sync报文(one-step)或者Follow_Up报文(two-step)中获取t_{1}
  3. 从设备在时刻t_{3}发送延时请求报文Delay_Req给主设备。
  4. 主设备在时刻t_{4}接收到Delay_Req报文。
  5. 主设备随后通过延时回答报文Delay_Resp将t_{4}发送给从设备。

此时,从时钟便拥有了t_{1}t_{4}这四个时间戳,由此可计算出主、从时钟间的往返总延时为(t_{4}-t_{1})-(t_{3} - t_{2}),由于网络是对称的,所以主、从时钟间的单向延时为Delay=\frac{(t_{4}-t_{1})-(t_{3} - t_{2})}{2}t_{2}=t_{1}+Delay+Offset=t_{1}+\frac{(t_{4}-t_{1})-(t_{3} - t_{2})}{2}+Offset。 因此,从时钟相对于主时钟的时钟偏差为:Offset = \frac{(t_{2}-t_{1})+(t_{3} - t_{4})}{2}

图11 通过PTP协议计算出本地时钟和主时钟源的时间偏移,再修正本地时钟

端延时机制(Peer to Peer)

在端延时机制中,主设备依然会发送Sync和Follow_Up报文给从设备,从设备通过以下公式和主设备保持同步:
slave\, time=master\, time+network \, delay

从设备能通过Sync或Follow_Up报文获取master\, time,但它是如何得知网络延迟(network \, delay)的呢?

请求应答机制是在主从设备之间交换测量消息,从而计算出主从设备之间整体的路径延时时间,这些操作是在主从设备上完成,即使链路中的交换机不支持ptp也能正常运行,因此叫End to End。
而端延时机制是根据主从时钟之间的每一条链路延时时间计算时间差,要求链路中的交换机支持ptp(边界时钟节点或透明时钟节点),网络中的每台设备都会定期交换peer-delay测量信息,因此每台设备都知道到相邻设备的延迟,如下图12所示。

图12 每台设备都定期测量到相邻设备的延迟

通过peer-delay测量相邻设备间延迟的步骤如图13所示。
图13 peer-delay测量步骤

t_{1}是A节点发送Pdelay_Req消息的时间戳, t_{2}是B节点接收的时间戳,t_{3}是B节点发送Pdelay_Resp消息的时间戳,t_{4}是A节点接收的时间戳。计算单段链路延时的公式如下所示:
单段链路延时= \frac{(t_{2}-t_{1})+(t_{4} - t_{3})}{2}

通过上述步骤,A知道到B的链路延迟。B执行一次同样的步骤就能知道到A的延迟。
注意虽然peer-delay测量步骤和请求应答机制的测量步骤一样,但往往peer-delay结果的精度更高。因为两种方法都基于往返时间相同这一假设,peer-delay只测量一条链路的延迟,而且不存在队列,这个假设是成立的,而后者要测量主从设备之间整体的路径延时时间,往返时间则不一定相同,导致偏差较大。

PTP网络中链路延迟的非对称会导致同步误差,在用来补偿延迟非对称的方法中,最值得一提的是IEEE Std 1588的扩展版本,这种方法被称为白兔法(White Rabbit),由欧洲核子研究委员会(CERN)开发而成。
White Rabbit使用一根单模光纤连接主从节点,采用波分复用技术实现全双工通信,主节点发出的光的波长为1490 nm,从节点发出的光的波长为1310 nm。由于单根光纤里的往返链路长度完全一致,延时不对称性完全由不同波长的光在光纤中的折射率决定。因此利用光纤的非对称性系数,可以从往返光纤链路的延时精确计算出主从链路的单向延时

主从节点间每段链路的链路延时和TC驻留时间累计在Sync和Follow_Up报文的correction filed中,向下游传递。通过这种方式,从设备就可以得知网络延迟(network \, delay),并通过slave\, time=master\, time+network \, delay和主设备保持同步。

图14 P2P透明时钟在correction filed中累加报文的驻留时间和传输路径的时延

3、时间戳精度

在网络通讯过程中,被传递的信息要在发送端的本地协议栈中进行封装,从协议栈的顶层开始,每下降一层就将原有数据打包,增加包头、包尾信息,运算处理时间的不确定性导致栈内的滞留时间也有不确定性。要降低不确定性,需要尽可能的将时间戳获取点向协议栈的底层移动,时间戳的获取点越靠近传输介质,获取的发送和接收时间戳的精度就越高。


图15 可加盖时间戳的位置

系统各时钟对时时,如果没有硬件支持,只能达到亚毫秒级的同步精度;如果有专用硬件(如美国NS的DP83640 PHY芯片)支持时,可以达到亚微妙级的同步精度。

3.2 媒体时钟

AES67中发送端使用媒体时钟进行采样,接收端用它来播放媒体流。媒体时钟与网络时钟有固定关系。媒体时钟的速率应该和音频采样频率一致,媒体时钟在IEEE 1588 epoch时间点为0,每经过一个采样周期,媒体时钟的值加1。
AES67支持三种采样率,44.1kHz、48kHz和96kHz。

3.3 网络传输

AES67规定用RTP传输音频数据信息,用RTCP传输控制信息,用UDP传输RTP包。AES67不支持IP包分片,因此要控制包的大小不要超过MTU。

AES67要求支持通过多播传输音频流,为了避免多播引起的网络洪泛,所有AES67节点都需要支持IGMPv2。接收端通过IGMP请求接收多播数据,支持IGMP嗅探的交换机只会转发被请求的多播包到指定端口。发送端发送多播数据前需要通过IGMP请求接收自己要发送的多播数据,这样做并不会导致发送端收到自己发送的多播数据,这样做的原因是某些支持IGMP嗅探的交换机会将未被订阅的多播包转发到所有端口,引起网络洪泛。

3.4 Qos

AES67中的Qos指按优先级对数据包进行处理。本标准中,设备需要支持DiffServ,DiffServ用DSCP field在每个IP包的头部加上类型标记,因此IP包能按指定的优先级被处理。设备至少要支持三种通信类型,即时钟(Clock)、媒体(Media)、尽力而为(Best effort)。


图16 Qos类型和DiffServ类型的映射

3.5 编码

AES67支持的载荷格式包括L16和L24。L16是一种非压缩音频数据的编码格式。L24是L16的一种扩展。16位或24位非压缩音频数据采样值是以整形的二进制补码来表示的。
包时间指媒体包中的媒体数据实际持续时间。短的包时间虽然可以使延迟更低,但会引入开销。发送端和接受端应该支持一个或多个以下包时间,如125µs、250µs、333µs、1ms、4ms等。其中,1ms的包时间提供了最广泛的音频和网络设备间的互操作性以及兼容性。

3.6 会话描述

为了正确建立连接和处理音频数据,AES67节点需要一种方法获取流的信息,这种描述流的方法就是SDP,它包含流的多播地址、编码格式和音频数据包的描述(位宽、采样率、通道数、每个包的采样点数、参考时钟)。
虽然AES67清晰地规定了SDP的属性和支持的参数范围,但是标准有意排除了会话发现的规定(为了让更多厂商接受AES67,标准只聚焦于传输)。实际应用中设备可以通过Bonjour、SAP等方法实现会话发现。

参考文章
DRAFT REVISED AES67
Why is IEEE 1588 so accurate?
无压缩4K超高清EFP系统中PTP精确时钟同步技术解析
PTP简介
数字音频时钟、同步、抖动,以及他们对声音的影响
数字定时: 时钟信号、抖动、迟滞和眼图
PTP技术介绍
1588v2,是怎样实现时钟同步的?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容