FFmpeg編譯和使用問題總結(jié)

一醋粟、背景

網(wǎng)上有很多FFmpeg編譯配置的資料训唱,大部分都是關(guān)于FFmpeg最新的版本(2.0)的,我一開始也想著編寫一個(gè)2.0版本的酗捌,可以放到接手的那個(gè)項(xiàng)目中,發(fā)現(xiàn)各種問題(無法快進(jìn)涌哲,沒有聲音),再看一下代碼一堆警告胖缤,原因很簡單,使用的FFMpeg庫太新了阀圾,很多接口變動(dòng)了哪廓。

二、FFmpeg最新版本的庫編譯

FFmpeg最新版本的應(yīng)該是2.1的初烘,歷史版本詳見http://www.ffmpeg.org/releases/涡真,在這個(gè)網(wǎng)站上我們可以下到所有歷史版本的庫。FFmpeg是一個(gè)跨平臺的用C語言寫成的庫肾筐,包含了編碼哆料,解碼,色彩空間轉(zhuǎn)換等庫吗铐。編譯需要用到命令行东亦,對于我們這些沒搞過后臺或者linux開發(fā)的腳本知識欠缺的人來說的確算是一個(gè)挑戰(zhàn)。

腳本地址: https://gist.github.com/m1entus/6983547

運(yùn)行這個(gè)腳本需要依賴一個(gè)庫Perl寫的腳本唬渗,搜了一下網(wǎng)上目前編譯FFmpeg庫的帖子基本都會(huì)提到這個(gè)腳本典阵,腳本地址如下: https://github.com/mansr/gas-preprocessor

下載完這兩個(gè)腳本后镊逝,編譯FFmpeg庫的準(zhǔn)備工作就基本完成了壮啊,接著依次執(zhí)行下面幾步:

  1. 拷貝gas-preprocessor.pl文件到 /usr/bin目錄下。
  2. 修改gas-preprocessor.pl文件的權(quán)限

注:需要有讀撑蒜,寫和執(zhí)行的權(quán)限他巨。具體操作為充坑,首先在命令行下進(jìn)入/usr/bin目錄减江,然后執(zhí)行chmod命令染突,如下圖所示:


  1. 切換build-ffmpeg.sh腳本的目錄下,使用命令sh build-ffmpeg.sh 運(yùn)行該腳本即可辈灼。
      注: 1) build-ffmpeg.sh腳本的父目錄的名字不能包括空格份企,否則可能導(dǎo)致構(gòu)建失敗。
        2) build-ffmpeg.sh腳本中可以配置編譯的FFMpeg版本巡莹,以及使用iOS SDK的版本司志,如下圖所示:



    該腳本中默認(rèn)采用的FFmpeg是2.0版本,使用iOS 7.0的SDK編譯降宅,c語言編譯器采用clang骂远,應(yīng)用中可以根據(jù)實(shí)際項(xiàng)目需要選中不同的FFmpeg和iOS SDK版本。

三腰根、編譯較早期版本的FFmpeg本庫

第二部分中我們介紹了一個(gè)牛逼的腳本激才,一鍵編譯,這給我們造成了一種錯(cuò)覺额嘿,F(xiàn)Fmpeg編譯不過如此嗎瘸恼!如果我們嘗試一下把腳本中的VERSION變成0.7試試,運(yùn)行腳本册养,發(fā)現(xiàn)編譯報(bào)錯(cuò)东帅。如下圖所示:



提示位置選項(xiàng)--disable-iconv,根據(jù)提示我們輸入./configure查看所有可用選項(xiàng)球拦。命令行下切換到實(shí)際的FFmpeg源碼目錄下靠闭,查看幫助如下圖:



我們可以看到很多選項(xiàng),英語不難坎炼,就是有些選項(xiàng)描述的太簡潔了愧膀,所以實(shí)際使用時(shí)如果不確定的話,我們可以去問問google点弯。

好了回過頭來看看這個(gè)configure文件到底有什么作用呢扇调?

1、裁剪

我們知道FFmpeg庫是一個(gè)非常龐大的庫抢肛,包括編碼狼钮,解碼以及流媒體的支持等,如果不做裁剪全部編譯進(jìn)來的話捡絮,最后生成的靜態(tài)庫會(huì)很大熬芜。實(shí)際使用中我們可能只想用到解碼(例如播放器),因此我們可以使用相關(guān)選項(xiàng)指定編譯時(shí)禁用編碼部分福稳。當(dāng)然我們還可以做進(jìn)一步的裁剪涎拉,例如只打開部分常用格式的解碼,禁用掉其他的解碼,這樣編譯出來的靜態(tài)庫將會(huì)更小鼓拧。

