iOS 相機(jī)捕捉

AVFoundation 相關(guān)類

  • AVFoundation 框架基于以下幾個類實現(xiàn)圖像捕捉 怖侦,通過這些類可以訪問來自相機(jī)設(shè)備的原始數(shù)據(jù)并控制它的組件。
  • AVCaptureDevice
    是關(guān)于相機(jī)硬件的接口稽犁。它被用于控制硬件特性,諸如鏡頭的位置沉颂、曝光纯露、閃光燈等。
  • AVCaptureDeviceInput
    提供來自設(shè)備的數(shù)據(jù)辰斋。
  • AVCaptureOutput
    是一個抽象類策州,描述 capture session 的結(jié)果。以下是三種關(guān)于靜態(tài)圖片捕捉的具體子類:AVCaptureStillImageOutput用于捕捉靜態(tài)圖片
  • AVCaptureMetadataOutput
    啟用檢測人臉和二維碼
  • AVCaptureVideoOutput
    為實時預(yù)覽圖提供原始幀
  • AVCaptureSession
    管理輸入與輸出之間的數(shù)據(jù)流宫仗,以及在出現(xiàn)問題時生成運(yùn)行時錯誤够挂。
  • AVCaptureVideoPreviewLayer
    是 CALayer的子類,可被用于自動顯示相機(jī)產(chǎn)生的實時圖像藕夫。它還有幾個工具性質(zhì)的方法孽糖,可將 layer 上的坐標(biāo)轉(zhuǎn)化到設(shè)備上。它看起來像輸出毅贮,但其實不是办悟。另外,它擁有 session (outputs 被 session 所擁有)滩褥。

