Android 視頻錄制

想到視頻錄制护蝶,肯定又是運(yùn)用MediaRecorder,這個(gè)類實(shí)在是方便心墅,但是好用的東西一定要慎重酿矢,畢竟沒(méi)有那么便宜的事,但是基本滿足用戶要求怎燥,但是對(duì)于比較苛刻的項(xiàng)目而言瘫筐,那就很尷尬了,比如:拍攝的視頻不聚焦铐姚,拍攝像素低策肝,甚至在有些手機(jī)上面根本無(wú)法進(jìn)行拍攝錄制,這就導(dǎo)致無(wú)法很好的使用了谦屑。不過(guò)我還是提供出工具類驳糯。希望高手能修改,并完美運(yùn)行氢橙。

importandroid.annotation.SuppressLint;

importandroid.app.AlertDialog;

importandroid.app.ProgressDialog;

importandroid.content.Context;

importandroid.content.DialogInterface;

importandroid.graphics.Bitmap;

importandroid.graphics.PixelFormat;

importandroid.hardware.Camera;

importandroid.media.MediaRecorder;

importandroid.media.MediaScannerConnection;

importandroid.net.Uri;

importandroid.os.Bundle;

importandroid.os.Environment;

importandroid.os.PowerManager;

importandroid.os.SystemClock;

importandroid.text.TextUtils;

importandroid.util.Log;

importandroid.view.SurfaceHolder;

importandroid.view.View;

importandroid.view.Window;

importandroid.view.WindowManager;

importandroid.widget.Button;

importandroid.widget.Chronometer;

importandroid.widget.ImageView;

importandroid.widget.RelativeLayout;

importandroid.widget.Toast;

importandroid.widget.VideoView;

importcom.lvgou.distribution.R;

importcom.lvgou.distribution.utils.PathUtil;

importcom.lvgou.distribution.utils.Utils;

importjava.io.BufferedOutputStream;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.util.Collections;

importjava.util.List;

/**

* Created by Administrator on 2017/6/14.

*/

publicclassMyRecorderVideoActivityextendsBaseActivityimplementsView.OnClickListener,SurfaceHolder.Callback,MediaRecorder.OnInfoListener,MediaRecorder.OnErrorListener{

privatestaticfinalStringTAG="RecorderVideoActivity";

privatefinalstaticStringCLASS_LABEL="RecordActivity";

privatePowerManager.WakeLockmWakeLock;

privateImageViewbtnStart;//開始拍攝

privateImageViewbtnStop;//停止拍攝

privateMediaRecordermediaRecorder;

privateVideoViewmVideoView;// 顯示視頻

StringlocalPath="";// 路徑保存錄像

privateCameramCamera;

privateintpreviewWidth=480;

privateintpreviewHeight=480;

privateChronometerchronometer;//時(shí)間

privateintfrontCamera=0;// 0是相機(jī),1是前置攝像頭

privateButtonbtn_switch;//切換攝像頭

Camera.ParameterscameraParameters=null;

privateSurfaceHoldermSurfaceHolder;

intdefaultVideoFrameRate=-1;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);// 無(wú)標(biāo)題

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);// 全屏幕

// 半透明模式,用于表面的觀點(diǎn)

getWindow().setFormat(PixelFormat.TRANSLUCENT);

setContentView(R.layout.my_recorder_activity);

PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);

mWakeLock=pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,

CLASS_LABEL);

mWakeLock.acquire();

initViews();

}

privateRelativeLayoutrl_back;

// 初始化控件

privatevoidinitViews(){

rl_back=(RelativeLayout)findViewById(R.id.rl_back);

rl_back.setOnClickListener(this);

btn_switch=(Button)findViewById(R.id.switch_btn);//切換攝像頭

btn_switch.setOnClickListener(this);

btn_switch.setVisibility(View.VISIBLE);

mVideoView=(VideoView)findViewById(R.id.mVideoView);//視頻控件顯示視頻

btnStart=(ImageView)findViewById(R.id.recorder_start);//開始拍攝

btnStop=(ImageView)findViewById(R.id.recorder_stop);//停止拍攝

btnStart.setOnClickListener(this);

btnStop.setOnClickListener(this);

mSurfaceHolder=mVideoView.getHolder();

mSurfaceHolder.addCallback(this);

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

chronometer=(Chronometer)findViewById(R.id.chronometer);//時(shí)間

}

publicvoidback(Viewview){

releaseRecorder();

releaseCamera();

finish();

}

@Override

