MAC編譯ffmpeg+x264(IOS和android)(一)

前言

FFmpeg是一個很強大的垮平臺的音視頻處理庫,它可用于Mac/windows/ios/android/linux等各個平臺隆豹,F(xiàn)Fmpeg庫自身native代碼實現(xiàn)了很多功能北救,也引入了其它的很多外部庫,比如x264、fdk_aac碴卧、lamemp3等等深夯,然后對這些外部庫做封裝抖格,對外則提供了統(tǒng)一的接口。如下提供了盡量簡單的方法編譯用于這些平臺的ffmpeg庫(引入常用的x264咕晋、fdk_aac雹拄、lamemp3外部庫)。

編譯基礎(chǔ)知識

編譯一般分為本地編譯和交叉編譯掌呜,本地編譯是相對于交叉編譯而言的滓玖。本地編譯一般指在PC上編譯用于當(dāng)前PC平臺系統(tǒng)使用的程序或者庫,交叉編譯一般指在本地PC平臺上用指定的交叉編譯器編譯用于其它嵌入式平臺用的程序或者庫质蕉,如在Mac平臺上編譯iOS平臺用的FFmpeg庫势篡。每一個嵌入式平臺都會提供PC平臺的交叉編譯工具鏈,他們都會有如下幾個工具:

CC:C語言編譯器
CXX:C++編譯器
AS:匯編語言編譯器
AR:打包器模暗,將.o文件打包(CC/CXX/AS編譯器生成的為.o文件)
LD:連接器禁悠,將庫文件和.o文件連接成可執(zhí)行程序(如.out文件)
NM:查看靜態(tài)庫文件中的符號表
GDB:調(diào)試工具
STRIP:通過優(yōu)化減小可執(zhí)行文件或者庫文件體積
Objdump:查看靜態(tài)庫或者動態(tài)庫的方法簽名

如:

gcc -c main.cpp -I ./include
ar libmedia.a media.o
gcc -o main main.o -L media

make編譯工具

通常我們通過命令編譯的步驟如下:

// 生成中間文件
gcc -c  main.c
// 生成可執(zhí)行文件(可執(zhí)行程序 main;生成庫的步驟也一樣)
gcc -o main main.o

那如果工程有成千上萬個文件兑宇,那么我們這樣的命令就需要寫成千上萬變碍侦,顯然是非常不方便的。make是一個非常強大的工具,它可以極大簡化如上的編譯命令瓷产,生成想要的庫或者程序站玄。基本如下:

  • make語法由configure文件(它為可執(zhí)行文件)來配置
  • --prefix 指定編譯生成的庫或者可執(zhí)行文件的路徑
  • --host 指定最終要運行的平臺
  • CC 指定交叉編譯工具的路徑
  • CFFLAGS 指定編譯時所帶的參數(shù)
  • LDFLAGS 指定連接過程中的參數(shù)
  • --disable-frontend 不編譯可執(zhí)行程序

執(zhí)行過程如下:
當(dāng)調(diào)用./configure .....命令時將會配置make的相關(guān)參數(shù)
當(dāng)調(diào)用make ..... 或者make install 命令時濒旦,將會調(diào)用make工具進行編譯連接并生成可執(zhí)行程序或者庫文件

編譯mac平臺下使用的ffmpeg庫

1株旷、homebrew(推薦)
2、make工具手動編譯

IOS和android平臺交叉編譯工具

每個操作系統(tǒng)(MAC osx/windows/linux)都有提供ios和android平臺的交叉編譯工具鏈疤估,這里以mac 系統(tǒng)為例灾常,ios和android的交叉編譯工具如下:
1、ios交叉編譯工具路徑
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
在這個路徑下就有上面說的那些 cc铃拇,ar等工具钞瀑,這里的cc實際上是指向了clang編譯器
ios編譯中bitcode
開啟之后app性能會增加,關(guān)閉則有可能降低性能
xcrun -sdk iphoneos clang -arch arm64 意思就是調(diào)用clang編譯器編譯64位的源代碼

2慷荔、android交叉編譯工具路徑
<安卓sdk/ndk-bundle路徑>/toolchains/[aarch64-linux-android-4.9(編譯64位arm雕什,具體版本號根據(jù)安裝的ndk版本確定)][arm-linux-androideabi-4.9(編譯32位)]/prebuilt/darwin-x86_64/bin
在這個路徑下就有上面那些cc,ar等工具

