AVAudioSession

這里首先感謝CZ_iOS
看了他的博客,自己做了下記錄.
iOS給出的解決方案是"AVAudioSession" 规揪,通過它可以實(shí)現(xiàn)對(duì)App當(dāng)前上下文音頻資源的控制,比如
插拔耳機(jī)温峭、接電話猛铅、是否和其他音頻數(shù)據(jù)混音等。當(dāng)你遇到:

是進(jìn)行錄音還是播放凤藏?
當(dāng)系統(tǒng)靜音鍵按下時(shí)該如何表現(xiàn)奕坟?
是從揚(yáng)聲器還是從聽筒里面播放聲音?
插拔耳機(jī)后如何表現(xiàn)清笨?
來電話/鬧鐘響了后如何表現(xiàn)月杉?
其他音頻App啟動(dòng)后如何表現(xiàn)?
...
這些場(chǎng)景的時(shí)候抠艾,就可以考慮一下“AVAudioSession”了苛萎。

在很久以前(其實(shí)也是不是太久--iOS7以前)還有個(gè)AudioSession的存在,其功能與AVAudioSession類似检号,但是在iOS7 以后就已經(jīng)被標(biāo)記為
“Not Applicable”,所以如果Google到了說AudioSession的內(nèi)容而不是用的AVAudioSession腌歉,那么就可以直接PASS了,當(dāng)然如果要兼容iOS6
就另當(dāng)別論了齐苛,不過現(xiàn)在QQ/微信都是要求iOS7的情況下翘盖,是否需要兼容iOS6就看老板們的意思吧。

Session默認(rèn)行為

  • 可以進(jìn)行播放凹蜂,但是不能進(jìn)行錄制馍驯。
  • 當(dāng)用戶將手機(jī)上的靜音撥片撥到“靜音”狀態(tài)時(shí),此時(shí)如果正在播放音頻玛痊,那么播放內(nèi)容會(huì)被靜音汰瘫。
  • 當(dāng)用戶按了手機(jī)的鎖屏鍵或者手機(jī)自動(dòng)鎖屏了,此時(shí)如果正在播放音頻擂煞,那么播放會(huì)靜音并被暫停混弥。
  • 如果你的App在開始播放的時(shí)候,此時(shí)QQ音樂等其他App正在播放对省,那么其他播放器會(huì)被靜音并暫停蝗拿。

默認(rèn)的行為相當(dāng)于設(shè)置了Category為“AVAudioSessionCategorySoloAmbient”

來看Demo晾捏。

通過這播放器demo可以驗(yàn)證上面的默認(rèn)Session行為。

AVAudioSession

AVAudioSession以一個(gè)單例實(shí)體的形式存在哀托,通過類方法:

+ (AVAudioSession *)sharedInstance;

獲得單例粟瞬。

雖然系統(tǒng)會(huì)在App啟動(dòng)的時(shí)候,激活這個(gè)唯一的AVAudioSession萤捆,但是最好還是在自己ViewController的viewDidLoad里面再次進(jìn)行激活:

- (BOOL)setActive:(BOOL)active 
        error:(NSError * _Nullable *)outError;

通過設(shè)置active為"YES"激活Session裙品,設(shè)置為“?NO”解除Session的激活狀態(tài)。BOOL返回值表示是否成功俗或,如果失敗的話可以通過NSError的error.localizedDescription查看出錯(cuò)原因市怎。

因?yàn)锳VAudioSession會(huì)影響其他App的表現(xiàn),當(dāng)自己App的Session被激活辛慰,其他App的就會(huì)被解除激活探熔,如何要讓自己的Session解除激活后恢復(fù)其他App Session的激活狀態(tài)呢媚值?

此時(shí)可以使用:

  • (BOOL)setActive:(BOOL)active
    withOptions:(AVAudioSessionSetActiveOptions)options
    error:(NSError * _Nullable *)outError;

這里的options傳入AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation 即可。

當(dāng)然,也可以通過otherAudioPlaying變量來提前判斷當(dāng)前是否有其他App在播放音頻筑凫。

可以通過:

@property(readonly) NSString *category;

屬性庐冯,獲取當(dāng)前的Category盈滴,比如上面的播放其欲账,默認(rèn)是

 NSLog(@"Current Category:%@", [AVAudioSession sharedInstance].category);

輸出:

Current Category:AVAudioSessionCategorySoloAmbien

七大Category