要想裁剪半火,我們的先知道有哪些部分,使用下面的命令可以查看FFMpeg庫支持的組件列表季俩。

--list-decoders          show all available decoders
--list-encoders          show all available encoders
--list-hwaccels          show all available hardware accelerators
--list-muxers            show all available muxers
--list-demuxers          show all available demuxers
--list-parsers           show all available parsers
--list-protocols         show all available protocols
--list-bsfs              show all available bitstream filters
--list-indevs            show all available input devices
--list-outdevs           show all available output devices
--list-filters           show all available filters

我們可以根據(jù)實(shí)際需要把不用的部分都禁用掉钮糖,這樣編譯快,包也會(huì)比較小酌住,常用的裁剪選項(xiàng)如下:

--disable-doc            do not build documentation
--disable-ffmpeg         disable ffmpeg build
--disable-ffplay         disable ffplay build
--disable-ffserver       disable ffserver build
--disable-network        disable network support [no]
--disable-encoder=NAME   disable encoder NAME
--enable-encoder=NAME    enable encoder NAME
--disable-encoders       disable all encoders
--disable-decoder=NAME   disable decoder NAME
--enable-decoder=NAME    enable decoder NAME
--disable-decoders       disable all decoders
--disable-hwaccel=NAME   disable hwaccel

舉個(gè)例子店归,如果我們需要做一款本地視頻播放器,那么我們可以使用如下配置:



當(dāng)然你還可以根據(jù)幫助列表進(jìn)行更細(xì)粒度的裁剪酪我,例如只支持哪幾種格式的解碼等等消痛。

2、指定編譯環(huán)境

FFMpeg作為一個(gè)跨平臺的庫都哭,不同的平臺秩伞,不同的人的計(jì)算機(jī)上編譯器的路徑都可能不盡相同,所以我們需要為編譯腳本指定編譯器的路徑质涛。同事我們還可以指定其他編譯選項(xiàng)稠歉,如是否交叉編譯,目標(biāo)平臺系統(tǒng)汇陆,CPU架構(gòu)怒炸,需要依賴的其他庫的路徑已經(jīng)指定是否禁用匯編優(yōu)化等。

--enable-cross-compile   assume a cross-compiler is used
--sysroot=PATH           root of cross-build tree
--sysinclude=PATH        location of cross-build system headers
--target-os=OS           compiler targets OS []
--cc=CC                  use C compiler CC [gcc]
--extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS []
--extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS []
--arch=ARCH              select architecture []
--cpu=CPU                select the minimum required CPU (affects
                         instruction selection, may crash on older CPUs)
--disable-asm            disable all assembler optimizations

sysroot即iOS SDK的路徑毡代,注意編譯真機(jī)版本的庫時(shí)需要使用iPhoneOS.platform中SDK的路徑阅羹,編譯模擬器版本的庫使用iPhoneSimulator.platform中SDK的路徑。target-os填寫darwin(蘋果系統(tǒng)的內(nèi)核)教寂,arch可以根據(jù)具體的情況添加i386(模擬器)捏鱼,armv6,armv7等酪耕。cpu根據(jù)具體類型可填寫cortex-a8导梆,cortox-a9,i386等迂烁。

3看尼、指定靜態(tài)庫的安裝路徑

指定執(zhí)行make install命令時(shí)編譯好的靜態(tài)庫和相關(guān)頭文件拷貝到的位置,即FFmpeg庫編譯后輸出的路徑盟步。通常我們只需要設(shè)置“--prefix=PREFIX”選項(xiàng)即可藏斩。例如我們需要將最后生成靜態(tài)庫的路徑指向“build/armv7”下,則設(shè)置--prefix="build/armv7";

四却盘、FFmpeg0.7版本庫一鍵編譯腳本

通過第三部分的介紹狰域,相信我們應(yīng)該對FFmpeg的配置都有了一個(gè)初步的認(rèn)識媳拴,我們再回到第三部分開始時(shí)我們運(yùn)行build-ffmpeg.sh的碰到的問題,經(jīng)過查看configure的幫助兆览,我們發(fā)現(xiàn)0.7這個(gè)版本的FFmpeg庫卻是沒有"--disable-iconv"選項(xiàng)屈溉。這個(gè)牛逼的腳本是針對當(dāng)前較新的FFmpeg庫寫的,在低版本中沒有一些配置選項(xiàng)也是正常拓颓。

