FFmpeg編程開發(fā)筆記 —— Android 移植 FFmpeg + SDL2.0 庫

0捻勉、編譯FFmpeg的庫
FFmpeg的編譯流程可參考我的文章windows環(huán)境下編譯ffmpeg打包成單個(gè)so并使用Cmake集成到Android工程中,在這里我們不做詳細(xì)的介紹,這里我們默認(rèn)你能夠把libffmpeg.so編譯出來

1役听、下載SDL的源碼
SDL官網(wǎng) 下載源碼,我下載的源碼版本是2.0.7的。將源碼解壓后负间,將android-project 目錄復(fù)制到另外一個(gè)地方并改成自己的工程名字,比如我改成了CainPlayer姜凄,將SDL源碼根目錄的src政溃、include目錄、Android.mk文件復(fù)制到android-project的jni目錄下的sdl目錄态秧,如下圖所示:

準(zhǔn)備工程文件

原來的android-project工程的jni目錄下面存在一個(gè)src的目錄玩祟、Android.mk文件以及Application.mk文件,我們暫時(shí)不要?jiǎng)舆@些屿聋。這樣我們就將SDL的源碼導(dǎo)入了android-project工程中了空扎。

2藏鹊、導(dǎo)入為Android工程
用Android Studio 導(dǎo)入工程,此時(shí)转锈,我們得到了一個(gè)Android工程盘寡,但是這時(shí)候還沒有編譯不了,需要修改build.gradle文件撮慨,添加ndk-build的支持竿痰,這里我試過Cmake,發(fā)現(xiàn)走不通砌溺,也不知道是啥原因影涉。添加如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"

    defaultConfig {
        applicationId "org.libsdl.app"
        minSdkVersion 19
        targetSdkVersion 26

        ndk {
            abiFilter("armeabi-v7a")
            moduleName "SDLmain"
            ldLibs "log", "z", "m", "jnigraphics", "android"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
}

3、添加main代碼
然后我們?cè)趕rc/main/jni/src/目錄下創(chuàng)建一個(gè)native_render.c的文件规伐,文件內(nèi)容如下:

#include "SDL.h" 

 int main(int argc, char *argv[]) {

     SDL_Window *window;

     SDL_Renderer *renderer;

     SDL_Event event;

 

     //配置一個(gè)圖像縮放的效果,linear效果更平滑,也叫抗鋸齒

     //SDL_setenv(SDL_HINT_RENDER_SCALE_QUALITY,"linear",0);

     // 初始化SDL

     if (SDL_Init(SDL_INIT_VIDEO) < 0)

         return 1;

 

     // 創(chuàng)建一個(gè)窗口

     window = SDL_CreateWindow("SDL_RenderClear" , SDL_WINDOWPOS_CENTERED,

                               SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_SHOWN);

     // 創(chuàng)建一個(gè)渲染器

     renderer = SDL_CreateRenderer(window, -1, 0);

 

     // 創(chuàng)建一個(gè)Surface

     SDL_Surface *bmp = SDL_LoadBMP("image.bmp" );

     //設(shè)置圖片中的白色為透明色

     SDL_SetColorKey(bmp, SDL_TRUE, 0xffffff);

     // 創(chuàng)建一個(gè)Texture

     SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp);

     //清除所有事件

     SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);

     //進(jìn)入主循環(huán)

     while  (1) {

         if  (SDL_PollEvent(&event)) {

             if  (event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_FINGERDOWN)

                 break;

         }

         //使用紅色填充背景

         SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

         SDL_RenderClear(renderer);

         // 將紋理布置到渲染器

         SDL_RenderCopy(renderer, texture, NULL, NULL);

         // 刷新屏幕

         SDL_RenderPresent(renderer);

 

     }

      // 釋放Surface

     SDL_FreeSurface(bmp);

     //  釋放Texture

     SDL_DestroyTexture(texture);

     //釋放渲染器

     SDL_DestroyRenderer(renderer);

     //釋放窗口

     SDL_DestroyWindow(window);

     //延時(shí)

     //SDL_Delay(8000);

     //退出

     SDL_Quit();

     return  0;

}