編譯環(huán)境

  • ios&&mac
    Xcode:Version 11.4 (11E146)
  • android
    android-ndk-r20
  • 操作系統(tǒng)
    Mac os X:10.15.4 (19E266)

開始編譯

這里的腳本是基于ijkplayer腳本經(jīng)過改寫而成显晶,反復(fù)經(jīng)歷多次修改贷岸,ijkplayer是一個很優(yōu)秀的國內(nèi)開源庫,github地址:ijkplayer開源地址

編譯腳本地址:腳本地址

  • 下載腳本
git clone https://github.com/nldzsz/ffmpeg-build-scripts.git

一磷雇、 編譯 ffmpeg for iOS

cd ffmpeg-build-scripts
./compile-ios.sh
  • 代碼解讀:

1偿警、執(zhí)行此腳本會先檢查系統(tǒng)中是否安裝 brew yasm gas-preprocessor.pl工具,如果沒有則會自動安裝唯笙;
接著會根據(jù)選擇要編譯的庫自動下載ffmpeg/x264/mp3lame/fdk-aac等源碼螟蒸;如果不想編譯對應(yīng)的庫,只需要將腳本./compile-ios.sh中LIBFLAGS所對應(yīng)的設(shè)置為FALSE即可:

# libass使用Coretext還是fontconfig;TRUE代表使用CORETEXT,FALSE代表使用fontconfig
export USE_CORETEXT=FALSE
# 是否編譯這些庫;如果不編譯將對應(yīng)的值改為FALSE即可崩掘;如果ffmpeg對應(yīng)的值為TRUE時七嫌,還會將其它庫引入ffmpeg中,否則單獨編譯其它庫
if [ $USE_CORETEXT = "TRUE" ];then
export LIBFLAGS=(
[ffmpeg]=TRUE [x264]=TRUE [fdkaac]=FALSE [mp3lame]=TRUE [fribidi]=TRUE [freetype]=TRUE [ass]=TRUE
)
else
export LIBFLAGS=(
[ffmpeg]=TRUE [x264]=TRUE [fdkaac]=FALSE [mp3lame]=TRUE [fribidi]=TRUE [freetype]=TRUE [expat]=TRUE [fontconfig]=TRUE [ass]=TRUE
)
fi

下載的源碼會保存到extra的對應(yīng)目錄中苞慢,如果本地已有源碼诵原,則直接將源碼拷貝到此目錄中即可,不過名字要對應(yīng)上挽放,對應(yīng)關(guān)系為 common.sh腳本中如下代碼

# 各個源碼的名字
LIBS[ffmpeg]=ffmpeg
LIBS[x264]=x264
LIBS[fdkaac]=fdk-aac
LIBS[mp3lame]=mp3lame
LIBS[fribidi]=fribidi
LIBS[freetype]=freetype
LIBS[expat]=expat
LIBS[fontconfig]=fontconfig
LIBS[ass]=ass

2绍赛、export FF_ALL_ARCHS_IOS="arm64 x86_64" 代表要編譯的平臺,默認會編譯 arm64 x86_64兩個平臺的靜態(tài)庫

編譯后的結(jié)果如下:


image.png

如果不做任何裁剪辑畦,可以看到默認的.a庫還是挺大的惹资,以上是編譯的默認配置的庫

  • 開啟指定的選項

// 開啟rtsp解析協(xié)議
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"

在ios項目中使用ffmpeg的.a庫
1、直接將universal/lib目錄拖進工程
2航闺、配置頭文件和庫文件搜索路徑,如下


image.png

3、添加外部庫

libiconv.2.4.0.tbd
libz.1.2.5.tbd

如下:


image.png

二潦刃、編譯ffmpeg for android

  • 1侮措、編譯so動態(tài)庫
cd ffmpeg-build-scripts
./compile-android.sh
  • 備注:
    如果NDK是直接從瀏覽器下載的,編譯的時候會彈出如下的提示:


    image.png

點擊"仍然允許"即可乖杠。從android studio下載的則不會(來自Google的說法分扎,未嘗試過)