AVAudioSession主要能控制App的哪些表現(xiàn)以及如何控制的呢?首先AVAudioSession將使用音頻的場(chǎng)景分成七大類溺职,通過設(shè)置Session為不同的類別岔擂,可以控制:

  • 當(dāng)App激活Session的時(shí)候,是否會(huì)打斷其他不支持混音的App聲音
  • 當(dāng)用戶觸發(fā)手機(jī)上的“靜音”鍵時(shí)或者鎖屏?xí)r浪耘,是否相應(yīng)靜音
  • 當(dāng)前狀態(tài)是否支持錄音
  • 當(dāng)前狀態(tài)是否支持播放
    每個(gè)App啟動(dòng)時(shí)都會(huì)設(shè)置成上面說的默認(rèn)狀態(tài)乱灵,即其他App會(huì)被中斷同時(shí)相應(yīng)“靜音”鍵的播放模式。通過下表可以細(xì)分每個(gè)類別的支持情況:
類別 當(dāng)按“靜音”或者鎖屏是是否靜音 是否引起不支持混音的App中斷 是否支持錄音和播放
AVAudioSessionCategoryAmbient 只支持播放
AVAudioSessionCategoryAudioProcessing - 都不支持
AVAudioSessionCategoryMultiRoute 既可以錄音也可以播放
AVAudioSessionCategoryPlayAndRecord 默認(rèn)不引起 既可以錄音也可以播放
AVAudioSessionCategoryPlayback 默認(rèn)引起 只用于播放
AVAudioSessionCategoryRecord 只用于錄音
AVAudioSessionCategorySoloAmbient 只用于播放

可以看到七冲,其實(shí)默認(rèn)的就是“AVAudioSessionCategorySoloAmbient”類別痛倚。從表中我們可以總結(jié)如下:

AVAudioSessionCategoryAmbient : 只用于播放音樂時(shí),并且可以和QQ音樂同時(shí)播放澜躺,比如玩游戲的時(shí)候還想聽QQ音樂的歌蝉稳,那么把游戲播放背景音就設(shè)置成這種類別。同時(shí)苗踪,當(dāng)用戶鎖屏或者靜音時(shí)也會(huì)隨著靜音颠区,這種類別基本使用所有App的背景場(chǎng)景。
AVAudioSessionCategorySoloAmbient: 也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是通铲,用了它就別想聽QQ音樂了,比如不希望QQ音樂干擾的App器贩,類似節(jié)奏大師颅夺。同樣當(dāng)用戶鎖屏或者靜音時(shí)也會(huì)隨著靜音朋截,鎖屏了就玩不了節(jié)奏大師了。
AVAudioSessionCategoryPlayback: 如果鎖屏了還想聽聲音怎么辦吧黄?用這個(gè)類別部服,比如App本身就是播放器,同時(shí)當(dāng)App播放時(shí)拗慨,其他類似QQ音樂就不能播放了廓八。所以這種類別一般用于播放器類App
AVAudioSessionCategoryRecord: 有了播放器,肯定要錄音機(jī)赵抢,比如微信語音的錄制剧蹂,就要用到這個(gè)類別,既然要安靜的錄音烦却,肯定不希望有QQ音樂了宠叼,所以其他播放聲音會(huì)中斷。想想微信語音的場(chǎng)景其爵,就知道什么時(shí)候用他了冒冬。
AVAudioSessionCategoryPlayAndRecord: 如果既想播放又想錄制該用什么模式呢?比如VoIP摩渺,打電話這種場(chǎng)景简烤,PlayAndRecord就是專門為這樣的場(chǎng)景設(shè)計(jì)的 。
AVAudioSessionCategoryMultiRoute: 想象一個(gè)DJ用的App摇幻,手機(jī)連著HDMI到揚(yáng)聲器播放當(dāng)前的音樂乐埠,然后耳機(jī)里面播放下一曲,這種常人不理解的場(chǎng)景囚企,這個(gè)類別可以支持多個(gè)設(shè)備輸入輸出丈咐。
AVAudioSessionCategoryAudioProcessing: 主要用于音頻格式處理,一般可以配合AudioUnit進(jìn)行使用
了解了這七大類別龙宏,我們就可以根據(jù)自己的需要進(jìn)行對(duì)應(yīng)類別的設(shè)置了:

  • (BOOL)setCategory:(NSString *)category error:(NSError **)outError;
    傳入對(duì)應(yīng)的列表枚舉即可棵逊。如果返回"NO"可以通過NSError的error.localizedDescription查看原因。

可以通過:

@property(readonly) NSArray<NSString *> *availableCategories;
屬性银酗,查看當(dāng)前設(shè)備支持哪些類別辆影,然后再進(jìn)行設(shè)置,從而保證傳入?yún)?shù)的合法黍特,減少錯(cuò)誤的可能蛙讥。

比如修改上面的Demo例子:

NSLog(@"Current Category:%@", [AVAudioSession sharedInstance].category);
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
if (nil != error) {
    NSLog(@"set Option error %@", error.localizedDescription);
}
NSLog(@"Current Category:%@", [AVAudioSession sharedInstance].category);

此時(shí)在播放音樂的時(shí)候,再去按下靜音鍵灭衷,會(huì)發(fā)現(xiàn)次慢,音樂還在繼續(xù)播放,不會(huì)被靜音。

類別的選項(xiàng)
上面介紹的這個(gè)七大類別迫像,可以認(rèn)為是設(shè)定了七種主場(chǎng)景劈愚,而這七類肯定是不能滿足開發(fā)者所有的需求的。CoreAudio提供的方法是闻妓,首先定下七種的一種基調(diào)菌羽,然后在進(jìn)行微調(diào)。CoreAudio為每種Category都提供了些許選項(xiàng)來進(jìn)行微調(diào)由缆。
在設(shè)置完類別后注祖,可以通過

@property(readonly) AVAudioSessionCategoryOptions categoryOptions;
屬性,查看當(dāng)前類別設(shè)置了哪些選項(xiàng)均唉,注意這里的返回值是AVAudioSessionCategoryOptions是晨,實(shí)際是多個(gè)options的“|”運(yùn)算。默認(rèn)情況下是0浸卦。

選項(xiàng) 適用類別 作用
AVAudioSessionCategoryOptionMixWithOthers AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute 是否可以和其他后臺(tái)App進(jìn)行混音
AVAudioSessionCategoryOptionDuckOthers AVAudioSessionCategoryAmbient, AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute 是否壓低其他App聲音
AVAudioSessionCategoryOptionAllowBluetooth AVAudioSessionCategoryRecord and AVAudioSessionCategoryPlayAndRecord 是否支持藍(lán)牙耳機(jī)
AVAudioSessionCategoryOptionDefaultToSpeaker AVAudioSessionCategoryPlayAndRecord 是否默認(rèn)用免提聲音
目前主要的選項(xiàng)有這幾種署鸡,都有對(duì)應(yīng)的使用場(chǎng)景,除此之外限嫌,在iOS9還提供了AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers最新的iOS10又新加了兩個(gè)AVAudioSessionCategoryOptionAllowBluetoothA2DP 靴庆、AVAudioSessionCategoryOptionAllowAirPlay用來支持藍(lán)牙A2DP耳機(jī)和AirPlay。

來看每個(gè)選項(xiàng)的基本作用:

AVAudioSessionCategoryOptionMixWithOthers : 如果確實(shí)用的AVAudioSessionCategoryPlayback實(shí)現(xiàn)的一個(gè)背景音怒医,但是呢炉抒,又想和QQ音樂并存,那么可以在AVAudioSessionCategoryPlayback類別下在設(shè)置這個(gè)選項(xiàng)稚叹,就可以實(shí)現(xiàn)共存了焰薄。
AVAudioSessionCategoryOptionDuckOthers:在實(shí)時(shí)通話的場(chǎng)景,比如QQ音樂扒袖,當(dāng)進(jìn)行視頻通話的時(shí)候塞茅,會(huì)發(fā)現(xiàn)QQ音樂自動(dòng)聲音降低了,此時(shí)就是通過設(shè)置這個(gè)選項(xiàng)來對(duì)其他音樂App進(jìn)行了壓制季率。
AVAudioSessionCategoryOptionAllowBluetooth:如果要支持藍(lán)牙耳機(jī)電話野瘦,則需要設(shè)置這個(gè)選項(xiàng)
AVAudioSessionCategoryOptionDefaultToSpeaker: 如果在VoIP模式下,希望默認(rèn)打開免提功能飒泻,需要設(shè)置這個(gè)選項(xiàng)
通過接口:

  • (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
    來對(duì)當(dāng)前的類別進(jìn)行選項(xiàng)的設(shè)置鞭光。

比如Demo中:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&error];
if (nil != error) {
    NSLog(@"set Option error %@", error.localizedDescription);
}
options = [[AVAudioSession sharedInstance] categoryOptions];
NSLog(@"Category[%@] has %lu options",  [AVAudioSession sharedInstance].category, options);