然后蟹倾,我們將同目錄下的Android.mk中的 LOCAL_SRC_FILES 換成native_render.c。如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := SDLmain

SDL_PATH := ../sdl

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include

# Add your application source files here...
LOCAL_SRC_FILES := native_render.c

LOCAL_SHARED_LIBRARIES := SDL2

LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog

include $(BUILD_SHARED_LIBRARY)

我把庫的名稱改成了SDLmain猖闪,這個(gè)名字跟前面的build.gradle添加的ndk里面的moduleName "SDLmain"對(duì)應(yīng)鲜棠,你也可以改成你自己想要的庫名稱。然后修改jni目錄下Application.mk培慌,指定ABI 和 最小支持平臺(tái), 如下:

APP_ABI := armeabi-v7a
# Min SDK level
APP_PLATFORM=android-19

然后在main目錄下新建一個(gè)assets目錄豁陆,將官網(wǎng)提到的一個(gè)圖片地址 保存為image.bmp文件,并放入 assets中吵护。然后回到前面添加的native_render.c文件中盒音,創(chuàng)建surface里面的文件名改成image.bmp,如下:

    // 創(chuàng)建一個(gè)Surface
    SDL_Surface *bmp = SDL_LoadBMP("image.bmp" );

到這里,就可以編譯運(yùn)行android-project工程了馅而。如無意外里逆,即可顯示圖片了,如下圖所示:


成功運(yùn)行截圖

3用爪、修改包名和圖標(biāo)
SDL的源碼已經(jīng)限定了android-project的包名和方法名稱原押,如果只是修改Java層的報(bào)名,這里是會(huì)運(yùn)行失敗的偎血。我們來看看SDLActivity文件中的native方法诸衔,如下圖所示:


SDLActivity中的native方法

如果我們點(diǎn)擊跳轉(zhuǎn),會(huì)發(fā)現(xiàn)跳轉(zhuǎn)到了sdl/src/core/android/SDL_android.c文件中颇玷,然后我們可以查看這樣的定義:

/* 包名和方法名 */
#define SDL_JAVA_PREFIX                                 org_libsdl_app
#define CONCAT1(prefix, class, function)                CONCAT2(prefix, class, function)
#define CONCAT2(prefix, class, function)                Java_ ## prefix ## _ ## class ## _ ## function
#define SDL_JAVA_INTERFACE(function)                    CONCAT1(SDL_JAVA_PREFIX, SDLActivity, function)
#define SDL_JAVA_AUDIO_INTERFACE(function)              CONCAT1(SDL_JAVA_PREFIX, SDLAudioManager, function)
#define SDL_JAVA_CONTROLLER_INTERFACE(function)         CONCAT1(SDL_JAVA_PREFIX, SDLControllerManager, function)
#define SDL_JAVA_INTERFACE_INPUT_CONNECTION(function)   CONCAT1(SDL_JAVA_PREFIX, SDLInputConnection, function)


/* Java class SDLActivity */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeSetupJNI)(
        JNIEnv* mEnv, jclass cls);

JNIEXPORT int JNICALL SDL_JAVA_INTERFACE(nativeRunMain)(
        JNIEnv* env, jclass cls,
        jstring library, jstring function, jobject array);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeDropFile)(
        JNIEnv* env, jclass jcls,
        jstring filename);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeResize)(
        JNIEnv* env, jclass jcls,
        jint width, jint height, jint format, jfloat rate);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceChanged)(
        JNIEnv* env, jclass jcls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeSurfaceDestroyed)(
        JNIEnv* env, jclass jcls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyDown)(
        JNIEnv* env, jclass jcls,
        jint keycode);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyUp)(
        JNIEnv* env, jclass jcls,
        jint keycode);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeKeyboardFocusLost)(
        JNIEnv* env, jclass jcls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeTouch)(
        JNIEnv* env, jclass jcls,
        jint touch_device_id_in, jint pointer_finger_id_in,
        jint action, jfloat x, jfloat y, jfloat p);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeMouse)(
        JNIEnv* env, jclass jcls,
        jint button, jint action, jfloat x, jfloat y);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeAccel)(
        JNIEnv* env, jclass jcls,
        jfloat x, jfloat y, jfloat z);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(onNativeClipboardChanged)(
        JNIEnv* env, jclass jcls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeLowMemory)(
        JNIEnv* env, jclass cls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)(
        JNIEnv* env, jclass cls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativePause)(
        JNIEnv* env, jclass cls);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeResume)(
        JNIEnv* env, jclass cls);