最后編譯結(jié)果如下:


image.png

導(dǎo)入android工程,通過cmake方式導(dǎo)入


image.png

CMakeLists.txt文件導(dǎo)入ffmpeg動態(tài)庫的關(guān)鍵代碼如下:
設(shè)置ffmpeg頭文件路徑

set(SRC_DIR ${PROJECT_SOURCE_DIR}/src/main/cpp)
set(FFMPEG_INC ${SRC_DIR}/ffmpeg)
include_directories(${FFMPEG_INC})

設(shè)置ffmpeg.so動態(tài)庫文件路徑

# import ffmpeg library
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
# ding yi jiang gai ku da bao jin app de lei xing
add_library(adMedia SHARED
        ${src_cpp}
        ${ffmpeg_demo}
        ${ffmpeg_common}
        ${com_cpp}
        ${opensles_cpp}
        )
target_link_libraries(adMedia android log
        OpenSLES
        mediandk
        avformat avcodec avfilter avutil swresample swscale
        ${log-lib}
    )

tips:編譯動態(tài)庫時沒有加入fdk_aac庫胧洒,因為還沒找到去掉libfdk-aac.so.2.0.0后綴的辦法畏吓,如果沒有去掉后綴,引入安卓時會提示找不到"fdk-aac.so.2"的錯誤

  • 2卫漫、編譯.so動態(tài)庫
    動態(tài)庫引入安卓如果有后綴,比如libfdk-aac.so.2.0.0就無法被安卓識別菲饼,目前也還沒找到辦法去掉這個后綴,不過現(xiàn)在ffmpeg已經(jīng)內(nèi)置了aac的編解碼器列赎,可以不用fdkaac了宏悦,不過也了解一下安卓對于靜態(tài)庫的引用方式

找到腳本compile-ffmpeg-android.sh,做如下修改
export FF_COMPILE_SHARED=FALSE
export FF_COMPILE_STATIC=TRUE
然后執(zhí)行
./compile-ffmpeg-android.sh all

最終生成的靜態(tài)庫如下:

靜態(tài)ffmpeg庫的引入方式
1、將相關(guān)庫拖入對應(yīng)目錄
2包吝、配置CMakeLists.txt
設(shè)置ffmpeg頭文件路徑和動態(tài)庫一樣

set(SRC_DIR {PROJECT_SOURCE_DIR}/src/main/cpp) set(FFMPEG_INC{SRC_DIR}/ffmpeg)
include_directories(${FFMPEG_INC})
設(shè)置ffmpeg 相關(guān)靜態(tài)庫文件路徑

# import ffmpeg library
# import ffmpeg library
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${CMAKE_ANDROID_ARCH_ABI} -lm -lz")
# ding yi jiang gai ku da bao jin app de lei xing
add_library(adMedia SHARED
        ${src_cpp}
        ${ffmpeg_demo}
        ${ffmpeg_common}
        ${com_cpp}
        ${opensles_cpp}
        )
target_link_libraries(adMedia android log
        OpenSLES
        mediandk
        # for dynamic
#        avformat avcodec avfilter avutil swresample swscale
        # for static
        libavformat.a libavcodec.a libavfilter.a libavutil.a libswresample.a libswscale.a libfdk-aac.a libx264.a libmp3lame.a
        ${log-lib}
    )
  • 注意:這里和動態(tài)庫不一樣的就是多加了-lm -lz的標(biāo)記和寫入完整的庫名包括后綴

三饼煞、編譯ffmpeg for mac

  • homebrew編譯
    1、homebrew安裝ffmpeg for mac
brew install ffmpeg

會自動安裝最新的ffmpeg诗越,如果沒有安裝homebrew砖瞧,則使用如下命令安裝

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

homebrew卸載ffmpeg

brew uninstall ffmpeg
  • 手動編譯
    homebrew安裝ffmpeg的好處是簡單,不足是無法自定義ffmpeg的配置嚷狞,如果修改了ffmpeg的源碼块促,則必須要通過手動方式安裝ffmpeg
cd ffmpeg-build-scripts
./compile-pc.sh mac

會生成ffmpeg.a庫,如下:


image.png
  • 將ffmpeg導(dǎo)入xcode命令行工程
    這里是一個簡單的command line工程感耙,如下方式設(shè)置ffmpeg


    2.jpg