protectedvoidonResume(){

super.onResume();

if(mWakeLock==null){

// 保持喚醒

PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);

mWakeLock=pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,

CLASS_LABEL);

mWakeLock.acquire();

}

}

// 初始化照相機(jī)

@SuppressLint("NewApi")

privatebooleaninitCamera(){

try{

if(frontCamera==0){

mCamera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);

}else{

mCamera=Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);

}

Camera.ParameterscamParams=mCamera.getParameters();

mCamera.lock();

mSurfaceHolder=mVideoView.getHolder();

mSurfaceHolder.addCallback(this);

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

mCamera.setDisplayOrientation(90);

}catch(RuntimeExceptionex){

returnfalse;

}

returntrue;

}

privatevoidhandleSurfaceChanged(){

if(mCamera==null){

finish();

return;

}

booleanhasSupportRate=false;

ListsupportedPreviewFrameRates=mCamera.getParameters()

.getSupportedPreviewFrameRates();

if(supportedPreviewFrameRates!=null

&&supportedPreviewFrameRates.size()>0){

Collections.sort(supportedPreviewFrameRates);

for(inti=0;i

intsupportRate=supportedPreviewFrameRates.get(i);

if(supportRate==15){

hasSupportRate=true;

}

}

if(hasSupportRate){

defaultVideoFrameRate=15;

}else{

defaultVideoFrameRate=supportedPreviewFrameRates.get(0);

}

}

// 得到所有相機(jī)提供的決議

ListresolutionList=Utils.getResolutionList(mCamera);

if(resolutionList!=null&&resolutionList.size()>0){

Collections.sort(resolutionList,newUtils.ResolutionComparator());

Camera.SizepreviewSize=null;

booleanhasSize=false;

// 如果相機(jī)支持使用60 * 480

for(inti=0;i

Camera.Sizesize=resolutionList.get(i);

if(size!=null&&size.width==640&&size.height==480){

previewSize=size;

previewWidth=previewSize.width;

previewHeight=previewSize.height;

hasSize=true;

break;

}

}

// 使用中等分辨率如果相機(jī)不支持上述決議

if(!hasSize){

intmediumResolution=resolutionList.size()/2;

if(mediumResolution>=resolutionList.size())

mediumResolution=resolutionList.size()-1;

previewSize=resolutionList.get(mediumResolution);

previewWidth=previewSize.width;

previewHeight=previewSize.height;

}

}

}

@Override

protectedvoidonPause(){

super.onPause();

if(mWakeLock!=null){

mWakeLock.release();

mWakeLock=null;

}

}

@Override

publicvoidonClick(Viewview){

inti=view.getId();

if(i==R.id.switch_btn){

//切換攝像頭

switchCamera();

}elseif(i==R.id.recorder_start){

// 開始錄制

if(!startRecording())

return;

Toast.makeText(this,R.string.The_video_to_start,Toast.LENGTH_SHORT).show();

btn_switch.setVisibility(View.INVISIBLE);

btnStart.setVisibility(View.INVISIBLE);

btnStart.setEnabled(false);

btnStop.setVisibility(View.VISIBLE);

chronometer.setBase(SystemClock.elapsedRealtime());

chronometer.start();

}elseif(i==R.id.recorder_stop){

// 停止錄制

btnStop.setEnabled(false);

stopRecording();

btn_switch.setVisibility(View.VISIBLE);

chronometer.stop();

btnStart.setVisibility(View.VISIBLE);

btnStop.setVisibility(View.INVISIBLE);

//彈出是否發(fā)送對(duì)話框

newAlertDialog.Builder(this)

.setMessage("是否使用該視頻酝枢!")

.setPositiveButton(R.string.ok,

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

dialog.dismiss();

//發(fā)送視頻

sendVideo(null);

}

})

.setNegativeButton(R.string.cancel,

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,intwhich){

if(localPath!=null){

Filefile=newFile(localPath);

if(file.exists())

file.delete();

}

finish();

}

}).setCancelable(false).show();

}elseif(i==R.id.rl_back){

if(localPath!=null){

Filefile=newFile(localPath);

if(file.exists())

file.delete();

}

finish();

}

}

@Override

publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,

intheight){

mSurfaceHolder=holder;

}

@Override

publicvoidsurfaceCreated(SurfaceHolderholder){

if(mCamera==null){

if(!initCamera()){

showFailDialog();

return;

}

}

try{

mCamera.setPreviewDisplay(mSurfaceHolder);

mCamera.startPreview();

handleSurfaceChanged();

}catch(Exceptione1){

showFailDialog();

}

}