此時(shí),先打開QQ音樂播放器泞遗,然后再開始進(jìn)行播放惰许,會(huì)發(fā)現(xiàn),QQ和我們的播放器都在播放史辙,并且進(jìn)行了自動(dòng)混音汹买。

不過這個(gè)過程佩伤,感覺CoreAudio缺少一個(gè)setOption的接口,既然已經(jīng)是當(dāng)前處于的Category卦睹,干嘛還要再設(shè)置選項(xiàng)的時(shí)候再指定Category呢畦戒?方库?疑惑结序。。纵潦。

七大模式
剛講完七大類別徐鹤,現(xiàn)在再來七大模式。通過上面的七大類別邀层,我們基本覆蓋了常用的主場(chǎng)景返敬,在每個(gè)主場(chǎng)景中可以通過Option進(jìn)行微調(diào)。為此CoreAudio提供了七大比較常見微調(diào)后的子場(chǎng)景寥院。叫做各個(gè)類別的模式劲赠。

模式 適用的類別 場(chǎng)景
AVAudioSessionModeDefault 所有類別 默認(rèn)的模式
AVAudioSessionModeVoiceChat AVAudioSessionCategoryPlayAndRecord VoIP
AVAudioSessionModeGameChat AVAudioSessionCategoryPlayAndRecord 游戲錄制,由GKVoiceChat自動(dòng)設(shè)置秸谢,無需手動(dòng)調(diào)用
AVAudioSessionModeVideoRecording AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord 錄制視頻時(shí)
AVAudioSessionModeMoviePlayback AVAudioSessionCategoryPlayback 視頻播放
AVAudioSessionModeMeasurement AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback 最小系統(tǒng)
AVAudioSessionModeVideoChat AVAudioSessionCategoryPlayAndRecord 視頻通話
每個(gè)模式有其適用的類別凛澎,所以,并不是有“七七 四十九”種組合估蹄。如果當(dāng)前處于的類別下沒有這個(gè)模式塑煎,那么是設(shè)置不成功的。設(shè)置完Category后可以通過:

@property(readonly) NSArray<NSString *> *availableModes;
屬性臭蚁,查看其支持哪些屬性最铁,做合法性校驗(yàn)。

來看具體應(yīng)用:

AVAudioSessionModeDefault: 每種類別默認(rèn)的就是這個(gè)模式垮兑,所有要想還原的話冷尉,就設(shè)置成這個(gè)模式。
AVAudioSessionModeVoiceChat:主要用于VoIP場(chǎng)景系枪,此時(shí)系統(tǒng)會(huì)選擇最佳的輸入設(shè)備雀哨,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集。此時(shí)有個(gè)副作用嗤无,他會(huì)設(shè)置類別的選項(xiàng)為"AVAudioSessionCategoryOptionAllowBluetooth"從而支持藍(lán)牙耳機(jī)震束。
AVAudioSessionModeVideoChat : 主要用于視頻通話,比如QQ視頻当犯、FaceTime垢村。時(shí)系統(tǒng)也會(huì)選擇最佳的輸入設(shè)備,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集并且會(huì)設(shè)置類別的選項(xiàng)為"AVAudioSessionCategoryOptionAllowBluetooth" 和 "AVAudioSessionCategoryOptionDefaultToSpeaker"嚎卫。
AVAudioSessionModeGameChat : 適用于游戲App的采集和播放嘉栓,比如“GKVoiceChat”對(duì)象宏榕,一般不需要手動(dòng)設(shè)置
另外幾種和音頻APP關(guān)系不大,一般我們只需要關(guān)注VoIP或者視頻通話即可侵佃。

通過調(diào)用:

  • (BOOL)setMode:(NSString *)mode error:(NSError **)outError
    可以在設(shè)置Category之后再設(shè)置模式麻昼。

當(dāng)然,這些模式只是CoreAduio總結(jié)的馋辈,不一定完全滿足要求抚芦,對(duì)于具體的模式,在iOS10中還是可以微調(diào)的迈螟。通過接口:

(BOOL)setCategory:(NSString *)category mode:(NSString *)mode options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
但是在iOS9及以下就只能在Category上調(diào)了叉抡,其實(shí)本質(zhì)是一樣的,可以認(rèn)為是個(gè)API糖答毫,接口封裝褥民。