3.jpg

注意第二張圖褂乍,需要添加如下額外的庫,不然會出現(xiàn)錯誤即硼。

FFmpeg許可協(xié)議

在使用開源代碼時要清除開源代碼所使用的的許可協(xié)議逃片,因為可能涉及到一定的法律風(fēng)險。常見的開源許可協(xié)議:

  • BSD/MIT/APPACHE
    可以為所欲為的許可協(xié)議
  • GPL
    全稱(GNU General Public License)只酥。產(chǎn)品中要有一份文檔說明使用了GPL協(xié)褥实,只要是使用到它的代碼自身的代碼也要全部開源
  • LGPL
    全稱(GNU Lesser General Public License)。產(chǎn)品中要有一份文檔說明使用了LGPL協(xié)議裂允,使用它的代碼自身代碼不需要開源损离。但如果修改了它的代碼,則修改的部分要開源出來

ffmpeg關(guān)于協(xié)議的configure參數(shù)為

Licensing options:
  --enable-gpl             allow use of GPL code, the resulting libs
                           and binaries will be under GPL [no]
  --enable-version3        upgrade (L)GPL to version 3 [no]
  --enable-nonfree         allow use of nonfree code, the resulting libs
                           and binaries will be unredistributable [no]

1绝编、ffmpeg協(xié)議默認為LGPL v2.1+
2僻澎、如果ffmpeg引入了x264庫或者使用GPL的模塊貌踏,那么ffmpeg將變成GPL許可協(xié)議,需要開啟--enable-gpl
3窟勃、ffmpeg使用了gmp祖乳、libaribb24等基于LGPL v3的模塊,則需要開啟--enable-version3
4秉氧、如果ffmpeg引入了fdk-aac等和GPL不兼容的外部庫眷昆,則需要開啟--enable-nonfree,編譯后ffmpeg變成unredistributable

具體參考官網(wǎng)
許可協(xié)議文檔1
許可協(xié)議介紹

遇到問題

  • ios&&mac遇到問題
    1汁咏、x264庫相關(guān)函數(shù)找不到