@Override

publicvoidsurfaceDestroyed(SurfaceHolderarg0){

}

publicbooleanstartRecording(){

if(mediaRecorder==null){

if(!initRecorder())

returnfalse;

}

mediaRecorder.setOnInfoListener(this);

mediaRecorder.setOnErrorListener(this);

mediaRecorder.start();

returntrue;

}

publicbooleanisSdcardExist(){

returnandroid.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

}

@SuppressLint("NewApi")

privatebooleaninitRecorder(){

if(!isSdcardExist()){

showNoSDCardDialog();

returnfalse;

}

if(mCamera==null){

if(!initCamera()){

showFailDialog();

returnfalse;

}

}

mVideoView.setVisibility(View.VISIBLE);

mCamera.stopPreview();

mediaRecorder=newMediaRecorder();

mCamera.unlock();

mediaRecorder.setCamera(mCamera);

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);

mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

if(frontCamera==1){

mediaRecorder.setOrientationHint(270);

}else{

mediaRecorder.setOrientationHint(90);

}

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

// 設(shè)置分辨率,應(yīng)設(shè)置在格式和編碼器

//? ? ? ? mediaRecorder.setVideoSize(previewWidth, previewHeight);

mediaRecorder.setVideoEncodingBitRate(384*1024);

// 設(shè)置幀率,應(yīng)設(shè)置在格式和編碼器

if(defaultVideoFrameRate!=-1){

mediaRecorder.setVideoFrameRate(defaultVideoFrameRate);

}

// 設(shè)置視頻文件的路徑

localPath=PathUtil.getInstance().getVideoPath()+"/"

+System.currentTimeMillis()+".mp4";

mediaRecorder.setOutputFile(localPath);

mediaRecorder.setMaxDuration(30000);

mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

Log.i("fdsafasdfsadfasd","----------initRecorder-------"+localPath);

try{

mediaRecorder.prepare();

}catch(IllegalStateExceptione){

e.printStackTrace();

returnfalse;

}catch(IOExceptione){

e.printStackTrace();

returnfalse;

}

returntrue;

}

// 停止錄制

publicvoidstopRecording(){

if(mediaRecorder!=null){

mediaRecorder.setOnErrorListener(null);

mediaRecorder.setOnInfoListener(null);

try{

mediaRecorder.stop();

}catch(Exceptione){

}

}

releaseRecorder();

if(mCamera!=null){

mCamera.stopPreview();

releaseCamera();

}

}

privatevoidreleaseRecorder(){

if(mediaRecorder!=null){

mediaRecorder.release();

mediaRecorder=null;

}

}

protectedvoidreleaseCamera(){

try{

if(mCamera!=null){

mCamera.stopPreview();

mCamera.release();

mCamera=null;

}

}catch(Exceptione){

}

}

// 切換攝像頭

@SuppressLint("NewApi")

publicvoidswitchCamera(){

if(mCamera==null){

return;

}

if(Camera.getNumberOfCameras()>=2){

btn_switch.setEnabled(false);

if(mCamera!=null){

mCamera.stopPreview();

mCamera.release();

mCamera=null;

}

switch(frontCamera){

case0:

mCamera=Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);

frontCamera=1;

break;

case1:

mCamera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);

frontCamera=0;

break;

}

try{

mCamera.lock();

mCamera.setDisplayOrientation(90);

mCamera.setPreviewDisplay(mVideoView.getHolder());

mCamera.startPreview();

}catch(IOExceptione){

mCamera.release();

mCamera=null;

}

btn_switch.setEnabled(true);

}

}

MediaScannerConnectionmsc=null;

ProgressDialogprogressDialog=null;

publicvoidsendVideo(Viewview){

if(TextUtils.isEmpty(localPath)){

return;

}

if(msc==null)

msc=newMediaScannerConnection(this,

newMediaScannerConnection.MediaScannerConnectionClient(){

@Override

publicvoidonScanCompleted(Stringpath,Uriuri){

msc.disconnect();

progressDialog.dismiss();

setResult(RESULT_OK,getIntent().putExtra("uri",uri));

finish();

/*? String[] proj = {MediaStore.Images.Media.DATA};

Cursor actualimagecursor = managedQuery(uri, proj, null, null, null);

int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

actualimagecursor.moveToFirst();

String img_path = actualimagecursor.getString(actual_image_column_index);

ArrayList file_list = new ArrayList<>();

File file = new File(img_path);

file_list.add(file);

Intent intent = new Intent();

intent.setClass(MyRecorderVideoActivity.this, MovieBuffAddVideoActivity.class);

Bundle bundle = new Bundle();

bundle.putSerializable("file_list", file_list);

bundle.putString("localPath", localPath);

intent.putExtras(bundle);

startActivity(intent);

onBackPressed();*/

}

@Override

publicvoidonMediaScannerConnected(){

msc.scanFile(localPath,"video/*");

}

});

if(progressDialog==null){

progressDialog=newProgressDialog(this);

progressDialog.setMessage("processing...");

progressDialog.setCancelable(false);

}

progressDialog.show();

msc.connect();

}