設(shè)置

  • 讓我們看看如何捕獲圖像病蛉。首先我們需要一個 AVCaptureSession
    對象:
    let session = AVCaptureSession()

  • 現(xiàn)在我們需要一個相機(jī)設(shè)備輸入。在大多數(shù) iPhone 和 iPad 中瑰煎,我們可以選擇后置攝像頭或前置攝像頭 -- 又稱自拍相機(jī) (selfie camera) -- 之一铺然。那么我們必須先遍歷所有能提供視頻數(shù)據(jù)的設(shè)備 (麥克風(fēng)也屬于 AVCaptureDevice
    ,因此略過不談)酒甸,并檢查 position
    屬性:
    let availableCameraDevices=AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) for device in availableCameraDevices as [AVCaptureDevice] { if device.position == .Back { backCameraDevice = device } else if device.position == .Front { frontCameraDevice = device }}

  • 然后探熔,一旦我們發(fā)現(xiàn)合適的相機(jī)設(shè)備,我們就能獲得相關(guān)的 AVCaptureDeviceInput對象烘挫。我們會將它設(shè)置為 session 的輸入:
    var error:NSError? let possibleCameraInput: AnyObject? = AVCaptureDeviceInput.deviceInputWithDevice(backCameraDevice, error: &error) if let backCameraInput = possibleCameraInput as? AVCaptureDeviceInput { if self.session.canAddInput(backCameraInput) { self.session.addInput(backCameraInput) }}

  • 注意當(dāng) app 首次運(yùn)行時诀艰,第一次調(diào)用 AVCaptureDeviceInput.deviceInputWithDevice()
    會觸發(fā)系統(tǒng)提示柬甥,向用戶請求訪問相機(jī)。這在 iOS 7 的時候只有部分國家會有其垄,到了 iOS 8 拓展到了所有地區(qū)苛蒲。除非得到用戶同意,否則相機(jī)的輸入會一直是一個黑色畫面的數(shù)據(jù)流绿满。
    對于處理相機(jī)的權(quán)限臂外,更合適的方法是先確認(rèn)當(dāng)前的授權(quán)狀態(tài)。要是在授權(quán)還沒有確定的情況下 (也就是說用戶還沒有看過彈出的授權(quán)對話框時)喇颁,我們應(yīng)該明確地發(fā)起請求漏健。
    let authorizationStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) switch authorizationStatus { case .NotDetermined: // 許可對話沒有出現(xiàn),發(fā)起授權(quán)許可 AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted:Bool) -> Void in if granted { // 繼續(xù) } else { // 用戶拒絕橘霎,無法繼續(xù) } })case .Authorized: // 繼續(xù)case .Denied, .Restricted: // 用戶明確地拒絕授權(quán)蔫浆,或者相機(jī)設(shè)備無法訪問}

  • 如果能繼續(xù)的話,我們會有兩種方式來顯示來自相機(jī)的圖像流姐叁。最簡單的就是瓦盛,生成一個帶有 AVCaptureVideoPreviewLayer
    的 view,并使用 capture session 作為初始化參數(shù)外潜。
    previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as AVCaptureVideoPreviewLayer previewLayer.frame = view.bounds view.layer.addSublayer(previewLayer)

AVCaptureVideoPreviewLayer

會自動地顯示來自相機(jī)的輸出原环。當(dāng)我們需要將實時預(yù)覽圖上的點擊轉(zhuǎn)換到設(shè)備的坐標(biāo)系統(tǒng)中,比如點擊某區(qū)域?qū)崿F(xiàn)對焦時处窥,這種做法會很容易辦到嘱吗。之后我們會看到具體細(xì)節(jié)。
第二種方法是從輸出數(shù)據(jù)流捕捉單一的圖像幀滔驾,并使用 OpenGL 手動地把它們顯示在 view 上柜与。這有點復(fù)雜,但是如果我們想要對實時預(yù)覽圖進(jìn)行操作或使用濾鏡的話嵌灰,就是必要的了。
為獲得數(shù)據(jù)流颅悉,我們需要創(chuàng)建一個 AVCaptureVideoDataOutput
沽瞭,這樣一來,當(dāng)相機(jī)在運(yùn)行時剩瓶,我們通過代理方法 captureOutput(_:didOutputSampleBuffer:fromConnection:)
就能獲得所有圖像幀 (除非我們處理太慢而導(dǎo)致掉幀)驹溃,然后將它們繪制在一個 GLKView中。不需要對 OpenGL 框架有什么深刻的理解延曙,我們只需要這樣就能創(chuàng)建一個 GLKView
glContext = EAGLContext(API: .OpenGLES2) glView = GLKView(frame: viewFrame, context: glContext) ciContext = CIContext(EAGLContext: glContext)

  • AVCaptureVideoOutput
    videoOutput = AVCaptureVideoDataOutput() videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL)) if session.canAddOutput(self.videoOutput) { session.addOutput(self.videoOutput)}

  • 代理方法:
    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) let image = CIImage(CVPixelBuffer: pixelBuffer) if glContext != EAGLContext.currentContext() { EAGLContext.setCurrentContext(glContext) } glView.bindDrawable() ciContext.drawImage(image, inRect:image.extent(), fromRect: image.extent()) glView.display()}

一個警告:這些來自相機(jī)的樣本旋轉(zhuǎn)了 90 度豌鹤,這是由于相機(jī)傳感器的朝向所導(dǎo)致的。AVCaptureVideoPreviewLayer會自動處理這種情況枝缔,但在這個例子布疙,我們需要對 GLKView進(jìn)行旋轉(zhuǎn)蚊惯。

  • 馬上就要搞定了。最后一個組件 -- AVCaptureStillImageOutput
    -- 實際上是最重要的灵临,因為它允許我們捕捉靜態(tài)圖片截型。只需要創(chuàng)建一個實例,并添加到 session 里去:
    stillCameraOutput = AVCaptureStillImageOutput() if self.session.canAddOutput(self.stillCameraOutput) { self.session.addOutput(self.stillCameraOutput)}

配置

