【Android 音視頻開發(fā)打怪升級:音視頻硬解碼篇】一浸船、音視頻基礎(chǔ)知識

開篇

炙手可熱,望而生畏的音視頻開發(fā)

時至今日卵渴,短視頻App可謂是如日中天,一片興興向榮鲤竹。隨著短視頻的興起浪读,音視頻開發(fā)也越來越受到重視,但是由于音視頻開發(fā)涉及知識面比較廣辛藻,入門門檻相對較高碘橘,讓許許多多開發(fā)者望而生畏。

為什么寫這一系列博文

雖然網(wǎng)上有很多的博文總結(jié)了音視頻打怪升級的路線吱肌,但是音視頻開發(fā)相關(guān)的知識都相對獨立痘拆,有講“音視頻解碼相關(guān)”的,有講“OpenGL相關(guān)”的氮墨,也有講“FFmpeg相關(guān)的”纺蛆,但是對于新手來說,把所有的知識銜接串聯(lián)起來规揪,并很好的理解所有的知識桥氏,卻是非常困難的。

本人在學(xué)習(xí)音視頻開發(fā)的過程中猛铅,深刻體會到了由于知識的分散字支,過渡斷層帶來的種種困惑和痛苦,因此,希望通過自己的理解祥款,可以把音視頻開發(fā)相關(guān)的知識總結(jié)出來,并形成系列文章月杉,循序漸進刃跛,剖析各個環(huán)節(jié),一則對自己所學(xué)做一個總結(jié)和鞏固苛萎,二則希望可以幫助想入門音視頻開發(fā)的開發(fā)者小伙伴們桨昙。

【聲 明】

首先,這一系列文章均基于自己的理解和實踐腌歉,可能有不對的地方蛙酪,歡迎大家指正。
其次翘盖,這是一個入門系列桂塞,涉及的知識也僅限于夠用,深入的知識網(wǎng)上也有許許多多的博文供大家學(xué)習(xí)了馍驯。
最后阁危,寫文章過程中,會借鑒參考其他人分享的文章汰瘫,會在文章最后列出狂打,感謝這些作者的分享。

碼字不易混弥,轉(zhuǎn)載請注明出處趴乡!

教程代碼:【Github傳送門

目錄

一、Android音視頻硬解碼篇:
二粟瞬、使用OpenGL渲染視頻畫面篇
三辛慰、Android FFmpeg音視頻解碼篇
  • 1区匠,F(xiàn)Fmpeg so庫編譯
  • 2,Android 引入FFmpeg
  • 3,Android FFmpeg視頻解碼播放
  • 4驰弄,Android FFmpeg+OpenSL ES音頻解碼播放
  • 5麻汰,Android FFmpeg+OpenGL ES播放視頻
  • 6,Android FFmpeg簡單合成MP4:視屏解封與重新封裝
  • 7戚篙,Android FFmpeg視頻編碼

本文你可以了解到

作為開篇的文章五鲫,我們先來看看音視頻由什么構(gòu)成的,以及一些常見的術(shù)語和概念岔擂。

一位喂、視頻是什么?

動畫書

不知道大家小時候是否玩過一種動畫小人書乱灵,連續(xù)翻動的時候塑崖,小人書的畫面就會變成一個動畫,類似現(xiàn)在的gif格式圖片痛倚。

動畫書:來源網(wǎng)絡(luò)

本來是一本靜態(tài)的小人書规婆,通過翻動以后,就會變成一個有趣的小動畫蝉稳,如果畫面夠多聋呢,翻動速度夠快的話,這其實就是一個小視頻颠区。

而視頻的原理正是如此削锰,由于人類眼睛的特殊結(jié)構(gòu),畫面快速切換時毕莱,畫面會有殘留器贩,感覺起來就是連貫的動作。所以朋截,視頻就是由一系列圖片構(gòu)成的蛹稍。

視頻幀

幀,是視頻的一個基本概念部服,表示一張畫面唆姐,如上面的翻頁動畫書中的一頁,就是一幀廓八。一個視頻就是由許許多多幀組成的奉芦。

幀率

幀率,即單位時間內(nèi)幀的數(shù)量剧蹂,單位為:幀/秒 或fps(frames per second)声功。如動畫書中,一秒內(nèi)包含多少張圖片宠叼,圖片越多先巴,畫面越順滑,過渡越自然。

幀率的一般以下幾個典型值:

24/25 fps:1秒 24/25 幀伸蚯,一般的電影幀率摩渺。