@Override

publicvoidonInfo(MediaRecordermr,intwhat,intextra){

if(what==MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED){

stopRecording();

btn_switch.setVisibility(View.VISIBLE);

chronometer.stop();

btnStart.setVisibility(View.VISIBLE);

btnStop.setVisibility(View.INVISIBLE);

chronometer.stop();

if(localPath==null){

return;

}

Stringst3=getResources().getString(R.string.Whether_to_send);

newAlertDialog.Builder(this)

.setMessage("是否使用該視頻!")

.setPositiveButton(R.string.ok,

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacearg0,

intarg1){

arg0.dismiss();

sendVideo(null);

}

}).setNegativeButton(R.string.cancel,null)

.setCancelable(false).show();

}

}

@Override

publicvoidonError(MediaRecordermr,intwhat,intextra){

stopRecording();

Toast.makeText(this,"Recording error has occurred. Stopping the recording",Toast.LENGTH_SHORT).show();

}

publicvoidsaveBitmapFile(Bitmapbitmap){

Filefile=newFile(Environment.getExternalStorageDirectory(),"a.jpg");

try{

BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(file));

bitmap.compress(Bitmap.CompressFormat.JPEG,100,bos);

bos.flush();

bos.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

@Override

protectedvoidonDestroy(){

super.onDestroy();

releaseCamera();

if(mWakeLock!=null){

mWakeLock.release();

mWakeLock=null;

}

}

@Override

publicvoidonBackPressed(){

back(null);

}

privatevoidshowFailDialog(){

newAlertDialog.Builder(this)

.setTitle(R.string.prompt)

.setMessage(R.string.Open_the_equipment_failure)

.setPositiveButton(R.string.ok,

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,

intwhich){

finish();

}

}).setCancelable(false).show();

}

privatevoidshowNoSDCardDialog(){

newAlertDialog.Builder(this)

.setTitle(R.string.prompt)

.setMessage("No sd card!")

.setPositiveButton(R.string.ok,

newDialogInterface.OnClickListener(){

@Override

publicvoidonClick(DialogInterfacedialog,

intwhich){

finish();

}

}).setCancelable(false).show();

}

}

MyRecorderVideoActivity.java

下面是xml布局文件

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/rl_title"

android:layout_width="match_parent"

android:layout_height="45dp"

android:background="@color/bg_white">

android:id="@+id/rl_back"

android:layout_width="45dp"

android:layout_height="match_parent"

android:layout_alignParentLeft="true">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:layout_marginLeft="10dp"

android:background="@mipmap/rl_back"/>

android:id="@+id/tv_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:text="錄制視頻"

android:textColor="@color/bg_text_black"

android:textSize="@dimen/sixteen"/>

android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:id="@+id/mVideoView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"/>

android:id="@+id/switch_btn"

android:layout_width="35dip"

android:layout_height="35dip"

android:layout_alignParentRight="true"

android:layout_alignParentTop="true"

android:background="@drawable/em_camera_switch_selector"

android:visibility="invisible"/>

android:id="@+id/chronometer"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:background="@color/btn_gray_normal"

android:gravity="center_horizontal"

android:textColor="#FFF"/>

android:id="@+id/recorder_start"

android:layout_width="60dp"

android:layout_height="60dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:gravity="center"

android:src="@mipmap/em_video_recorder_start_btn"

android:visibility="visible"/>

android:id="@+id/recorder_stop"

android:layout_width="60dp"

android:layout_height="60dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:gravity="center"

android:src="@mipmap/em_video_recorder_stop_btn"

android:visibility="invisible"/>

來(lái)自CODE的代碼片

my_recorder_activity.xml