現(xiàn)在我們有了所有必需的對象儒溉,應(yīng)該為我們的需求尋找最合適的配置宦焦。這里又有兩種方法可以實現(xiàn)。最簡單且最推薦是使用
session preset: session.sessionPreset = AVCaptureSessionPresetPhoto

  • AVCaptureSessionPresetPhoto
    會為照片捕捉選擇最合適的配置顿涣,比如它可以允許我們使用最高的感光度 (ISO) 和曝光時間波闹,基于相位檢測 (phase detection)的自動對焦, 以及輸出全分辨率的 JPEG 格式壓縮的靜態(tài)圖片。
    然而涛碑,如果你需要更多的操控精堕,可以使用 AVCaptureDeviceFormat
    這個類,它描述了一些設(shè)備使用的參數(shù)锌唾,比如靜態(tài)圖片分辨率锄码,視頻預(yù)覽分辨率,自動對焦類型晌涕,感光度和曝光時間限制等滋捶。每個設(shè)備支持的格式都列在 AVCaptureDevice.formats
    屬性中,并可以賦值給 AVCaptureDevice
    的 activeFormat
    (注意你并不能修改格式)余黎。
    操作相機(jī)
    iPhone 和 iPad 中內(nèi)置的相機(jī)或多或少跟其他相機(jī)有相同的操作重窟,不同的是,一些參數(shù)如對焦惧财、曝光時間 (在單反相機(jī)上的模擬快門的速度)巡扇,感光度是可以調(diào)節(jié),但是鏡頭光圈是固定不可調(diào)整的垮衷。到了 iOS 8厅翔,我們已經(jīng)可以對所有這些可變參數(shù)進(jìn)行手動調(diào)整了。
    我們之后會看到細(xì)節(jié)搀突,不過首先刀闷,該啟動相機(jī)了:
    sessionQueue = dispatch_queue_create("com.example.camera.capture_session", DISPATCH_QUEUE_SERIAL) dispatch_async(sessionQueue) { () -> Void in self.session.startRunning()}