30/60 fps:1秒 30/60 幀,游戲的幀率剂邮,30幀可以接受摇幻,60幀會感覺更加流暢逼真。

85 fps以上人眼基本無法察覺出來了抗斤,所以更高的幀率在視頻里沒有太大意義囚企。

色彩空間

這里我們只講常用到的兩種色彩空間丈咐。

  • RGB

RGB的顏色模式應(yīng)該是我們最熟悉的一種瑞眼,在現(xiàn)在的電子設(shè)備中應(yīng)用廣泛。通過R G B三種基礎(chǔ)色棵逊,可以混合出所有的顏色伤疙。

  • YUV

這里著重講一下YUV,這種色彩空間并不是我們熟悉的辆影。這是一種亮度與色度分離的色彩格式徒像。

早期的電視都是黑白的,即只有亮度值蛙讥,即Y锯蛀。有了彩色電視以后,加入了UV兩種色度次慢,形成現(xiàn)在的YUV旁涤,也叫YCbCr。

Y:亮度迫像,就是灰度值劈愚。除了表示亮度信號外,還含有較多的綠色通道量闻妓。

U:藍色通道與亮度的差值菌羽。

V:紅色通道與亮度的差值。

采用YUV有什么優(yōu)勢呢由缆?

人眼對亮度敏感注祖,對色度不敏感,因此減少部分UV的數(shù)據(jù)量均唉,人眼卻無法感知出來氓轰,這樣可以通過壓縮UV的分辨率,在不影響觀感的前提下浸卦,減小視頻的體積署鸡。

RGB和YUV的換算
Y = 0.299R + 0.587G + 0.114B 
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
——————————————————
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

二、音頻是什么?

音頻數(shù)據(jù)的承載方式最常用的是脈沖編碼調(diào)制靴庆,即PCM时捌。

在自然界中,聲音是連續(xù)不斷的炉抒,是一種模擬信號奢讨,那怎樣才能把聲音保存下來呢?那就是把聲音數(shù)字化焰薄,即轉(zhuǎn)換為數(shù)字信號拿诸。

我們知道聲音是一種波,有自己的振幅和頻率塞茅,那么要保存聲音亩码,就要保存聲音在各個時間點上的振幅。

而數(shù)字信號并不能連續(xù)保存所有時間點的振幅野瘦,事實上描沟,并不需要保存連續(xù)的信號,就可以還原到人耳可接受的聲音鞭光。

根據(jù)奈奎斯特采樣定理:為了不失真地恢復(fù)模擬信號吏廉,采樣頻率應(yīng)該不小于模擬信號頻譜中最高頻率的2倍。

根據(jù)以上分析惰许,PCM的采集步驟分為以下步驟:

模擬信號->采樣->量化->編碼->數(shù)字信號

音頻采樣
采樣率和采樣位數(shù)

采樣率席覆,即采樣的頻率。

上面提到汹买,采樣率要大于原聲波頻率的2倍佩伤,人耳能聽到的最高頻率為20kHz,所以為了滿足人耳的聽覺要求卦睹,采樣率至少為40kHz畦戒,通常為44.1kHz,更高的通常為48kHz结序。

采樣位數(shù)障斋,涉及到上面提到的振幅量化。波形振幅在模擬信號上也是連續(xù)的樣本值徐鹤,而在數(shù)字信號中垃环,信號一般是不連續(xù)的,所以模擬信號量化以后返敬,只能取一個近似的整數(shù)值遂庄,為了記錄這些振幅值,采樣器會采用一個固定的位數(shù)來記錄這些振幅值劲赠,通常有8位涛目、16位秸谢、32位。

位數(shù) 最小值 最大值
8 0 255
16 -32768 32767
32 -2147483648 2147483647

位數(shù)越多霹肝,記錄的值越準確估蹄,還原度越高。

最后就是編碼了沫换。由于數(shù)字信號是由0臭蚁,1組成的,因此讯赏,需要將幅度值轉(zhuǎn)換為一系列0和1進行存儲垮兑,也就是編碼,最后得到的數(shù)據(jù)就是數(shù)字信號:一串0和1組成的數(shù)據(jù)漱挎。

整個過程如下:

聲道數(shù)

聲道數(shù)系枪,是指支持能不同發(fā)聲(注意是不同聲音)的音響的個數(shù)。

單聲道:1個聲道
雙聲道:2個聲道
立體聲道:默認為2個聲道
立體聲道(4聲道):4個聲道

碼率

碼率识樱,是指一個數(shù)據(jù)流中每秒鐘能通過的信息量嗤无,單位bps(bit per second)