JNIEXPORT jstring JNICALL SDL_JAVA_INTERFACE(nativeGetHint)(
        JNIEnv* env, jclass cls,
        jstring name);

/* Java class SDLInputConnection */
JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeCommitText)(
        JNIEnv* env, jclass cls,
        jstring text, jint newCursorPosition);

JNIEXPORT void JNICALL SDL_JAVA_INTERFACE_INPUT_CONNECTION(nativeSetComposingText)(
        JNIEnv* env, jclass cls,
        jstring text, jint newCursorPosition);

/* Java class SDLAudioManager */
JNIEXPORT void JNICALL SDL_JAVA_AUDIO_INTERFACE(nativeSetupJNI)(
        JNIEnv *env, jclass jcls);

/* Java class SDLControllerManager */
JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeSetupJNI)(
        JNIEnv *env, jclass jcls);

JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadDown)(
        JNIEnv* env, jclass jcls,
        jint device_id, jint keycode);

JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativePadUp)(
        JNIEnv* env, jclass jcls,
        jint device_id, jint keycode);

JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeJoy)(
        JNIEnv* env, jclass jcls,
        jint device_id, jint axis, jfloat value);

JNIEXPORT void JNICALL SDL_JAVA_CONTROLLER_INTERFACE(onNativeHat)(
        JNIEnv* env, jclass jcls,
        jint device_id, jint hat_id, jint x, jint y);

JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddJoystick)(
        JNIEnv* env, jclass jcls,
        jint device_id, jstring device_name, jstring device_desc, jint is_accelerometer,
        jint nbuttons, jint naxes, jint nhats, jint nballs);

JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveJoystick)(
        JNIEnv* env, jclass jcls,
        jint device_id);

JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeAddHaptic)(
        JNIEnv* env, jclass jcls,
        jint device_id, jstring device_name);

JNIEXPORT jint JNICALL SDL_JAVA_CONTROLLER_INTERFACE(nativeRemoveHaptic)(
        JNIEnv* env, jclass jcls,
        jint device_id);

這里就定義了包名org_libsdl_app笨农,也就是build.gradle中的applicationId "org.libsdl.app"以及Manifest.xml,以及SDLActivity等java層的東西帖渠。如果單純修改Java層的東西谒亦,運(yùn)行會(huì)崩潰,說找不到相應(yīng)的類的。這里可以改成你自己的包名份招,比如我改成了自己的com.cgfay.cainplayer切揭,注意,這里build.gradle 和Manifest.xml都的包名需要一致锁摔。然后將SDL_android.c中的SDL_JAVA_PREFIX 改成 com_cgfay_cainplayer廓旬。改完之后,重新編譯一次谐腰,重新運(yùn)行孕豹,我們就可以發(fā)現(xiàn),已經(jīng)成功將報(bào)名改掉了十气,而且編譯運(yùn)行也沒有問題励背。如下所示:


改完報(bào)名后

想要修改為自己的圖標(biāo)的話,把@drawable/ic_launcher的圖標(biāo)換成自己的圖標(biāo)就行砸西。
關(guān)于native_render.c中的main方法叶眉,其實(shí)這里也是可以修改的,定義在sdl/include/SDL_main.h中:

#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)
#define main    SDL_main
#endif