下面給出經(jīng)過修改后的腳本语婴,腳本中對原先的腳本進(jìn)行了精簡,去掉了下載部分的代碼驶睦。

#!/bin/sh

########################################################################
##################### copyright by smileEvday ##########################
##################### smileEvday.cnblogs.com ###########################
########################################################################

# FFMpeg,SDK版本號
VERSION="0.7.4"
SDKVERSION="6.1"

#最低支持的SDK版本號
MINSDKVERSION="5.0"

# 源文件路徑
SRCDIR=$(pwd)
BUILDDIR="${SRCDIR}/build"
mkdir -p $BUILDDIR

# 獲取xcode開發(fā)環(huán)境安裝路徑
DEVELOPER=`xcode-select -print-path`

# 要編譯的架構(gòu)列表
ARCHS="armv7 armv7s i386"
for ARCH in ${ARCHS}
do
    if [ "${ARCH}" == "i386" ];
    then
        PLATFORM="iPhoneSimulator"
        EXTRA_CFLAGS="-arch i386"
        EXTRA_LDFLAGS="-arch i386 -mfpu=neon"
        EXTRA_CONFIG="--arch=i386 --cpu=i386"
    else
        PLATFORM="iPhoneOS"
        EXTRA_CFLAGS="-arch ${ARCH} -mfloat-abi=softfp"
        EXTRA_LDFLAGS="-arch ${ARCH} -mfpu=neon -mfloat-abi=softfp"
        EXTRA_CONFIG="--arch=arm --cpu=cortex-a9 --disable-armv5te"
    fi
    
    make clean

    # you can do any clip here 
    ./configure --prefix="${BUILDDIR}/${ARCH}"         \
                --disable-doc                         \
                --disable-ffmpeg                     \
                --disable-ffplay                     \
                --disable-ffserver                     \
                --enable-cross-compile                 \
                --enable-pic                         \
                --disable-asm                        \
                --target-os=darwin                     \
                ${EXTRA_CONFIG}                        \
                --cc="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/usr/bin/gcc"                                         \
                --as="/usr/bin/gas-preprocessor.pl"                                                                                \
                --sysroot="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk"                 \
                --extra-cflags="-miphoneos-version-min=${MINSDKVERSION} ${EXTRA_CFLAGS}"                                                        \
                --extra-ldflags="-miphoneos-version-min=${MINSDKVERSION} ${EXTRA_LDFLAGS} -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk"

    make && make install && make clean
     
done

########################################################################################################################
##################################################### 生成fat庫 #########################################################
########################################################################################################################
mkdir -p ${BUILDDIR}/universal/lib
cd ${BUILDDIR}/armv7/lib

for file in *.a
do

cd ${SRCDIR}/build
xcrun -sdk iphoneos lipo -output universal/lib/$file  -create -arch armv7 armv7/lib/$file -arch armv7s armv7s/lib/$file -arch i386 i386/lib/$file
echo "Universal $file created."

done
cp -r ${BUILDDIR}/armv7/include ${BUILDDIR}/universal/

echo "Done."

build-ffmpeg0.7

注:由于FFmpeg庫比較陳舊匿醒,該腳本使用xcode4.6下场航,編譯器為GCC,采用6.1的SDK進(jìn)行編譯廉羔。如果你的機(jī)器上裝的同事安裝了xcode4.x和xcode5的話溉痢,可以在命令行下使用如下命令切換當(dāng)前的默認(rèn)編譯環(huán)境為xcode4.6即可:



設(shè)置好xcode的編譯環(huán)境以后,只需要將該腳本拷貝到FFMpeg源文件路徑下運(yùn)行即可一鍵生成armv7憋他,armv7s孩饼,i386以及合成后的全平臺庫。

五竹挡、如何使用以及編譯鏈接中可能遇到的問題

第四部分中我們對build-ffmpeg.sh的腳本進(jìn)行了修改和精簡后得到了build-ffmpeg0.7.sh镀娶,我們只需要運(yùn)行該腳本就可以一鍵完成FFmpeg 0.7版本庫的編譯工作了。編譯后我們得到的是lib目錄(包含所有生成的靜態(tài)庫)以及include目錄(包含相應(yīng)的頭文件)揪罕,使用時(shí)我們只需要將這些文件添加到工程中即可梯码。