碼率 = 采樣率 * 采樣位數(shù) * 聲道數(shù)

三震束、為什么要編碼

這里的編碼和上面音頻中提到的編碼不是同個概念怜庸,而是指壓縮編碼

我們知道垢村,在計算機的世界中割疾,一切都是0和1組成的,音頻和視頻數(shù)據(jù)也不例外嘉栓。由于音視頻的數(shù)據(jù)量龐大宏榕,如果按照裸流數(shù)據(jù)存儲的話,那將需要耗費非常大的存儲空間侵佃,也不利于傳送麻昼。而音視頻中,其實包含了大量0和1的重復(fù)數(shù)據(jù)馋辈,因此可以通過一定的算法來壓縮這些0和1的數(shù)據(jù)抚芦。

特別在視頻中,由于畫面是逐漸過渡的迈螟,因此整個視頻中叉抡,包含了大量畫面/像素的重復(fù),這正好提供了非常大的壓縮空間答毫。

因此褥民,編碼可以大大減小音視頻數(shù)據(jù)的大小,讓音視頻更容易存儲和傳送洗搂。

四消返、視頻編碼

視頻編碼格式

視頻編碼格式有很多载弄,比如H26x系列和MPEG系列的編碼,這些編碼格式都是為了適應(yīng)時代發(fā)展而出現(xiàn)的撵颊。

其中侦锯,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯(lián)盟主導(dǎo)

MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導(dǎo)。

當然秦驯,他們也有聯(lián)合制定的編碼標準尺碰,那就是現(xiàn)在主流的編碼格式H264,當然還有下一代更先進的壓縮編碼標準H265译隘。

H264編碼簡介

H264是目前最主流的視頻編碼標準亲桥,所以我們后續(xù)的文章中主要以該編碼格式為基準。

H264由ITU和MPEG共同定制固耘,屬于MPEG-4第十部分內(nèi)容题篷。

由于H264編碼算法十分復(fù)雜,不是一時半刻能夠講清楚的厅目,也不在本人目前的能力范圍內(nèi)番枚,所以這里只簡單介紹在日常開發(fā)中需要了解到的概念。實際上损敷,視頻的編碼和解碼部分通常由框架(如Android硬解/FFmpeg)完成葫笼,一般的開發(fā)者并不會接觸到。

  • 視頻幀

我們已經(jīng)知道拗馒,視頻是由一幀一幀畫面構(gòu)成的路星,但是在視頻的數(shù)據(jù)中,并不是真正按照一幀一幀原始數(shù)據(jù)保存下來的(如果這樣诱桂,壓縮編碼就沒有意義了)洋丐。

H264會根據(jù)一段時間內(nèi),畫面的變化情況挥等,選取一幀畫面作為完整編碼友绝,下一幀只記錄與上一幀完整數(shù)據(jù)的差別,是一個動態(tài)壓縮的過程肝劲。

在H264中迁客,三種類型的幀數(shù)據(jù)分別為

I幀:幀內(nèi)編碼幀。就是一個完整幀涡相。

P幀:前向預(yù)測編碼幀哲泊。是一個非完整幀,通過參考前面的I幀或P幀生成催蝗。

B幀:雙向預(yù)測內(nèi)插編碼幀切威。參考前后圖像幀編碼生成。B幀依賴其前最近的一個I幀或P幀及其后最近的一個P幀丙号。

  • 圖像組:GOP和關(guān)鍵幀:IDR

全稱:Group of picture先朦。指一組變化不大的視頻幀缰冤。

GOP的第一幀成為關(guān)鍵幀:IDR

IDR都是I幀,可以防止一幀解碼出錯喳魏,導(dǎo)致后面所有幀解碼出錯的問題棉浸。當解碼器在解碼到IDR的時候,會將之前的參考幀清空刺彩,重新開始一個新的序列迷郑,這樣,即便前面一幀解碼出現(xiàn)重大錯誤创倔,也不會蔓延到后面的數(shù)據(jù)中嗡害。

注:關(guān)鍵幀都是I幀,但是I幀不一定是關(guān)鍵幀

  • DTS與PTS

DTS全稱:Decoding Time Stamp畦攘。標示讀入內(nèi)存中數(shù)據(jù)流在什么時候開始送入解碼器中進行解碼霸妹。也就是解碼順序的時間戳。

PTS全稱:Presentation Time Stamp知押。用于標示解碼后的視頻幀什么時候被顯示出來叹螟。

在沒有B幀的情況下,DTS和PTS的輸出順序是一樣的台盯,一旦存在B幀罢绽,PTS和DTS則會不同。

  • 幀的色彩空間