系統(tǒng)中斷響應(yīng)
上面說的這些Category啊、Option啊以及Mode都是對(duì)自己作為播放主體時(shí)的表現(xiàn)洗搂,但是假設(shè)消返,現(xiàn)在正在播放著,突然來電話了耘拇、鬧鐘響了或者你在后臺(tái)放歌但是用戶啟動(dòng)其他App用上面的方法影響的時(shí)候撵颊,我們的App該如何表現(xiàn)呢?最常用的場(chǎng)景當(dāng)然是先暫停驼鞭,待恢復(fù)的時(shí)候再繼續(xù)秦驯。那我們的App要如何感知到這個(gè)終端以及何時(shí)恢復(fù)呢?

AVAudioSession提供了多種Notifications來進(jìn)行此類狀況的通知挣棕。其中將來電話译隘、鬧鈴響等都?xì)w結(jié)為一般性的中斷,用
AVAudioSessionInterruptionNotification來通知洛心。其回調(diào)回來的userInfo主要包含兩個(gè)鍵:

AVAudioSessionInterruptionTypeKey: 取值為AVAudioSessionInterruptionTypeBegan表示中斷開始固耘,我們應(yīng)該暫停播放和采集,取值為AVAudioSessionInterruptionTypeEnded表示中斷結(jié)束词身,我們可以繼續(xù)播放和采集厅目。
AVAudioSessionInterruptionOptionKey: 當(dāng)前只有一種值A(chǔ)VAudioSessionInterruptionOptionShouldResume表示此時(shí)也應(yīng)該恢復(fù)繼續(xù)播放和采集。
而將其他App占據(jù)AudioSession的時(shí)候用AVAudioSessionSilenceSecondaryAudioHintNotification來進(jìn)行通知法严。其回調(diào)回來的userInfo鍵為:

AVAudioSessionSilenceSecondaryAudioHintTypeKey
可能包含的值:

AVAudioSessionSilenceSecondaryAudioHintTypeBegin: 表示其他App開始占據(jù)Session
AVAudioSessionSilenceSecondaryAudioHintTypeEnd: 表示其他App開始釋放Session

枚舉值 意義
AVAudioSessionRouteChangeReasonUnknown 未知原因
AVAudioSessionRouteChangeReasonNewDeviceAvailable 有新設(shè)備可用
AVAudioSessionRouteChangeReasonOldDeviceUnavailable 老設(shè)備不可用
AVAudioSessionRouteChangeReasonCategoryChange 類別改變了
AVAudioSessionRouteChangeReasonOverride App重置了輸出設(shè)置
AVAudioSessionRouteChangeReasonWakeFromSleep 從睡眠狀態(tài)呼醒
AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory 當(dāng)前Category下沒有合適的設(shè)備
AVAudioSessionRouteChangeReasonRouteConfigurationChange Rotuer的配置改變了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末损敷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子深啤,更是在濱河造成了極大的恐慌拗馒,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯街,死亡現(xiàn)場(chǎng)離奇詭異诱桂,居然都是意外死亡洋丐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門挥等,熙熙樓的掌柜王于貴愁眉苦臉地迎上來友绝,“玉大人,你說我怎么就攤上這事肝劲∏停” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵涡相,是天一觀的道長(zhǎng)哲泊。 經(jīng)常有香客問我剩蟀,道長(zhǎng)催蝗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任育特,我火速辦了婚禮丙号,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰冤。我一直安慰自己犬缨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布棉浸。 她就那樣靜靜地躺著怀薛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迷郑。 梳的紋絲不亂的頭發(fā)上枝恋,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音嗡害,去河邊找鬼焚碌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛霸妹,可吹牛的內(nèi)容都是我干的十电。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼叹螟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鹃骂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罢绽,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤畏线,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后有缆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體象踊,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温亲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杯矩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栈虚。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖史隆,靈堂內(nèi)的尸體忽然破棺而出魂务,到底是詐尸還是另有隱情,我是刑警寧澤泌射,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布粘姜,位于F島的核電站,受9級(jí)特大地震影響熔酷,放射性物質(zhì)發(fā)生泄漏孤紧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一拒秘、第九天 我趴在偏房一處隱蔽的房頂上張望号显。 院中可真熱鬧,春花似錦躺酒、人聲如沸押蚤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揽碘。三九已至,卻和暖如春园匹,著一層夾襖步出監(jiān)牢的瞬間雳刺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工偎肃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煞烫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓累颂,卻偏偏與公主長(zhǎng)得像滞详,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子紊馏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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