在 session 和相機(jī)設(shè)備中完成的所有操作和配置都是利用 block 調(diào)用的。因此仰迁,建議將這些操作分配到后臺的串行隊列中甸昏。此外,相機(jī)設(shè)備在改變某些參數(shù)前必須先鎖定徐许,直到改變結(jié)束才能解鎖施蜜,例如:
var error:NSError? if currentDevice.lockForConfiguration(&error) { // 鎖定成功,繼續(xù)配置 // currentDevice.unlockForConfiguration()}else { // 出錯雌隅,相機(jī)可能已經(jīng)被鎖}

對焦

在 iOS 相機(jī)上翻默,對焦是通過移動鏡片改變其到傳感器之間的距離實現(xiàn)的缸沃。
自動對焦是通過相位檢測和反差檢測實現(xiàn)的。然而冰蘑,反差檢測只適用于低分辨率和高 FPS 視頻捕捉 (慢鏡頭)和泌。

編者注 關(guān)于相位對焦和反差對焦(http://ask.zealer.com/post/149)。

  • AVCaptureFocusMode
    是個枚舉祠肥,描述了可用的對焦模式:
  • Locked
    指鏡片處于固定位置
  • AutoFocus
    指一開始相機(jī)會先自動對焦一次武氓,然后便處于 Locked
    模式。
  • ContinuousAutoFocus
    指當(dāng)場景改變仇箱,相機(jī)會自動重新對焦到畫面的中心點县恕。

設(shè)置想要的對焦模式必須在鎖定之后實施:
let focusMode:AVCaptureFocusMode = ... if currentCameraDevice.isFocusModeSupported(focusMode) { ... // 鎖定以進(jìn)行配置 currentCameraDevice.focusMode = focusMode ... // 解鎖 }}

通常情況下,AutoFocus模式會試圖讓屏幕中心成為最清晰的區(qū)域剂桥,但是也可以通過變換 “感興趣的點 (point of interest)” 來設(shè)定另一個區(qū)域忠烛。這個點是一個 CGPoint,它的值從左上角 {0权逗,0}
到右下角 {1美尸,1},{0.5斟薇,0.5}為畫面的中心點师坎。通常可以用視頻預(yù)覽圖上的點擊手勢識別來改變這個點堪滨,想要將 view 上的坐標(biāo)轉(zhuǎn)化到設(shè)備上的規(guī)范坐標(biāo)胯陋,我們可以使用 AVVideoCaptureVideoPreviewLayer.captureDevicePointOfInterestForPoint()

var pointInPreview = focusTapGR.locationInView(focusTapGR.view) var pointInCamera = previewLayer.captureDevicePointOfInterestForPoint(pointInPreview) ...// 鎖定,配置// 設(shè)置感興趣的點currentCameraDevice.focusPointOfInterest = pointInCamera// 在設(shè)置的點上切換成自動對焦currentCameraDevice.focusMode = .AutoFocus...// 解鎖

在 iOS 8 中袱箱,有個新選項可以移動鏡片的位置遏乔,從較近物體的 0.0
到較遠(yuǎn)物體的 1.0
(不是指無限遠(yuǎn))。
... // 鎖定发笔,配置var lensPosition:Float = ... // 0.0 到 1.0的float currentCameraDevice.setFocusModeLockedWithLensPosition(lensPosition) { (timestamp:CMTime) -> Void in // timestamp 對應(yīng)于應(yīng)用了鏡片位置的第一張圖像緩存區(qū)}... // 解鎖

這意味著對焦可以使用 UISlider
設(shè)置盟萨,這有點類似于旋轉(zhuǎn)單反上的對焦環(huán)。當(dāng)用這種相機(jī)手動對焦時了讨,通常有一個可見的輔助標(biāo)識指向清晰的區(qū)域捻激。AVFoundation 里面沒有內(nèi)置這種機(jī)制,但是比如可以通過顯示 "對焦峰值 (focus peaking)"(一種將已對焦區(qū)域高亮顯示的方式) 這樣的手段來補(bǔ)救量蕊。我們在這里不會討論細(xì)節(jié),不過對焦峰值可以很容易地實現(xiàn)艇挨,通過使用閾值邊緣 (threshold edge) 濾鏡 (用自定義 CIFilter
GPUImageThresholdEdgeDetectionFilter
)残炮,并調(diào)用 AVCaptureAudioDataOutputSampleBufferDelegate
下的 captureOutput(_:didOutputSampleBuffer:fromConnection:)
方法將它覆蓋到實時預(yù)覽圖上。
曝光
在 iOS 設(shè)備上缩滨,鏡頭上的光圈是固定的 (在 iPhone 5s 以及其之后的光圈值是 f/2.2势就,之前的是 f/2.4)泉瞻,因此只有改變曝光時間和傳感器的靈敏度才能對圖片的亮度進(jìn)行調(diào)整,從而達(dá)到合適的效果苞冯。至于對焦袖牙,我們可以選擇連續(xù)自動曝光,在“感興趣的點”一次性自動曝光舅锄,或者手動曝光鞭达。除了指定“感興趣的點”,我們可以通過設(shè)置曝光補(bǔ)償 (compensation) 修改自動曝光皇忿,也就是曝光檔位的目標(biāo)偏移畴蹭。目標(biāo)偏移在曝光檔數(shù)里有講到,它的范圍在 minExposureTargetBias
與 maxExposureTargetBias
之間鳍烁,0為默認(rèn)值 (即沒有“補(bǔ)償”)叨襟。
var exposureBias:Float = ... // 在 minExposureTargetBias 和 maxExposureTargetBias 之間的值 ... // 鎖定,配置currentDevice.setExposureTargetBias(exposureBias) { (time:CMTime) -> Void in }... // 解鎖

使用手動曝光幔荒,我們可以設(shè)置 ISO 和曝光時間糊闽,兩者的值都必須在設(shè)備當(dāng)前格式所指定的范圍內(nèi)。
var activeFormat = currentDevice.activeFormat var duration:CTime = ... //在activeFormat.minExposureDuration 和 activeFormat.maxExposureDuration 之間的值爹梁,或用 AVCaptureExposureDurationCurrent 表示不變 var iso:Float = ... // 在 activeFormat.minISO 和 activeFormat.maxISO 之間的值右犹,或用 AVCaptureISOCurrent 表示不變 ... // 鎖定,配置currentDevice.setExposureModeCustomWithDuration(duration, ISO: iso) { (time:CMTime) -> Void in }... // 解鎖

如何知道照片曝光是否正確呢卫键?我們可以通過 KVO傀履,觀察 AVCaptureDevice
的 exposureTargetOffset
屬性,確認(rèn)是否在 0 附近莉炉。
白平衡
數(shù)碼相機(jī)為了適應(yīng)不同類型的光照條件需要補(bǔ)償钓账。這意味著在冷光線的條件下,傳感器應(yīng)該增強(qiáng)紅色部分絮宁,而在暖光線下增強(qiáng)藍(lán)色部分梆暮。在 iPhone 相機(jī)中,設(shè)備會自動決定合適的補(bǔ)光绍昂,但有時也會被場景的顏色所混淆失效啦粹。幸運(yùn)地是,iOS 8 可以里手動控制白平衡窘游。
自動模式工作方式和對焦唠椭、曝光的方式一樣,但是沒有“感興趣的點”忍饰,整張圖像都會被納入考慮范圍贪嫂。在手動模式,我們可以通過開爾文所表示的溫度來調(diào)節(jié)色溫和色彩艾蓝。典型的色溫值在 2000-3000K (類似蠟燭或燈泡的暖光源) 到 8000K (純凈的藍(lán)色天空) 之間力崇。色彩范圍從最小的 -150 (偏綠) 到 150 (偏品紅)斗塘。
溫度和色彩可以被用于計算來自相機(jī)傳感器的恰當(dāng)?shù)?RGB 值,因此僅當(dāng)它們做了基于設(shè)備的校正后才能被設(shè)置亮靴。
以下是全部過程:
var incandescentLightCompensation = 3_000 var tint = 0 // 不調(diào)節(jié) let temperatureAndTintValues = AVCaptureWhiteBalanceTemperatureAndTintValues(temperature: incandescentLightCompensation, tint: tint) var deviceGains = currentCameraDevice.deviceWhiteBalanceGainsForTemperatureAndTintValues(temperatureAndTintValues) ... // 鎖定馍盟,配置currentCameraDevice.setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains(deviceGains) { (timestamp:CMTime) -> Void in } }... // 解鎖

實時人臉檢測

  • AVCaptureMetadataOutput
    可以用于檢測人臉和二維碼這兩種物體。很明顯茧吊,沒什么人用二維碼 (編者注: 因為在歐美現(xiàn)在二維碼不是很流行贞岭,這里是一個惡搞。鏈接的這個 tumblr 博客的主題是 “當(dāng)人們在掃二維碼時的圖片”饱狂,但是 2012 年開博至今沒有任何一張圖片曹步,暗諷二維碼根本沒人在用,這和以中日韓為代表的亞洲用戶群體的使用習(xí)慣完全相悖)休讳,因此我們就來看看如何實現(xiàn)人臉檢測讲婚。我們只需通過 AVCaptureMetadataOutput
    的代理方法捕獲的元對象:
    var metadataOutput = AVCaptureMetadataOutput() metadataOutput.setMetadataObjectsDelegate(self, queue: self.sessionQueue) if session.canAddOutput(metadataOutput) { session.addOutput(metadataOutput)}metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeFace]

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { for metadataObject in metadataObjects as [AVMetadataObject] { if metadataObject.type == AVMetadataObjectTypeFace { var transformedMetadataObject = previewLayer.transformedMetadataObjectForMetadataObject(metadataObject) } }

更多關(guān)于人臉檢測與識別的內(nèi)容請查看 (http://objccn.io/issue-21-9)。
捕捉靜態(tài)圖片
最后俊柔,我們要做的是捕捉高分辨率的圖像筹麸,于是我們調(diào)用 captureStillImageAsynchronouslyFromConnection(connection, completionHandler)
。在數(shù)據(jù)時被讀取時雏婶,completion handler 將會在某個未指定的線程上被調(diào)用物赶。
如果設(shè)置使用 JPEG 編碼作為靜態(tài)圖片輸出,不管是通過 session .Photo
預(yù)設(shè)設(shè)定的留晚,還是通過設(shè)備輸出設(shè)置設(shè)定的酵紫,sampleBuffer
都會返回包含圖像的元數(shù)據(jù)。如果在 AVCaptureMetadataOutput
中是可用的話错维,這會包含 EXIF 數(shù)據(jù)奖地,或是被識別的人臉等:
dispatch_async(sessionQueue) { () -> Void in let connection = self.stillCameraOutput.connectionWithMediaType(AVMediaTypeVideo) // 將視頻的旋轉(zhuǎn)與設(shè)備同步 connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.currentDevice().orientation.rawValue)! self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connection) { (imageDataSampleBuffer, error) -> Void in if error == nil { // 如果使用 session .Photo 預(yù)設(shè),或者在設(shè)備輸出設(shè)置中明確進(jìn)行了設(shè)置 // 我們就能獲得已經(jīng)壓縮為JPEG的數(shù)據(jù) let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) // 樣本緩沖區(qū)也包含元數(shù)據(jù)赋焕,我們甚至可以按需修改它 let metadata:NSDictionary = CMCopyDictionaryOfAttachments(nil, imageDataSampleBuffer, CMAttachmentMode(kCMAttachmentMode_ShouldPropagate)).takeUnretainedValue() if let image = UIImage(data: imageData) { // 保存圖片参歹,或者做些其他想做的事情 ... } } else { NSLog("error while capturing still image: (error)") } }}

  • 當(dāng)圖片被捕捉的時候,有視覺上的反饋是很好的體驗隆判。想要知道何時開始以及何時結(jié)束的話犬庇,可以使用 KVO 來觀察 AVCaptureStillImageOutput
    的 isCapturingStillImage
    屬性。
    分級捕捉
    在 iOS 8 還有一個有趣的特性叫“分級捕捉”侨嘀,可以在不同的曝光設(shè)置下拍攝幾張照片臭挽。這在復(fù)雜的光線下拍照顯得非常有用,例如咬腕,通過設(shè)定 -1欢峰、0、1 三個不同的曝光檔數(shù),然后用 HDR 算法合并成一張赤赊。
    以下是代碼實現(xiàn):
    dispatch_async(sessionQueue) { () -> Void in let connection = self.stillCameraOutput.connectionWithMediaType(AVMediaTypeVideo) connection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.currentDevice().orientation.rawValue)! var settings = [-1.0, 0.0, 1.0].map { (bias:Float) -> AVCaptureAutoExposureBracketedStillImageSettings in AVCaptureAutoExposureBracketedStillImageSettings.autoExposureSettingsWithExposureTargetBias(bias) } var counter = settings.count self.stillCameraOutput.captureStillImageBracketAsynchronouslyFromConnection(connection, withSettingsArray: settings) { (sampleBuffer, settings, error) -> Void in ... // 保存 sampleBuffer(s) // 當(dāng)計數(shù)為0,捕捉完成 counter-- }}

原文鏈接 https://www.objc.io/issues/21-camera-and-photos/camera-capture-on-ios/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煞赢,一起剝皮案震驚了整個濱河市抛计,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌照筑,老刑警劉巖吹截,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凝危,居然都是意外死亡波俄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蛾默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懦铺,“玉大人,你說我怎么就攤上這事支鸡《睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵牧挣,是天一觀的道長急前。 經(jīng)常有香客問我,道長瀑构,這世上最難降的妖魔是什么裆针? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮寺晌,結(jié)果婚禮上世吨,老公的妹妹穿的比我還像新娘。我一直安慰自己折剃,他們只是感情好另假,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怕犁,像睡著了一般边篮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奏甫,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天戈轿,我揣著相機(jī)與錄音,去河邊找鬼阵子。 笑死思杯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播色乾,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼誊册,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暖璧?” 一聲冷哼從身側(cè)響起案怯,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎办,沒想到半個月后嘲碱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡局蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年麦锯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅绅。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扶欣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出千扶,到底是詐尸還是另有隱情宵蛀,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布县貌,位于F島的核電站术陶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏煤痕。R本人自食惡果不足惜梧宫,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摆碉。 院中可真熱鬧塘匣,春花似錦、人聲如沸巷帝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邀杏。三九已至庶诡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堕阔,已是汗流浹背棍厂。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留超陆,地道東北人牺弹。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親张漂。 傳聞我的和親對象是個殘疾皇子晶默,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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