前面我們介紹了RGB和YUV兩種圖像色彩空間爷恳。H264采用的是YUV有缆。

YUV存儲方式分為兩大類:planar 和 packed象踊。

planar:先存儲所有Y温亲,緊接著存儲所有U,最后是V杯矩;
packed:每個像素點的 Y栈虚、U、V 連續(xù)交叉存儲史隆。

planar如下:

YUV Planar

packed如下:

YUV Packed

不過pakced存儲方式已經(jīng)非常少用魂务,大部分視頻都是采用planar存儲方式。

上面說過泌射,由于人眼對色度敏感度低粘姜,所以可以通過省略一些色度信息,即亮度共用一些色度信息熔酷,進而節(jié)省存儲空間孤紧。因此,planar又區(qū)分了以下幾種格式: YUV444拒秘、 YUV422号显、YUV420臭猜。

YUV 4:4:4采樣,每一個Y對應(yīng)一組UV分量押蚤。

YUV 4:2:2采樣蔑歌,每兩個Y共用一組UV分量。

YUV 4:2:0采樣揽碘,每四個Y共用一組UV分量次屠。

其中,最常用的就是YUV420雳刺。

  • YUV420格式存儲方式

YUV420屬于planar存儲方式帅矗,但是又分兩種類型:

YUV420P:三平面存儲。數(shù)據(jù)組成為YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)煞烫。

YUV420SP:兩平面存儲浑此。分為兩種類型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)

關(guān)于H264的編碼算法和數(shù)據(jù)結(jié)構(gòu),涉及的知識和篇幅很多(如網(wǎng)絡(luò)抽象層NAL滞详、SPS凛俱、PPS),本文不再深入細說料饥,網(wǎng)上也有比較多的教程講解蒲犬,有興趣可以自行深入學(xué)習(xí)。

入門理解H264編碼

五岸啡、音頻編碼

音頻編碼格式

原始的PCM音頻數(shù)據(jù)也是非常大的數(shù)據(jù)量原叮,因此也需要對其進行壓縮編碼。

和視頻編碼一樣巡蘸,音頻也有許多的編碼格式奋隶,如:WAV、MP3悦荒、WMA唯欣、APE、FLAC等等搬味,音樂發(fā)燒友應(yīng)該對這些格式非常熟悉境氢,特別是后兩種無損壓縮格式。

但是碰纬,我們今天的主角不是他們萍聊,而是另外一個叫AAC的壓縮格式。

AAC是新一代的音頻有損壓縮技術(shù)悦析,一種高壓縮比的音頻壓縮算法寿桨。在MP4視頻中的音頻數(shù)據(jù),大多數(shù)時候都是采用AAC壓縮格式她按。

AAC編碼簡介

AAC格式主要分為兩種:ADIF牛隅、ADTS炕柔。

ADIF:Audio Data Interchange Format。 音頻數(shù)據(jù)交換格式媒佣。這種格式的特征是可以確定的找到這個音頻數(shù)據(jù)的開始匕累,不需進行在音頻數(shù)據(jù)流中間開始的解碼,即它的解碼必須在明確定義的開始處進行默伍。這種格式常用在磁盤文件中欢嘿。

ADTS:Audio Data Transport Stream。 音頻數(shù)據(jù)傳輸流也糊。這種格式的特征是它是一個有同步字的比特流炼蹦,解碼可以在這個流中任何位置開始。它的特征類似于mp3數(shù)據(jù)流格式狸剃。

ADTS可以在任意幀解碼掐隐,它每一幀都有頭信息。ADIF只有一個統(tǒng)一的頭钞馁,所以必須得到所有的數(shù)據(jù)后解碼虑省。且這兩種的header的格式也是不同的,目前一般編碼后的都是ADTS格式的音頻流僧凰。

ADIF數(shù)據(jù)格式:

header raw_data

ADTS 一幀 數(shù)據(jù)格式(中間部分探颈,左右省略號為前后數(shù)據(jù)幀):

ADTS

AAC內(nèi)部結(jié)構(gòu)也不再贅述,可以參考AAC 文件解析及解碼流程

六训措、音視頻容器

細心的讀者可能已經(jīng)發(fā)現(xiàn)伪节,前面我們介紹的各種音視頻的編碼格式,沒有一種是我們平時使用到的視頻格式绩鸣,比如:mp4怀大、rmvb、avi全闷、mkv叉寂、mov...