問題到這里似乎就全部解決了,如果順利的話好啰,恭喜你轩娶,你可以直接使用了。
如果你跟我一樣的"不幸"的話框往,可能還會(huì)遇到一些其他問題鳄抒。下面是我遇到的問題及解決辦法:

1、time.h重復(fù)問題

我們知道一般靜態(tài)庫都是搭配頭文件使用的椰弊,要在項(xiàng)目里面使用FFmpeg庫许溅,我們出了需要在xcode的build phases中添加靜態(tài)庫以外,還需要導(dǎo)入該庫對應(yīng)的頭文件男应。FFmpeg庫對應(yīng)的頭文件有很多闹司,通常會(huì)采用設(shè)置header search path的方式來導(dǎo)入頭文件,這樣做有兩個(gè)好處: 第一可以避免對我們的工程結(jié)構(gòu)造成干擾沐飘。第二可以在一定程序上降低頭文件沖突游桩。

time.h沖突的問題就是屬于頭文件沖突牲迫,系統(tǒng)的標(biāo)準(zhǔn)庫中有time.h文件,F(xiàn)Fmpeg應(yīng)該是在1.1之后也加入了一個(gè)time.h文件借卧,路徑為libavutil/time.h盹憎。所以如果你使用的是FFmpeg1.1之后的版本,那么在使用中就可能會(huì)碰到頭文件沖突的問題铐刘。解決這個(gè)問題陪每,網(wǎng)上流傳一個(gè)方法是修改FFmpeg庫中time.h文件的名字,我覺得這太麻煩了镰吵,而且也容易出錯(cuò)檩禾。后來查看FFmpeg源碼的時(shí)候偶然發(fā)現(xiàn)它自身內(nèi)部引用這個(gè)time.h的時(shí)候都有帶一層父目錄,如#include "libavutil/time.h"疤祭。因此想是不是通過指定頭文件搜索路徑就可以解決這個(gè)問題盼产。

打開工程設(shè)置頁面,搜索header search path如下圖所示:



如果你的FFmpeg庫正好是放在當(dāng)前的路徑下勺馆,且為了偷懶設(shè)置了遞歸包含頭文件的話戏售,那么你很可能就會(huì)遇到time.h沖突的問題。因?yàn)閤code工程默認(rèn)的設(shè)置是優(yōu)先查找用戶路徑草穆,編譯時(shí)FFmpeg中l(wèi)ibavutil下的time.h就會(huì)優(yōu)先被鏈接灌灾,從而導(dǎo)致不會(huì)再鏈接系統(tǒng)time.h文件,最終導(dǎo)致編譯失敗悲柱。

解決這個(gè)問題有兩個(gè)辦法:
  a锋喜、取消掉Header Search Paths中的遞歸引用。
  b诗祸、設(shè)置Always Search User Paths為NO跑芳。

2、gcc c compiletest error問題

xcode5下面編譯FFmpeg都采用clang直颅,同樣也會(huì)遇到類似問題博个。這個(gè)問題通常出現(xiàn)在配置文件錯(cuò)誤的情況下,一般都是gcc路徑錯(cuò)誤功偿,當(dāng)然也可能是其他編譯參數(shù)錯(cuò)誤問題盆佣。

出現(xiàn)這個(gè)問題我們應(yīng)該首先檢查gcc的路徑是否正確,如果確認(rèn)了指定路徑上存在gcc程序械荷,但是還是報(bào)錯(cuò)的共耍,我們再去檢查當(dāng)前要編譯的平臺和指定的gcc路徑是否一致,如果你使用iPhoneOS.platform下面的gcc去編譯i386平臺的庫那肯定是不會(huì)測試通過的吨瞎。

3痹兜、C compiler test failed問題

編譯i386版本的FFmpeg庫和armv版本庫可能用到的參數(shù)不盡相同,例如我遇到這個(gè)問題颤诀,我的編譯選項(xiàng)中有一項(xiàng)如下:

--extra-cflags='-arch i386 -mfloat-abi=softfp -miphoneos-version-min=5.0'