ld: warning: could not create compact unwind for _ff_init_vlc_sparse: stack subq instruction is too different from dwarf stack size
ld: warning: could not create compact unwind for _ff_init_2d_vlc_rl: stack subq instruction is too different from dwarf stack size
ld: warning: could not create compact unwind for _ff_rl_init_vlc: stack subq instruction is too different from dwarf stack size
Undefined symbols for architecture x86_64:
  "_x264_encoder_close", referenced from:
      _X264_close in libavcodec.a(libx264.o)
  "_x264_picture_init", referenced from:
      _X264_frame in libavcodec.a(libx264.o)
  "_x264_encoder_reconfig", referenced from:
      _X264_frame in libavcodec.a(libx264.o)
  "_x264_encoder_open_157", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_encoder_encode", referenced from:
      _X264_frame in libavcodec.a(libx264.o)
  "_x264_param_default", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_param_apply_fastfirstpass", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_levels", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_param_default_preset", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_param_apply_profile", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_param_parse", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_encoder_delayed_frames", referenced from:
      _X264_frame in libavcodec.a(libx264.o)
  "_x264_encoder_headers", referenced from:
      _X264_init in libavcodec.a(libx264.o)
  "_x264_encoder_maximum_delayed_frames", referenced from:
      _X264_init in libavcodec.a(libx264.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (us

編譯的libx264.a也要一并添加進去(如果是用的libxrzffmpeg.a則不需要加)

2亚斋、ffmpeg 4.0編譯fdk-aac時遇到的錯誤
libavcodec/libfdk-aacenc.c:292:34: error: ‘AACENC_InfoStruct {aka struct <anonymous>}’ has no member named ‘encoderDelay’ #93
換成4.2,解決了此問題

3、xcode環(huán)境不全時編譯ffmpeg 提示 No working C compiler found.
執(zhí)行如下命令:

xcode-select --install # Install Command Line Tools if you haven't already.
sudo xcode-select --switch /Library/Developer/CommandLineTools # Enable command line tools
# Change the path if you installed Xcode somewhere else.
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

4攘滩、編譯x264時帅刊,如果提示Found no assembler Minimum version is nasm-2.13
說明系統(tǒng)的nasm版本過低,重新安裝即可

brew reinstall nasm

5轰驳、ffmpeg引用錯誤
必須要添加如下對應(yīng)的庫厚掷,否則可能會出現(xiàn)對應(yīng)的錯誤,如下:
libiconv.2.4.0.tbd级解,libz.1.2.5.tbd

Undefined symbols for architecture xxx
"deflateInit2", referenced from:
_encode_frame in libavcodec.a(pngenc.o)
"_crc32", referenced from:
_encode_frame in libavcodec.a(pngenc.o)
"_deflateReset", referenced from:
_encode_frame in libavcodec.a(lclenc.o)
_encode_frame in libavcodec.a(zmbvenc.o)
"_compress", referenced from:
.......

Security.framework

Undefined symbols for architecture x86_64:
  "_SSLClose", referenced from:
      _tls_open in libavformat.a(tls_securetransport.o)
      _tls_close in libavformat.a(tls_securetransport.o)
  "_SSLCopyPeerTrust", referenced from:
......

VideoDecodeAcceleration.framework

Undefined symbols for architecture x86_64:
  "_VDADecoderCreate", referenced from:
      _ff_vda_create_decoder in libavcodec.a(vda_h264.o)
      _ff_vda_default_init in libavcodec.a(vda_h264.o)
  "_VDADecoderDecode", referenced from:
.....

AudioToolbox.framework

Undefined symbols for architecture x86_64:
  "_AudioConverterDispose", referenced from:
      _ffat_close_decoder in libavcodec.a(audiotoolboxdec.o)
      _ffat_close_encoder in libavcodec.a(audiotoolboxenc.o)
  "_AudioConverterFillComplexBuffer", referenced from:
....

CoreMedia.framework

Undefined symbols for architecture x86_64:
  "_CMBlockBufferCopyDataBytes", referenced from:
      _vtenc_frame in libavcodec.a(videotoolboxenc.o)
  "_CMBlockBufferCreateWithMemoryBlock", referenced from:
      _videotoolbox_common_end_frame in libavcodec.a(videotoolbox.o)
  "_CMSampleBufferCreate", referenced from:
.....

CoreFoundation.framework

Undefined symbols for architecture x86_64:
  "_CFArrayCreateMutableCopy", referenced from:
      _tls_open in libavformat.a(tls_securetransport.o)
  "_CFArrayGetCount", referenced from:
      _vtenc_frame in libavcodec.a(videotoolboxenc.o)
......

CoreVideo.framework

Undefined symbols for architecture x86_64:
  "_CVBufferSetAttachments", referenced from:
      _vtenc_send_frame in libavcodec.a(videotoolboxenc.o)
  "_CVPixelBufferCreateWithPlanarBytes", referenced from:
      _vtenc_send_frame in libavcodec.a(videotoolboxenc.o)
....

VideoToolbox.framework

Undefined symbols for architecture x86_64:
  "_VTCompressionSessionCompleteFrames", referenced from:
      _vtenc_init in libavcodec.a(videotoolboxenc.o)
      _vtenc_frame in libavcodec.a(videotoolboxenc.o)
  "_VTCompressionSessionCreate", referenced from:
.....

libz.tbd

Undefined symbols for architecture x86_64:
  "_compress", referenced from:
      _encode_strip in libavcodec.a(tiffenc.o)
  "_compress2", referenced from:
      _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
      _flashsv_encode_frame in libavcodec.a(flashsvenc.o)
  "_deflate", referenced from:
....

liblzma.tbd

Undefined symbols for architecture x86_64:
  "_lzma_code", referenced from:
      _decode_frame in libavcodec.a(tiff.o)
  "_lzma_end", referenced from:
      _decode_frame in libavcodec.a(tiff.o)
....

libbz2.tbd

Undefined symbols for architecture x86_64:
  "_BZ2_bzDecompress", referenced from:
      _matroska_decode_buffer in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressEnd", referenced from:
....

libiconv.tbd

Undefined symbols for architecture x86_64:
  "_iconv", referenced from:
      _avcodec_decode_subtitle2 in libavcodec.a(utils.o)
  "_iconv_close", referenced from:
      _avcodec_open2 in libavcodec.a(utils.o)
....

libz.tbd

Undefined symbols for architecture x86_64:
  "_compress", referenced from:
      _encode_strip in libavcodec.a(tiffenc.o)
  "_compress2", referenced from:
      _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
      _flashsv_encode_frame in libavcodec.a(flashsvenc.o)
  "_deflate", referenced from:
.....

6冒黑、"stack_not_16_byte_aligned_error"錯誤
此錯誤為mac osX 10.15.4 (19E266)和Version 11.4 (11E146)編譯環(huán)境下新產(chǎn)生問題。在編譯CFlags=添加 "-fno-stack-check" 即可勤哗,如下:

# fixbug:mac osX 10.15.4 (19E266)和Version 11.4 (11E146)編譯時產(chǎn)生錯誤"stack_not_16_byte_aligned_error"
# 添加 "-fno-stack-check" 即可
FF_EXTRA_CFLAGS="-fno-stack-check"
  • android 問題
    待補充抡爹。。芒划。冬竟。。

因為編譯腳本不停的在更新民逼,所以上面MAC/IOS/Android工程需要引用的其它庫可能有有需要增加的地方泵殴,最新的請參考ffmpeg的demo中的配置 ffmpeg-demo地址,那個工程的配置我會實時更新拼苍,按照demo中工程配置肯定不會出錯

源代碼地址

編譯腳本地址:
https://github.com/nldzsz/ffmpeg-build-scripts.git
ffmpeg地址:
https://github.com/FFmpeg/FFmpeg.git
http://ffmpeg.org/releases/ffmpeg-4.2.tar.bz2
x264地址:
https://git.videolan.org/git/x264.git
http://download.videolan.org/x264/snapshots/x264-snapshot-20190809-2245-stable.tar.bz2(備注:該地址每天都會按照日期20190809增加一份拷貝,其它不變)
lame地址:
https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz
https://jaist.dl.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
fdk-aac地址:
https://github.com/mstorsjo/fdk-aac
https://sourceforge.net/p/opencore-amr/fdk-aac/ci/v2.0.0/tarball
https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-2.0.0.tar.gz

參考文章

1笑诅、[FFmpeg零基礎(chǔ)(2)-FFmpeg的編譯]https://juejin.im/post/5af3bef5f265da0b9d783ae3
2、xrun命令介紹
3疮鲫、https://github.com/kewlbear
4吆你、ijkplayer
5、gas-preprocessor
6俊犯、https://github.com/kewlbear/FFmpeg-iOS-build-script

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妇多,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子燕侠,更是在濱河造成了極大的恐慌者祖,老刑警劉巖立莉,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異七问,居然都是意外死亡桃序,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門烂瘫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奇适,你說我怎么就攤上這事坟比。” “怎么了嚷往?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵葛账,是天一觀的道長。 經(jīng)常有香客問我皮仁,道長籍琳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任贷祈,我火速辦了婚禮趋急,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘势誊。我一直安慰自己呜达,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布粟耻。 她就那樣靜靜地躺著查近,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挤忙。 梳的紋絲不亂的頭發(fā)上霜威,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音册烈,去河邊找鬼戈泼。 笑死,一個胖子當(dāng)著我的面吹牛茄厘,可吹牛的內(nèi)容都是我干的矮冬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼次哈,長吁一口氣:“原來是場噩夢啊……” “哼胎署!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窑滞,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琼牧,失蹤者是張志新(化名)和其女友劉穎恢筝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巨坊,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡撬槽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趾撵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侄柔。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖占调,靈堂內(nèi)的尸體忽然破棺而出暂题,到底是詐尸還是另有隱情,我是刑警寧澤究珊,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布薪者,位于F島的核電站,受9級特大地震影響剿涮,放射性物質(zhì)發(fā)生泄漏言津。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一取试、第九天 我趴在偏房一處隱蔽的房頂上張望悬槽。 院中可真熱鬧,春花似錦想括、人聲如沸陷谱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烟逊。三九已至,卻和暖如春铺根,著一層夾襖步出監(jiān)牢的瞬間宪躯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工位迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留访雪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓掂林,卻偏偏與公主長得像臣缀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泻帮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355