沒錯,這些我們熟悉的視頻格式总珠,其實是包裹了音視頻編碼數(shù)據(jù)的容器,用來把以特定編碼標準編碼的視頻流和音頻流混在一起勘纯,成為一個文件局服。

例如:mp4支持H264、H265等視頻編碼和AAC驳遵、MP3等音頻編碼淫奔。

mp4是目前最流行的視頻格式,在移動端堤结,一般將視頻封裝為mp4格式唆迁。

七鸭丛、硬解碼和軟解碼

硬解和軟解的區(qū)別

我們在一些播放器中會看到,有硬解碼和軟解碼兩種播放形式給我們選擇唐责,但是我們大部分時候并不能感覺出他們的區(qū)別鳞溉,對于普通用戶來說,只要能播放就行了鼠哥。

那么他們內(nèi)部究竟有什么區(qū)別呢熟菲?

在手機或者PC上,都會有CPU朴恳、GPU或者解碼器等硬件抄罕。通常,我們的計算都是在CPU上進行的于颖,也就是我們軟件的執(zhí)行芯片呆贿,而GPU主要負責(zé)畫面的顯示(是一種硬件加速)。

所謂軟解碼森渐,就是指利用CPU的計算能力來解碼榨崩,通常如果CPU的能力不是很強的時候,一則解碼速度會比較慢章母,二則手機可能出現(xiàn)發(fā)熱現(xiàn)象母蛛。但是,由于使用統(tǒng)一的算法乳怎,兼容性會很好彩郊。

硬解碼,指的是利用手機上專門的解碼芯片來加速解碼蚪缀。通常硬解碼的解碼速度會快很多秫逝,但是由于硬解碼由各個廠家實現(xiàn),質(zhì)量參差不齊询枚,非常容易出現(xiàn)兼容性問題违帆。

Android平臺的硬解碼

終于來到有關(guān)Android的部分了,作為本文的結(jié)尾金蜀,也算是為下一篇文章開一個頭刷后。

MediaCodec 是Android 4.1(api 16)版本引入的編解碼接口,是所有想在Android上開發(fā)音視頻的開發(fā)人員繞不開的坑渊抄。

由于Android碎片化嚴重尝胆,雖然經(jīng)過多年的發(fā)展,Android硬解已經(jīng)有了很大改觀护桦,但實際上各個廠家實現(xiàn)不同含衔, 還是會有一些意想不到的坑。

相對于FFmpeg,Android原生硬解碼還是相對容易入門一些贪染,所以接下來缓呛,我將會從MediaCodec入手,講解如何實現(xiàn)視頻的編解碼杭隙,以及引入OpenGL實現(xiàn)對視頻的編輯哟绊,最后才引入FFmpeg來實現(xiàn)軟解,算是一個比較常規(guī)的音視頻開發(fā)入門流程吧寺渗。

參考文章

音視頻開發(fā)基礎(chǔ)知識

YUV顏色編碼解析

YUV數(shù)據(jù)格式

音頻基礎(chǔ)知識

AAC 文件解析及解碼流程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載匿情,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末信殊,一起剝皮案震驚了整個濱河市炬称,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涡拘,老刑警劉巖玲躯,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鳄乏,居然都是意外死亡跷车,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門橱野,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朽缴,“玉大人,你說我怎么就攤上這事水援∶芮浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵蜗元,是天一觀的道長或渤。 經(jīng)常有香客問我,道長奕扣,這世上最難降的妖魔是什么薪鹦? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮惯豆,結(jié)果婚禮上池磁,老公的妹妹穿的比我還像新娘。我一直安慰自己循帐,他們只是感情好框仔,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拄养,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘪匿,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天跛梗,我揣著相機與錄音,去河邊找鬼棋弥。 笑死核偿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的顽染。 我是一名探鬼主播漾岳,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粉寞!你這毒婦竟也來了尼荆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唧垦,失蹤者是張志新(化名)和其女友劉穎捅儒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體振亮,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡巧还,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坊秸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麸祷。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褒搔,靈堂內(nèi)的尸體忽然破棺而出阶牍,到底是詐尸還是另有隱情,我是刑警寧澤站超,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布荸恕,位于F島的核電站,受9級特大地震影響死相,放射性物質(zhì)發(fā)生泄漏融求。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一算撮、第九天 我趴在偏房一處隱蔽的房頂上張望生宛。 院中可真熱鬧,春花似錦肮柜、人聲如沸陷舅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萝毛。三九已至,卻和暖如春嚷掠,著一層夾襖步出監(jiān)牢的瞬間妒潭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓琳彩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親部凑。 傳聞我的和親對象是個殘疾皇子露乏,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容