在我確認(rèn)其他參數(shù)(如cpu字旭,arch)都正確的情況下对湃,依然提示我們“C compiler test failed.” 后面緊跟著一句查看config.log你可以得到更詳細(xì)的信息,于是打開該文件遗淳,你可以在最開始的地方看到你的配置語句拍柒,如果是用腳本,這塊兒會(huì)顯示最終解釋后(替換參數(shù)為真實(shí)值)的配置語句屈暗。然后緊跟著一堆具體的配置拆讯,通常哭啼的錯(cuò)誤信息會(huì)在該文件的最末尾。我遇到的問題的信息如下:



看到標(biāo)紅的這個(gè)區(qū)域了沒有,提示“-mfloat-abi=softfp”選項(xiàng)不支持可缚,刪掉該選項(xiàng)后,在運(yùn)行時(shí)配置就通過了陕贮。其他配置問題,都可以通過查看config.log來獲取更詳細(xì)的錯(cuò)誤信息潘飘。

4、由于未導(dǎo)入libbz動(dòng)態(tài)庫的問題

如果導(dǎo)入FFmpeg庫了掉缺,并且配置了頭文件搜索路徑卜录,遇到"Undefined symbols for architecture armv7s: _BZ2_bzDecompressInit",如下圖所示:



這個(gè)問題是由于沒有導(dǎo)入“l(fā)ibbz2.dylib”庫的原因眶明,導(dǎo)入庫即可解決該問題艰毒。

5、libavcodec/audioconvert.h頭文件缺失問題

不知道為什么執(zhí)行make install的時(shí)候libavcodec中的audioconvert.h怎么沒有拷貝到include目錄下的libavcodec中去搜囱,查看發(fā)現(xiàn)原來libavutil目錄下已經(jīng)有一個(gè)audioconvert.h了丑瞧。解決這個(gè)問題只需要從FFmpeg庫的libavcodec中拷貝audioconvert.h頭文件到include的libavcodec目錄中即可解決。

六蜀肘、編譯腳本及參考資料
  1. 編譯腳本  
      gas-preprocessor腳本地址: https://github.com/mansr/gas-preprocessor  
      FFmpeg 2.x一鍵化編譯腳本: https://gist.github.com/m1entus/6983547
      FFmpeg0.7一鍵化編譯腳本: https://gist.github.com/smileEvday/7565260
  1. 參考資料
      模擬器與真機(jī)下ffmpeg的編譯方法(總結(jié)版)
      http://www.cocoachina.com/iphonedev/toolthain/2011/1020/3395.html
      編譯在ios4.3中使用的ffmpeg庫(轉(zhuǎn))
      http://www.cocoachina.com/bbs/simple/?t70887.html
      Installing ffmpeg ios libraries armv7, armv7s, i386 and universal on Mac with 10.8
      http://stackoverflow.com/questions/18003034/installing-ffmpeg-ios-libraries-armv7-armv7s-i386-and-universal-on-mac-with-10/19370679#19370679

參考:http://www.cnblogs.com/smileEvday/archive/2013/11/21/ffmpeg.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绊汹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扮宠,更是在濱河造成了極大的恐慌西乖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坛增,死亡現(xiàn)場離奇詭異获雕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)收捣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門届案,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罢艾,你說我怎么就攤上這事楣颠【∨Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵球碉,是天一觀的道長蜓斧。 經(jīng)常有香客問我,道長睁冬,這世上最難降的妖魔是什么挎春? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮豆拨,結(jié)果婚禮上直奋,老公的妹妹穿的比我還像新娘。我一直安慰自己施禾,他們只是感情好脚线,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弥搞,像睡著了一般邮绿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀例,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天船逮,我揣著相機(jī)與錄音,去河邊找鬼粤铭。 笑死挖胃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梆惯。 我是一名探鬼主播酱鸭,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼垛吗!你這毒婦竟也來了凹髓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤职烧,失蹤者是張志新(化名)和其女友劉穎扁誓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚀之,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝗敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了足删。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寿谴。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖失受,靈堂內(nèi)的尸體忽然破棺而出讶泰,到底是詐尸還是另有隱情咏瑟,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布痪署,位于F島的核電站码泞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狼犯。R本人自食惡果不足惜余寥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悯森。 院中可真熱鬧宋舷,春花似錦、人聲如沸瓢姻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幻碱。三九已至绎狭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褥傍,已是汗流浹背坟岔。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摔桦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓承疲,卻偏偏與公主長得像邻耕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子燕鸽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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