/**
 *  The prototype for the application's main() function
 */
extern C_LINKAGE DECLSPEC int SDL_main(int argc, char *argv[]);

如果我們想要修改成我們自己的名稱籍胯,#define main SDL_main改成我們自己的方法就行竟闪,比如#define run SDL_main离福,不過參數(shù)接口不能做修改杖狼。

4、添加FFmpeg庫
首先在src/main目錄下新建一個(gè)libs目錄妖爷,然后再在libs目錄下新建一個(gè)armeabi-v7a的目錄蝶涩,將前面已經(jīng)編譯好的libffmpeg.so庫復(fù)制到該目錄下。在src/main/jni 目錄下新建一個(gè)ffmpeg目錄絮识,然后在目錄下新建一個(gè)include目錄绿聘,將ffmpeg的頭文件復(fù)制到這里。在ffmpeg目錄下新建一個(gè)Android.mk文件次舌,文件內(nèi)容如下:

LOCAL_PATH := $(call my-dir)

###########################
#
# FFmpeg shared library
#
###########################

include $(CLEAR_VARS)

LOCAL_MODULE:= ffmpeg

LOCAL_SRC_FILES:= $(LOCAL_PATH)/../libs/armeabi-v7a/libffmpeg.so

LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

這時(shí)我們就把ffmpeg的共享庫加載進(jìn)來了熄攘。我們修改src/main/jni/src/Android.mk文件,在Android.mk文件中添加libffmpeg共享庫彼念,并把ffmpeg的頭文件加載進(jìn)來挪圾,如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := SDLmain

SDL_PATH := ../sdl
FFMPEG_PATH := ../ffmpeg

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include \
                    $(LOCAL_PATH)/$(FFMPEG_PATH)/include

# Add your application source files here...
LOCAL_SRC_FILES := native_render.c

LOCAL_SHARED_LIBRARIES := SDL2 ffmpeg

LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog

include $(BUILD_SHARED_LIBRARY)

重新編譯,我們就把FFmpeg的共享庫給編譯進(jìn)去了逐沙。我們需要在SDLActivity的方法中添加ffmpeg庫哲思,如下:

protected String[] getLibraries() {
        return new String[] {
                "SDL2",
                "ffmpeg",   // 順序要在SDLmain之前
                "SDLmain"
        };
    }

然后,我們?cè)趎ative_rander.c中添加打印avcodec_configuration()的方法吩案,如下:

#include "SDL.h" 

#ifdef __ANDROID__
#include <jni.h>
#include <android/log.h>
#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR,"ERROR: ", __VA_ARGS__)
#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO,"INFO: ", __VA_ARGS__)
#else
#define ALOGE(format, ...) printf("ERROR: " format "\n",##__VA_ARGS__)
#define ALOGI(format, ...) printf("INFO: " format "\n",##__VA_ARGS__)
#endif