為此我也在網(wǎng)上找了一些資料悍手,不過(guò)大部分demo的原理也是MediaRecorder帘睦。但是我看到了我拍攝照片的方式袍患,就調(diào)用系統(tǒng)自帶的攝像頭,然后進(jìn)行拍攝竣付,獲取路徑就可以了诡延。因此我就想到了拍攝視頻如果使用系統(tǒng)自帶的錄制那就很好的能解決兼容性問(wèn)題了。唯一不好的就是拍攝界面無(wú)法自己定義古胆,各自手機(jī)自帶的是什么樣子的拍攝就保留怎樣的拍攝肆良。其實(shí)很簡(jiǎn)單:

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

//設(shè)置視頻大小

intent.putExtra(Android.provider.MediaStore.EXTRA_SIZE_LIMIT, 768000);

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);

//設(shè)置視頻時(shí)間

intent.putExtra(android.provider.MediaStore.EXTRA_DURATION_LIMIT, 10);

startActivityForResult(intent, REQUEST_CODE_MAP);

然后就是接收了:

Uri uri = data.getData();

// ? ? ? ? ? ? ? ? ? ?Uri uri = data.getParcelableExtra("uri");

String[] projects = new String[]{MediaStore.Video.Media.DATA,

MediaStore.Video.Media.DURATION};

Cursor cursor = getContentResolver().query(uri,projects, null, null, null);

int duration = 0;

String copyfilepaths="";

String filePath = null;

if (cursor.moveToFirst()) {

// 路徑:MediaStore.Audio.Media.DATA

filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));

try {

copyfilepaths=PathUtil.getInstance().getVideoPath() + "/" + System.currentTimeMillis() + ".mp4";

copyFileTo(new File(filePath),new File(copyfilepaths));

} catch (IOException e) {

e.printStackTrace();

}

// 總播放時(shí)長(zhǎng):MediaStore.Audio.Media.DURATION

duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));

}

if (cursor != null) {

cursor.close();

cursor = null;

}

File file = new File(PathUtil.getInstance().getImagePath(), "thvideo" + System.currentTimeMillis());

FileOutputStream fos = new FileOutputStream(file);

Bitmap ThumbBitmap = ThumbnailUtils.createVideoThumbnail(filePath, 5);

ThumbBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);

fos.close();

值得一提的是:必須要將保存下來(lái)的文件copy一次

因?yàn)樵谀承┦謾C(jī)使用中,上傳文件到服務(wù)器是不允許被上傳的逸绎,然后就導(dǎo)致服務(wù)器那邊就收不到文件惹恃,所以我寫了一個(gè)方法來(lái)轉(zhuǎn)換文件,其實(shí)也就是復(fù)制文件棺牧。

booleancopyFileTo(File?srcFile,?File?destFile)throwsIOException?{

if(srcFile.isDirectory()?||?destFile.isDirectory())

returnfalse;//判斷是否是文件

FileInputStream?fis?=newFileInputStream(srcFile);

FileOutputStream?fos?=newFileOutputStream(destFile);

intreadLen?=0;

byte[]?buf?=newbyte[1024];

while((readLen?=?fis.read(buf))?!=?-1)?{

fos.write(buf,0,?readLen);

}

fos.flush();

fos.close();

fis.close();

returntrue;

}

csdn項(xiàng)目地址:http://blog.csdn.net/greatdaocaoren/article/details/73497819

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫糙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颊乘,更是在濱河造成了極大的恐慌参淹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乏悄,死亡現(xiàn)場(chǎng)離奇詭異浙值,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)檩小,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門亥鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人识啦,你說(shuō)我怎么就攤上這事负蚊。” “怎么了颓哮?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵家妆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我冕茅,道長(zhǎng)伤极,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任姨伤,我火速辦了婚禮,結(jié)果婚禮上乍楚,老公的妹妹穿的比我還像新娘当编。我一直安慰自己徒溪,他們只是感情好忿偷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布嫂拴。 她就那樣靜靜地躺著套耕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舶吗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天誓琼,我揣著相機(jī)與錄音检激,去河邊找鬼。 笑死腹侣,一個(gè)胖子當(dāng)著我的面吹牛叔收,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傲隶,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼饺律,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跺株?” 一聲冷哼從身側(cè)響起蓝晒,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腮出,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芝薇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胚嘲,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年洛二,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馋劈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晾嘶,死狀恐怖妓雾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垒迂,我是刑警寧澤械姻,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站机断,受9級(jí)特大地震影響楷拳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吏奸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一欢揖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奋蔚,春花似錦她混、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至馒过,卻和暖如春晋涣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沉桌。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工谢鹊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人留凭。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓佃扼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蔼夜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兼耀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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