#include "libavcodec/avcodec.h"

 int main(int argc, char *argv[]) {
     // 打印ffmpeg信息
     const char *str = avcodec_configuration();
     ALOGI("avcodec_configuration: %s", str);

     SDL_Window *window;

     SDL_Renderer *renderer;

     SDL_Event event;

     //配置一個(gè)圖像縮放的效果,linear效果更平滑,也叫抗鋸齒
     SDL_setenv(SDL_HINT_RENDER_SCALE_QUALITY,"linear", 0);

     // 初始化SDL
     if (SDL_Init(SDL_INIT_VIDEO) < 0) {
         return 1;
     }

     // 創(chuàng)建一個(gè)窗口
     window = SDL_CreateWindow("SDL_RenderClear" , SDL_WINDOWPOS_CENTERED,

                               SDL_WINDOWPOS_CENTERED, 0, 0, SDL_WINDOW_SHOWN);

     // 創(chuàng)建一個(gè)渲染器
     renderer = SDL_CreateRenderer(window, -1, 0);

     // 創(chuàng)建一個(gè)Surface
     SDL_Surface *bmp = SDL_LoadBMP("image.bmp" );

     //設(shè)置圖片中的白色為透明色
     SDL_SetColorKey(bmp, SDL_TRUE, 0xffffff);

     // 創(chuàng)建一個(gè)Texture
     SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, bmp);

     //清除所有事件
     SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);

     //進(jìn)入主循環(huán)
     while  (1) {
         if  (SDL_PollEvent(&event)) {
             if  (event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_FINGERDOWN)
                 break;

         }

         //使用紅色填充背景
         SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

         SDL_RenderClear(renderer);

         // 將紋理布置到渲染器
         SDL_RenderCopy(renderer, texture, NULL, NULL);

         // 刷新屏幕
         SDL_RenderPresent(renderer);
     }

      // 釋放Surface
     SDL_FreeSurface(bmp);

     //  釋放Texture
     SDL_DestroyTexture(texture);

     //釋放渲染器
     SDL_DestroyRenderer(renderer);

     //釋放窗口
     SDL_DestroyWindow(window);

     //延時(shí)
     //SDL_Delay(8000);

     //退出
     SDL_Quit();

     return  0;

}

重新Refresh Linked C++ Projects之后編譯運(yùn)行棚赔,可以看到已經(jīng)打印出以下的log:

12-22 15:50:56.249 8752-8777/com.cgfay.cainplayer I/INFO:: avcodec_configuration: --prefix=./android/arm-v7a --arch=arm --cpu=armv7-a --target-os=android --enable-cross-compile --cross-prefix='D:/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-' --sysroot='D:/Android/sdk/ndk-bundle/platforms/android-19/arch-arm' --extra-cflags='-I/d/FFmpeg/ffmpeg-3.3.3/libx264/android/arm/include -ID:/Android/sdk/ndk-bundle/platforms/android-19/arch-arm/usr/include' --extra-ldflags=-L/d/FFmpeg/ffmpeg-3.3.3/libx264/android/arm/lib --cc='D:/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gcc' --nm='D:/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-nm' --disable-shared --enable-static --enable-gpl --enable-version3 --enable-pthreads --enable-runtime-cpudetect --enable-small --disable-network --disable-vda --disable-iconv --enable-asm --enable-neon --enable-yasm --disable-encoders --enable-libx264 --ena

此時(shí),我們已經(jīng)將FFmpeg + SDL2.0 編譯成功,并集成到SDLmain中了靠益。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丧肴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捆毫,更是在濱河造成了極大的恐慌闪湾,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绩卤,死亡現(xiàn)場離奇詭異途样,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)濒憋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門何暇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凛驮,你說我怎么就攤上這事裆站。” “怎么了黔夭?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宏胯,是天一觀的道長。 經(jīng)常有香客問我本姥,道長肩袍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任婚惫,我火速辦了婚禮氛赐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘先舷。我一直安慰自己艰管,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布蒋川。 她就那樣靜靜地躺著牲芋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捺球。 梳的紋絲不亂的頭發(fā)上缸浦,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音懒构,去河邊找鬼餐济。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胆剧,可吹牛的內(nèi)容都是我干的絮姆。 我是一名探鬼主播醉冤,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼篙悯!你這毒婦竟也來了蚁阳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸽照,失蹤者是張志新(化名)和其女友劉穎螺捐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮燎,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡定血,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诞外。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澜沟。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖峡谊,靈堂內(nèi)的尸體忽然破棺而出茫虽,到底是詐尸還是另有隱情,我是刑警寧澤既们,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布濒析,位于F島的核電站,受9級(jí)特大地震影響啥纸,放射性物質(zhì)發(fā)生泄漏号杏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一脾拆、第九天 我趴在偏房一處隱蔽的房頂上張望馒索。 院中可真熱鬧莹妒,春花似錦名船、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鉴腻,卻和暖如春迷扇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爽哎。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工蜓席, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人课锌。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓厨内,卻偏偏與公主長得像祈秕,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雏胃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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