99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

QT+FFMPEG音頻播放實(shí)現(xiàn):重采樣、環(huán)形緩沖區(qū)與音畫同步

QT+FFMPEG音頻播放實(shí)現(xiàn):重采樣、環(huán)形緩沖區(qū)與音畫同步 1. 從視頻到音頻為什么播放器的另一半才是真正的硬骨頭很多人做播放器Demo的時(shí)候習(xí)慣先把視頻畫面跑通看到窗口里能出畫面了就覺得大功告成。但真正做過完整播放器的人都知道音頻這條鏈路才是最容易翻車的地方。視頻丟幾幀你可能肉眼根本察覺不到但音頻只要緩沖區(qū)管理稍微出點(diǎn)偏差立刻就是刺耳的爆音、卡頓或者音畫不同步。我見過不少項(xiàng)目視頻渲染做得漂漂亮亮結(jié)果一播放聲音就像老式收音機(jī)搜不到臺(tái)一樣滋啦滋啦響個(gè)不停。這個(gè)項(xiàng)目標(biāo)題說的是“QT FFMPEG實(shí)現(xiàn)基本播放器”的第四篇聚焦在音頻播放實(shí)現(xiàn)上。前面幾篇大概率已經(jīng)把解封裝、視頻解碼、視頻渲染這些環(huán)節(jié)跑通了現(xiàn)在輪到音頻這塊。QT負(fù)責(zé)界面和事件循環(huán)FFMPEG負(fù)責(zé)解封裝和解碼這兩者的組合算是桌面端播放器開發(fā)里最經(jīng)典的搭配之一。但經(jīng)典不代表簡(jiǎn)單音頻播放涉及的東西比視頻要多得多——采樣率、聲道布局、采樣格式、重采樣、音頻緩沖區(qū)管理、設(shè)備回調(diào)機(jī)制每一個(gè)環(huán)節(jié)都有坑。這篇文章適合誰看如果你已經(jīng)用QT和FFMPEG搭出了一個(gè)能播視頻的框架現(xiàn)在想把它補(bǔ)全成真正能用的播放器那這篇就是寫給你的。如果你還沒接觸過FFMPEG建議先把解封裝和解碼的基礎(chǔ)過一遍再來看音頻部分不然可能會(huì)有點(diǎn)吃力。我會(huì)把音頻播放的完整鏈路拆開從解碼后的原始音頻數(shù)據(jù)一直講到怎么讓它從揚(yáng)聲器里出來中間涉及的重采樣、緩沖區(qū)設(shè)計(jì)、線程同步這些關(guān)鍵點(diǎn)都會(huì)給出可直接參考的實(shí)現(xiàn)思路。先說一個(gè)核心結(jié)論音頻播放的本質(zhì)就是把解碼出來的PCM數(shù)據(jù)按照正確的時(shí)間節(jié)奏源源不斷地喂給音頻設(shè)備。聽起來很簡(jiǎn)單對(duì)吧但“正確的時(shí)間節(jié)奏”這六個(gè)字里面藏著大量的工程細(xì)節(jié)。喂快了緩沖區(qū)溢出聲音會(huì)斷斷續(xù)續(xù)喂慢了緩沖區(qū)餓死同樣會(huì)卡頓。而且音頻設(shè)備通常有自己的時(shí)鐘你的解碼線程有另一個(gè)時(shí)鐘這兩個(gè)時(shí)鐘如果不同步播放時(shí)間一長(zhǎng)就會(huì)累積誤差最終導(dǎo)致音畫不同步或者聲音變調(diào)。2. 音頻播放鏈路的整體設(shè)計(jì)思路2.1 為什么不能直接拿解碼后的數(shù)據(jù)去播放FFMPEG解碼出來的音頻數(shù)據(jù)格式是不確定的。它可能是AAC解碼出來的浮點(diǎn)數(shù)據(jù)也可能是MP3解碼出來的16位整型數(shù)據(jù)采樣率可能是44100Hz也可能是48000Hz聲道數(shù)可能是單聲道也可能是5.1環(huán)繞聲。而音頻設(shè)備對(duì)輸入格式是有明確要求的比如大部分聲卡只接受S16LE16位有符號(hào)整型小端序格式、44100Hz或48000Hz采樣率、雙聲道的數(shù)據(jù)。這就意味著解碼后的數(shù)據(jù)幾乎不可能直接丟給音頻設(shè)備去播。中間必須經(jīng)過一個(gè)格式轉(zhuǎn)換的環(huán)節(jié)也就是重采樣。FFMPEG提供了swresample庫專門做這件事它能把任意格式的音頻數(shù)據(jù)轉(zhuǎn)換成目標(biāo)設(shè)備需要的格式。這個(gè)環(huán)節(jié)是必須的不是可選的。我剛開始做的時(shí)候想過一個(gè)偷懶的辦法能不能讓音頻設(shè)備去適配解碼器的輸出格式理論上可以但實(shí)際操作中你會(huì)發(fā)現(xiàn)不同文件的解碼輸出格式千差萬別你不可能為每種格式都去協(xié)商設(shè)備參數(shù)。而且音頻設(shè)備打開后格式就固定了中途切換格式意味著要關(guān)閉再重新打開設(shè)備這會(huì)造成明顯的播放中斷。所以統(tǒng)一轉(zhuǎn)成一種固定格式是唯一靠譜的做法。2.2 音頻緩沖區(qū)的設(shè)計(jì)哲學(xué)音頻播放和視頻渲染最大的區(qū)別在于視頻是“拉”模式音頻是“推”模式。視頻渲染是你主動(dòng)去畫一幀畫完就完事什么時(shí)候畫下一幀由你的主循環(huán)決定。但音頻設(shè)備是持續(xù)運(yùn)行的它需要一個(gè)穩(wěn)定的數(shù)據(jù)流你不能今天喂一口明天喂一口它需要你按照固定的節(jié)奏持續(xù)供給。所以音頻播放的核心就是一個(gè)生產(chǎn)者-消費(fèi)者模型。解碼線程是生產(chǎn)者負(fù)責(zé)把解碼和重采樣后的PCM數(shù)據(jù)放進(jìn)緩沖區(qū)音頻設(shè)備回調(diào)是消費(fèi)者負(fù)責(zé)從緩沖區(qū)里取數(shù)據(jù)送給聲卡。這個(gè)緩沖區(qū)的大小設(shè)計(jì)非常關(guān)鍵太小了容易餓死導(dǎo)致卡頓太大了會(huì)導(dǎo)致延遲增加而且一旦出現(xiàn)音畫不同步的問題調(diào)整起來會(huì)非常遲鈍。我的經(jīng)驗(yàn)是緩沖區(qū)大小控制在200ms到500ms的音頻數(shù)據(jù)量比較合適。以44100Hz、雙聲道、16位采樣為例每秒的數(shù)據(jù)量是44100 × 2 × 2 176400字節(jié)。200ms就是35280字節(jié)大約35KB。這個(gè)量級(jí)的緩沖區(qū)既能保證播放的流暢性又不會(huì)引入太明顯的延遲。當(dāng)然具體數(shù)值還要根據(jù)實(shí)際場(chǎng)景調(diào)整比如如果是本地文件播放緩沖區(qū)可以小一點(diǎn)降低延遲如果是網(wǎng)絡(luò)流播放緩沖區(qū)就要大一點(diǎn)來對(duì)抗網(wǎng)絡(luò)抖動(dòng)。2.3 線程模型的選擇QT和FFMPEG結(jié)合做播放器線程模型的設(shè)計(jì)直接決定了整個(gè)系統(tǒng)的穩(wěn)定性和復(fù)雜度。常見的方案有三種第一種是全部放在主線程用QTimer定時(shí)去驅(qū)動(dòng)解碼和播放。這種方案最簡(jiǎn)單但問題也最大——主線程還要處理UI事件一旦UI卡頓音頻就會(huì)跟著卡。而且音頻設(shè)備回調(diào)通常在自己的線程里跨線程操作緩沖區(qū)需要加鎖在主線程里做重活容易導(dǎo)致鎖競(jìng)爭(zhēng)。第二種是解碼在一個(gè)獨(dú)立線程音頻設(shè)備回調(diào)在它自己的線程兩者通過線程安全的環(huán)形緩沖區(qū)通信。這是最經(jīng)典的方案也是我推薦的做法。解碼線程只管往緩沖區(qū)里寫數(shù)據(jù)音頻回調(diào)只管從緩沖區(qū)里讀數(shù)據(jù)兩者通過讀寫指針來同步不需要頻繁加鎖。第三種是解碼和音頻輸出都在同一個(gè)線程用阻塞式的音頻API來播放。這種方案在某些平臺(tái)上可行但在QT里不太合適因?yàn)镼T的事件循環(huán)和音頻設(shè)備的阻塞調(diào)用容易互相干擾。我最終采用的是第二種方案一個(gè)獨(dú)立的解碼線程負(fù)責(zé)解封裝、解碼、重采樣然后把PCM數(shù)據(jù)寫入環(huán)形緩沖區(qū)音頻設(shè)備通過回調(diào)函數(shù)從環(huán)形緩沖區(qū)讀取數(shù)據(jù)。環(huán)形緩沖區(qū)用原子操作來管理讀寫指針避免加鎖帶來的性能開銷。3. 核心細(xì)節(jié)拆解從AVFrame到揚(yáng)聲器3.1 音頻解碼的基本流程音頻解碼的流程和視頻解碼類似但有幾個(gè)關(guān)鍵區(qū)別。視頻解碼你只需要拿到AVFrame里的像素?cái)?shù)據(jù)音頻解碼你還需要關(guān)注采樣格式、采樣率、聲道布局這些參數(shù)。整個(gè)流程大致是這樣的首先從AVPacket里拿到壓縮的音頻數(shù)據(jù)送進(jìn)解碼器得到AVFrame。這個(gè)AVFrame里的data數(shù)組存放的就是PCM數(shù)據(jù)但格式是解碼器輸出的原始格式。然后你需要把這個(gè)AVFrame送進(jìn)SwrContext進(jìn)行重采樣得到目標(biāo)格式的PCM數(shù)據(jù)。最后把重采樣后的數(shù)據(jù)寫入環(huán)形緩沖區(qū)等待音頻設(shè)備回調(diào)來取。這里有一個(gè)容易忽略的點(diǎn)音頻解碼器有時(shí)候會(huì)輸出多個(gè)AVFrame對(duì)應(yīng)一個(gè)AVPacket尤其是AAC這種格式。所以你不能假設(shè)一個(gè)packet進(jìn)去就一個(gè)frame出來需要循環(huán)調(diào)用avcodec_receive_frame直到返回AVERROR(EAGAIN)為止。這個(gè)細(xì)節(jié)如果處理不好會(huì)導(dǎo)致音頻數(shù)據(jù)丟失表現(xiàn)出來就是聲音斷斷續(xù)續(xù)或者有規(guī)律的卡頓。3.2 SwrContext的初始化與參數(shù)配置SwrContext是重采樣的核心它的初始化需要明確輸入和輸出兩端的參數(shù)。輸入?yún)?shù)從解碼器的AVCodecContext里獲取包括采樣率、采樣格式、聲道布局。輸出參數(shù)根據(jù)音頻設(shè)備的能力來定通常選擇S16LE、44100Hz或48000Hz、立體聲。初始化的時(shí)候有一個(gè)關(guān)鍵點(diǎn)聲道布局要用AVChannelLayout而不是舊的channel_layout整數(shù)。新版本的FFMPEG已經(jīng)廢棄了舊的channel_layout字段如果你還在用舊接口編譯的時(shí)候會(huì)有一堆警告而且未來版本可能會(huì)直接移除。正確的做法是用av_channel_layout_default或者av_channel_layout_copy來設(shè)置聲道布局。重采樣參數(shù)的配置代碼大概長(zhǎng)這樣SwrContext *swr_ctx nullptr; AVChannelLayout out_ch_layout; av_channel_layout_default(out_ch_layout, 2); // 立體聲 swr_alloc_set_opts2(swr_ctx, out_ch_layout, AV_SAMPLE_FMT_S16, 44100, // 輸出參數(shù) codec_ctx-ch_layout, codec_ctx-sample_fmt, codec_ctx-sample_rate, // 輸入?yún)?shù) 0, nullptr); swr_init(swr_ctx);這段代碼里swr_alloc_set_opts2是新的接口比舊的swr_alloc_set_opts多了聲道布局的結(jié)構(gòu)體參數(shù)。初始化完成后每次重采樣之前還需要計(jì)算輸出樣本數(shù)用av_rescale_rnd來做時(shí)間基的轉(zhuǎn)換。3.3 環(huán)形緩沖區(qū)的實(shí)現(xiàn)要點(diǎn)環(huán)形緩沖區(qū)是音頻播放的核心數(shù)據(jù)結(jié)構(gòu)它的設(shè)計(jì)直接影響到播放的流暢度和延遲。我采用的是單生產(chǎn)者單消費(fèi)者的無鎖環(huán)形緩沖區(qū)用原子變量來管理讀寫位置。緩沖區(qū)的大小需要是2的冪次方這樣可以用位運(yùn)算來代替取模運(yùn)算提高效率。比如設(shè)置緩沖區(qū)大小為65536字節(jié)那么寫入位置的計(jì)算就是(write_pos len) (size - 1)。讀寫位置的更新用std::atomic來保證原子性避免加鎖。有一個(gè)細(xì)節(jié)需要注意緩沖區(qū)的“滿”和“空”的判斷。當(dāng)寫指針等于讀指針時(shí)緩沖區(qū)是空的當(dāng)寫指針加一等于讀指針時(shí)緩沖區(qū)是滿的。這意味著緩沖區(qū)實(shí)際可用的空間比總大小少一個(gè)字節(jié)。對(duì)于音頻數(shù)據(jù)來說這個(gè)字節(jié)的浪費(fèi)完全可以接受。寫入數(shù)據(jù)的時(shí)候如果緩沖區(qū)剩余空間不夠可以選擇等待或者丟棄。我的做法是等待因?yàn)橐纛l數(shù)據(jù)丟棄會(huì)導(dǎo)致聲音斷裂而等待最多只會(huì)造成短暫的延遲。但等待不能無限等需要設(shè)置一個(gè)超時(shí)避免解碼線程被永久阻塞。3.4 音頻設(shè)備回調(diào)的實(shí)現(xiàn)QT里播放音頻通常用QAudioSinkQt6或QAudioOutputQt5。這兩個(gè)類都支持推送模式和拉取模式我推薦用拉取模式也就是設(shè)置一個(gè)QIODevice讓音頻設(shè)備主動(dòng)從里面讀數(shù)據(jù)。具體做法是繼承QIODevice重寫readData和writeData方法。readData方法里從環(huán)形緩沖區(qū)讀取數(shù)據(jù)writeData方法里往環(huán)形緩沖區(qū)寫入數(shù)據(jù)。然后把QAudioSink的start方法傳入這個(gè)QIODevice的指針音頻設(shè)備就會(huì)在需要數(shù)據(jù)的時(shí)候自動(dòng)調(diào)用readData。這里有一個(gè)坑readData的返回值必須是實(shí)際讀取的字節(jié)數(shù)如果緩沖區(qū)里沒有足夠的數(shù)據(jù)應(yīng)該返回0而不是阻塞等待。返回0會(huì)讓音頻設(shè)備進(jìn)入空閑狀態(tài)等下次有數(shù)據(jù)的時(shí)候再繼續(xù)讀。如果你在readData里阻塞等待會(huì)導(dǎo)致音頻設(shè)備的回調(diào)線程被卡住整個(gè)播放都會(huì)出問題。4. 完整實(shí)操流程從零搭建音頻播放模塊4.1 環(huán)境準(zhǔn)備與依賴配置在開始寫代碼之前需要確保FFMPEG的開發(fā)庫已經(jīng)正確安裝。Windows下可以用vcpkg或者自己編譯Linux下用包管理器安裝libavcodec-dev、libavformat-dev、libswresample-dev這些開發(fā)包。QT這邊需要確保Multimedia模塊已經(jīng)啟用在.pro文件里加上QT multimedia。FFMPEG的版本建議用5.0以上因?yàn)樾掳姹镜穆暤啦季諥PI和舊版本差異比較大用新版本可以避免很多兼容性問題。如果用的是4.x版本需要注意channel_layout相關(guān)的接口還是舊的代碼需要做相應(yīng)的適配。編譯的時(shí)候有一個(gè)常見的坑FFMPEG的庫文件順序。鏈接器對(duì)庫的順序是有要求的libavformat依賴libavcodeclibavcodec依賴libswresample所以鏈接順序應(yīng)該是-lavformat -lavcodec -lswresample。如果順序反了會(huì)出現(xiàn)undefined reference的錯(cuò)誤。4.2 音頻解碼線程的實(shí)現(xiàn)解碼線程的核心邏輯是一個(gè)循環(huán)從AVFormatContext里讀取AVPacket判斷是不是音頻流送進(jìn)解碼器拿到AVFrame重采樣寫入環(huán)形緩沖區(qū)。void AudioDecoder::run() { while (!m_stop) { AVPacket *pkt av_packet_alloc(); int ret av_read_frame(m_fmtCtx, pkt); if (ret 0) break; if (pkt-stream_index m_audioStreamIndex) { ret avcodec_send_packet(m_codecCtx, pkt); if (ret 0) { av_packet_free(pkt); continue; } while (true) { AVFrame *frame av_frame_alloc(); ret avcodec_receive_frame(m_codecCtx, frame); if (ret AVERROR(EAGAIN) || ret AVERROR_EOF) { av_frame_free(frame); break; } // 重采樣并寫入緩沖區(qū) resampleAndWrite(frame); av_frame_free(frame); } } av_packet_free(pkt); } }這段代碼里av_read_frame返回小于0表示文件讀完了或者出錯(cuò)了需要跳出循環(huán)。avcodec_send_packet和avcodec_receive_frame的返回值需要仔細(xì)處理EAGAIN表示需要更多數(shù)據(jù)EOF表示解碼器已經(jīng)刷完了。重采樣的時(shí)候需要計(jì)算輸出樣本數(shù)int out_samples av_rescale_rnd( swr_get_delay(swr_ctx, codec_ctx-sample_rate) frame-nb_samples, 44100, codec_ctx-sample_rate, AV_ROUND_UP);這個(gè)計(jì)算考慮了重采樣器的內(nèi)部延遲確保輸出樣本數(shù)足夠容納所有輸入數(shù)據(jù)。如果計(jì)算少了會(huì)導(dǎo)致部分音頻數(shù)據(jù)丟失。4.3 環(huán)形緩沖區(qū)的代碼實(shí)現(xiàn)環(huán)形緩沖區(qū)的實(shí)現(xiàn)需要保證線程安全我用的是原子操作加內(nèi)存屏障的方式。核心代碼如下class RingBuffer { public: bool write(const uint8_t *data, size_t len) { size_t w m_write.load(std::memory_order_relaxed); size_t r m_read.load(std::memory_order_acquire); size_t available (r - w - 1 m_size) (m_size - 1); if (len available) return false; size_t first std::min(len, m_size - (w (m_size - 1))); memcpy(m_buffer (w (m_size - 1)), data, first); if (len first) { memcpy(m_buffer, data first, len - first); } m_write.store(w len, std::memory_order_release); return true; } size_t read(uint8_t *data, size_t len) { size_t r m_read.load(std::memory_order_relaxed); size_t w m_write.load(std::memory_order_acquire); size_t available (w - r m_size) (m_size - 1); len std::min(len, available); size_t first std::min(len, m_size - (r (m_size - 1))); memcpy(data, m_buffer (r (m_size - 1)), first); if (len first) { memcpy(data first, m_buffer, len - first); } m_read.store(r len, std::memory_order_release); return len; } private: std::vectoruint8_t m_buffer; size_t m_size; std::atomicsize_t m_write{0}; std::atomicsize_t m_read{0}; };這里用memory_order_acquire和memory_order_release來保證讀寫指針的可見性。寫入數(shù)據(jù)后更新寫指針用release語義讀取寫指針用acquire語義這樣可以確保數(shù)據(jù)在指針更新之前已經(jīng)寫入內(nèi)存。4.4 音頻設(shè)備回調(diào)的對(duì)接QIODevice的readData方法里從環(huán)形緩沖區(qū)讀取數(shù)據(jù)qint64 AudioDevice::readData(char *data, qint64 maxlen) { size_t bytesRead m_ringBuffer-read( reinterpret_castuint8_t*(data), static_castsize_t(maxlen)); return static_castqint64(bytesRead); }writeData方法里往環(huán)形緩沖區(qū)寫入數(shù)據(jù)但通常音頻播放不需要寫入所以可以直接返回0。然后創(chuàng)建QAudioSink并啟動(dòng)QAudioFormat format; format.setSampleRate(44100); format.setChannelCount(2); format.setSampleFormat(QAudioFormat::Int16); QAudioSink *audioSink new QAudioSink(format, this); audioSink-start(m_audioDevice);這里有一個(gè)關(guān)鍵點(diǎn)QAudioFormat的采樣格式要和SwrContext的輸出格式一致。如果SwrContext輸出的是S16LEQAudioFormat就要設(shè)置成Int16。如果格式不匹配播放出來的聲音會(huì)是噪音。5. 常見問題與排查技巧實(shí)錄5.1 聲音卡頓、斷斷續(xù)續(xù)這是最常見的問題原因通常有三個(gè)緩沖區(qū)太小、解碼速度跟不上、或者音頻設(shè)備回調(diào)讀取數(shù)據(jù)不及時(shí)。排查的時(shí)候可以先看緩沖區(qū)的水位。如果緩沖區(qū)經(jīng)常處于接近空的狀態(tài)說明解碼速度不夠需要優(yōu)化解碼邏輯或者增大緩沖區(qū)。如果緩沖區(qū)經(jīng)常是滿的說明音頻設(shè)備讀取太慢可能是回調(diào)線程被阻塞了。我遇到過一次比較隱蔽的情況解碼線程和音頻回調(diào)線程的優(yōu)先級(jí)設(shè)置不當(dāng)導(dǎo)致解碼線程被頻繁搶占緩沖區(qū)一直處于饑餓狀態(tài)。解決辦法是把解碼線程的優(yōu)先級(jí)調(diào)高或者把音頻回調(diào)的緩沖區(qū)調(diào)大一些。5.2 聲音變調(diào)、播放速度不對(duì)這通常是采樣率不匹配導(dǎo)致的。比如解碼器輸出的是48000Hz但音頻設(shè)備設(shè)置的是44100Hz如果不做重采樣直接播放聲音就會(huì)變慢變調(diào)。檢查的方法是打印SwrContext的輸入和輸出采樣率確認(rèn)兩者是否一致。如果不一致需要檢查swr_alloc_set_opts2的參數(shù)是否正確。另外av_rescale_rnd的計(jì)算也要檢查輸出樣本數(shù)算錯(cuò)了也會(huì)導(dǎo)致播放速度異常。5.3 音畫不同步音畫不同步是播放器開發(fā)中最頭疼的問題之一。音頻和視頻有各自的時(shí)間基如果兩者沒有對(duì)齊就會(huì)出現(xiàn)聲音和畫面不一致的情況。我的做法是以音頻時(shí)鐘為基準(zhǔn)視頻渲染的時(shí)候根據(jù)音頻時(shí)鐘來調(diào)整。具體來說音頻播放的時(shí)候記錄已經(jīng)播放的樣本數(shù)換算成時(shí)間戳作為主時(shí)鐘。視頻渲染的時(shí)候比較當(dāng)前幀的PTS和主時(shí)鐘的差值如果視頻超前了就等待如果落后了就丟幀或者加速渲染。這個(gè)同步策略不是唯一的也有以視頻時(shí)鐘為基準(zhǔn)的方案但音頻對(duì)時(shí)間更敏感以音頻為基準(zhǔn)通常效果更好。5.4 播放結(jié)束后有雜音播放結(jié)束的時(shí)候如果直接關(guān)閉音頻設(shè)備緩沖區(qū)里殘留的數(shù)據(jù)可能會(huì)被突然截?cái)喈a(chǎn)生一個(gè)脈沖信號(hào)聽起來就是“啪”的一聲。解決辦法是在播放結(jié)束前先停止往緩沖區(qū)寫數(shù)據(jù)等緩沖區(qū)里的數(shù)據(jù)全部播放完畢后再關(guān)閉設(shè)備??梢栽诃h(huán)形緩沖區(qū)里加一個(gè)結(jié)束標(biāo)志當(dāng)讀到結(jié)束標(biāo)志且緩沖區(qū)為空時(shí)再調(diào)用audioSink-stop()。5.5 常見問題速查表問題現(xiàn)象可能原因排查方法解決方案聲音卡頓緩沖區(qū)太小觀察緩沖區(qū)水位增大緩沖區(qū)到200-500ms聲音變調(diào)采樣率不匹配打印輸入輸出采樣率檢查SwrContext參數(shù)音畫不同步時(shí)鐘未對(duì)齊對(duì)比音頻和視頻時(shí)間戳以音頻時(shí)鐘為基準(zhǔn)同步播放結(jié)束有雜音緩沖區(qū)數(shù)據(jù)被截?cái)鄼z查關(guān)閉流程等緩沖區(qū)播完再關(guān)閉設(shè)備完全沒聲音格式不匹配檢查QAudioFormat確保與SwrContext輸出一致聲音有回聲緩沖區(qū)數(shù)據(jù)重復(fù)檢查讀寫指針確認(rèn)讀寫指針更新正確5.6 幾個(gè)我踩過的坑第一個(gè)坑是avcodec_receive_frame的循環(huán)沒有正確處理。我一開始只調(diào)用了一次以為一個(gè)packet對(duì)應(yīng)一個(gè)frame結(jié)果AAC音頻丟了很多幀聲音斷斷續(xù)續(xù)。后來改成循環(huán)調(diào)用直到EAGAIN才解決。第二個(gè)坑是環(huán)形緩沖區(qū)的內(nèi)存屏障。我一開始用relaxed語義在單線程測(cè)試的時(shí)候沒問題但多線程跑起來偶爾會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂。后來改成acquire/release語義就穩(wěn)定了。這個(gè)問題的隱蔽性很強(qiáng)因?yàn)槌鲥e(cuò)的概率不高但一旦出現(xiàn)就很難排查。第三個(gè)坑是QAudioSink的緩沖區(qū)大小設(shè)置。QAudioSink默認(rèn)的緩沖區(qū)大小可能不適合所有場(chǎng)景可以通過setBufferSize來調(diào)整。我一開始沒設(shè)置結(jié)果在某些機(jī)器上延遲特別大后來設(shè)置成固定值就正常了。第四個(gè)坑是重采樣器的flush。播放結(jié)束的時(shí)候SwrContext內(nèi)部可能還有緩存的樣本沒有輸出需要調(diào)用swr_convert傳入nullptr來flush。如果忘了這一步最后一段音頻會(huì)丟失。6. 性能優(yōu)化與擴(kuò)展思路6.1 減少內(nèi)存拷貝音頻數(shù)據(jù)從解碼到播放中間會(huì)經(jīng)過多次拷貝解碼器輸出到AVFrame是一次重采樣到輸出緩沖區(qū)是一次寫入環(huán)形緩沖區(qū)是一次音頻設(shè)備讀取是一次。每次拷貝都會(huì)消耗CPU時(shí)間對(duì)于高采樣率的音頻來說這些開銷累積起來不容忽視。優(yōu)化的思路是盡量減少中間緩沖區(qū)。比如重采樣的時(shí)候可以直接輸出到環(huán)形緩沖區(qū)的可寫區(qū)域避免一次額外的拷貝。不過這需要環(huán)形緩沖區(qū)支持“預(yù)留空間”的操作實(shí)現(xiàn)起來會(huì)復(fù)雜一些。另一個(gè)優(yōu)化點(diǎn)是使用內(nèi)存池來管理AVFrame和AVPacket避免頻繁的alloc和free。FFMPEG提供了av_frame_alloc和av_packet_alloc但每次調(diào)用都有開銷??梢灶A(yù)先分配一組frame和packet循環(huán)使用減少內(nèi)存分配的次數(shù)。6.2 支持多種音頻格式目前的實(shí)現(xiàn)只支持S16LE格式如果需要支持浮點(diǎn)格式或者24位格式需要修改SwrContext的輸出參數(shù)和QAudioFormat的設(shè)置。QT的QAudioFormat支持UInt8、Int16、Int32、Float等格式可以根據(jù)需要選擇。如果要做音頻特效比如均衡器或者音量調(diào)節(jié)可以在重采樣之后加一個(gè)處理環(huán)節(jié)。音量調(diào)節(jié)最簡(jiǎn)單直接把PCM樣本乘以一個(gè)系數(shù)就行。但要注意防止溢出16位整型的范圍是-32768到32767乘以系數(shù)后如果超出范圍需要做截?cái)嗵幚怼?.3 音頻時(shí)鐘的精確管理音頻時(shí)鐘的精度直接影響到音畫同步的效果。我的做法是記錄已經(jīng)寫入環(huán)形緩沖區(qū)的總樣本數(shù)減去緩沖區(qū)里還未播放的樣本數(shù)得到實(shí)際已經(jīng)播放的樣本數(shù)再除以采樣率就是當(dāng)前音頻時(shí)間。這個(gè)計(jì)算需要考慮到音頻設(shè)備的延遲。QAudioSink提供了processedUSecs()方法可以獲取已經(jīng)處理的微秒數(shù)用這個(gè)值來計(jì)算音頻時(shí)鐘會(huì)更準(zhǔn)確。但要注意processedUSecs()的更新頻率可能不夠高需要結(jié)合樣本數(shù)來計(jì)算。6.4 后續(xù)可以擴(kuò)展的方向這個(gè)音頻播放模塊目前只做了最基本的播放功能后續(xù)可以擴(kuò)展的方向很多。比如加上音量控制、靜音切換、音頻軌道切換、變速播放等功能。變速播放需要修改重采樣的輸出采樣率同時(shí)調(diào)整視頻的播放速度來保持同步。如果要做音頻可視化可以在音頻回調(diào)里獲取PCM數(shù)據(jù)做FFT變換后繪制頻譜圖。這個(gè)功能在音樂播放器里很常見實(shí)現(xiàn)起來也不復(fù)雜但要注意不能在音頻回調(diào)里做太重的計(jì)算否則會(huì)影響播放的流暢性。另外如果要做網(wǎng)絡(luò)流播放緩沖區(qū)管理需要更復(fù)雜的策略來對(duì)抗網(wǎng)絡(luò)抖動(dòng)??梢砸胱赃m應(yīng)緩沖區(qū)根據(jù)網(wǎng)絡(luò)狀況動(dòng)態(tài)調(diào)整緩沖區(qū)大小。網(wǎng)絡(luò)好的時(shí)候減小緩沖區(qū)降低延遲網(wǎng)絡(luò)差的時(shí)候增大緩沖區(qū)避免卡頓。音頻播放這塊內(nèi)容表面上看就是把數(shù)據(jù)喂給聲卡但真正做好做穩(wěn)需要處理的細(xì)節(jié)非常多。我自己的體會(huì)是先把基本的播放流程跑通然后再逐步優(yōu)化緩沖區(qū)管理、時(shí)鐘同步、性能這些方面。不要一上來就追求完美先把聲音放出來再慢慢調(diào)優(yōu)。遇到問題的時(shí)候多打印日志觀察緩沖區(qū)的水位變化大部分問題都能從數(shù)據(jù)上找到線索。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香五月电影院在线观看| 99婷婷五月天激情| 丁香婷婷色色| 手机免费福利视频| 色欲丁香久久| 激情综合网之激情五月| 超碰在线看| 五月丁香另类网| 久99视频在线观看| 九九99热久久精品66中文字幕| 青青操绿aaa一区日v| 一起草日本| 激情五月丁香五月| 亚洲日日操| 伊人AV五月婷| 六月色五月天天婷婷| 久久久久久激情| 色色五月婷婷网| 婷婷的久久网站| 国产综合网在线| 婷婷丁香六月五月天| 婷婷丁香五月激情密臀av| 思思久久99热只有频精品66| 能看的av| 伊人婷婷大香蕉在线| 啪啪91| 337午夜福利| 欧美狠狠草| 97极品在线| 国产免费一区二区三州老师F1…… | 9|人妻人人操| 婷婷五月,综合伊人| 久久亚洲激情五码| 久久机热/这里只有精品| 日韩99视频| 久久精品亚洲一级牲爱综合| 五月天综合婷婷| 另类国产综合| 五月丁香六月婷婷视频| 大香伊人婷婷影院| 婷婷色色欧美| 亚洲热综合| www.丁香五月| 婷婷五月天久久| 亚洲丁香五月在线观看| www.狠狠艹| 五月丁香婷婷潮喷中文字幕| 玖玖婷婷五月天| 丁香五月色五月婷婷宗合| WWW色五月天| 久久永久网址| 久久这里都是精品视频| 欧美色爱五月天| 婷婷夜夜操| 99热这里有精品2| 激情播丁香| 人人亚洲| 五月丁香激情在线| 极品另类| 久久大香蕉| 婷婷天堂站| 丁香五月婷婷网| www色色色com| 日日噜噜夜夜狠狠久久丁香五月| 久久婷婷综合色丁香| 久久久人人操A V| 91色干| 婷婷九月狠狠色| 久热99热| 丁香久久五月天视频在线观看| 久色姿源| 成年人最刺激的综合网| 99热手机在线精品| 丁香五月婷婷av影院| 激情 久久 婷婷| 日本丰满久久| 色噜噜婷婷| 丁香婷婷五月天校园春色| 综合激情五月丁香9999久久精| 天天网站天天爽| 亚洲麻豆乱码国产2028| 99久久婷婷国产综合精品草原| 欧美在线干| 色丁香久久| 色狠狠色综合久久久绯色aⅴ影视| 亚洲无码影音| 日操| 婷婷五月,偷窥偷拍网| 激情爱爱网站超大免费| 97涩婷婷婷婷基地| 丁香六月婷婷综合激情欧美| 婷婷五月天狠狠色| 亚洲午夜成人av电影网| 九九99在线观看视频| 婷婷网五月| 操逼视频一区| 五月婷av| 色人妻五月| 久久婷五月综合| 亚洲激情综合| 久久精典| 色婷婷五月天偷拍| 久久R激情| 啪啪丁香五月| 无码区婷婷五月花开| 久久只有18视频| 99ER热精品视频| 高清国产一级婬片a免费| 色丁香五月天射婷婷爱婷婷| 日本色婷婷| 欧美大肥婆大肥BBBBB| 亚洲视频图片婷婷五月| 噼里啪啦完整版中文在线观看| 无语停婷丁香网| 欧美99| 色五开心五月五月深深爱| 日韩久热| 久久九九中文字幕| 亚洲视频色婷婷| 操91| 97丁香五月天| 在线99热| 激情五月综合| 99热国产| 狠狠爱综合网| 91精品久久久久久| 丁香五月天黄色片| aa久久| 成人 AV播放| 深爱丁香网| 91操在线视频| 伊人久久婷婷| 思思热在线视频精品| 97人人爱人人操| 婷婷五月天第四色| 亚洲精品V天堂中文字幕| 99ri久久| www夜夜操| 日本97在线| 久久成人人妻| 国产免费一区二区三州老师F1F1……| 亚洲情欲| 久久婷婷五月综合啪| 天堂草在线看www| 欧美特大片黄| 亚洲热久久| 亚洲第一成人无码A片| 九玖视频这里只有精品| 极品人妻VIDEOSSS人妻| 久久深爱激情网| 色五月婷婷在线| 亚洲精品va| 丁香五月人妻| 五月激情综合五月| 9精品一区| 99日这里只有精品| 九月婷婷激情| 97人人草| 丁香五月激情综合啪啪| 77777亚洲午夜久久| 国产视频婷婷| 99小视频在线| 久久五月婷6 9| 激情亚洲色图片丁香综合| 精品一二三区久久AAA片| 五月丁香六月婷婷亚洲激情综合| 久久99日本精品视频免费观看| 五月综合婷婷五月| 亚洲AV免费在线| 色婷婷综合网站| 日韩一66精品| 99色在线视频观看| 九九热超碰| 激情久久四色| 色丁香五月婷婷综合久久| 五月色色激情网| 第四色大香蕉| 欧美性做爰大片免费看办公室| 69婷婷丁香午夜| 久久大大香| 五月丁香婷婷成人网| 五月婷婷综合性爱噜噜| 久色网| 五月丁六月香av| 大香蕉视频婷| 五月综合色| 色欲资源网| 26uuu偷拍亚洲欧洲综合| 天天干电影| 婷婷六月插屄激情| 91婷婷色五月| 99久久婷婷综合| 五月婷婷丁香啪啪| 久久深爱激情网| 正宗黄色毛片| 9精品久久999| 激情五月天小说网| 97精品自拍视频| 国产乱码久久| 丁香五月开心亚洲| 天天日天天久久青青| 色五月五月婷婷| 综合久久婷婷五月丁香| 青青草色在线视频观看| 婷婷五月欧美| 久久精品国产AV一区二区三区 | 九色自拍| 精品人妻伦一二三区久久| 2015好吊操| 97超级碰碰碰久久久| 成人国产综合| 五月丁香六月婷婷成人电影| 激情网五月婷婷| 婷婷久热| 99狠狠色| 婷婷色五月天色| 91超碰人人操| 亚洲色久| 久久婷婷网站| 久久hd| 色 五月俺去也| 天天综合网91| 色综合色色色色| 久久精品国产一区二区三区四区| 五月天国产| 夜夜撸日日操| 狠狠色综合网站久久久久| 大香蕉久久伊人婷婷五月丁香| 在线一起草av| 在线色婷婷| 婷婷大香蕉| 91综合国免费久入| 黄色一级影片| 伊人影院久久网| 99精品久久| 99自拍视频网站| 婷婷婷婷色| 色欲五月天| 色婷婷97| 激情伊人| 色婷婷丁香网| 久久亚洲婷婷综合色五月| 色欲婷婷五月天丁香| 草草色情综合网| 欧美槡BBBB槡BBB少妇| 99久久婷| 婷婷色色五月天| 99热青青草| 女人被男人吃奶到高潮| 99九无网码| 五月丁香六月婷婷的女人| 91九色精品熟女内射| 色综合色色| 99日本黄站| 五月天亭亭俺也| 伊人五月天在线| 欧美草久久五月天91| 开心五月丁香婷婷| 激情文学五月丁香六月婷婷| 丁香婷婷激情| 五月天婷婷基地| 亚洲激情网| 91丨九色丨东北熟女| 男女99免费视频| 婷婷五月天激情电影| 色噜噜97视频在线观看| 99精品综合| 婷婷香五月天| 在线看片h站| 六月五月天婷婷涩播在线| 先锋影音男人的天堂AV| 日韩大片艹艹| 就要爱综合| 99re思思在线视频| 欧美激情凹凸丁香网| www,五月天激情| 五月五婷婷| 五月开心久久| 久久婷婷色| 第九色区av天堂| 国产精品久久久久9999小说| 九九激情视频| 色五月丁香六月资源站| 丁香五月婷婷激情蜜桃| 激情网第九色| 热99这里只有精品视频| 五月丁香亭亭| 黄桃AV无码免费一区二区三区 | 91九色超碰| 美女91一起草| 无码网| 五月色婷婷激情| 天堂草在线看www| 丁香五月婷婷偷拍| 国产精产国品一二三在观看| 99人人操人人操人人精| 狠狠人人| 激情六月婷婷| 国产一级黄色影片,| 超碰在线网站| 一本道综合网| 色婷婷97| 9久热在线视频| 欧美婷婷丁香五月社区| WWW.夜夜| 第四色五月天| 91九色 婷婷| 激情综合网五月天天| 久久久性爱视频| 九九99精品视频在线观看| 婷婷五月花.97| 久久婷婷网| www.日韩艹| 婷婷射图| 日韩有码一区| 婷婷五月天综合蜜桃| 青草五月天| 嫩草AV久久伊人妇女超级A| 日韩综合久| 管管補管管紱| 婷婷五月色| 亚美欧色影院| 91色性感五月婷婷丁香| 草操AV在线| 五月婷婷,六月丁香| 蜜桃成语时李时珍 免费| 99精品一二三四视频| www.五月天婷婷姐姐| 五月丁香婷中文| 性色九九| 五月丁香六月婷婷在线播放| 色色色综合| 丁香五月网址| 激情图片婷婷丁香五月| 99婷婷色| 五月久久丁香| 狠狠色噜噜狠狠狠狠狠色综合久久| 五月婷婷另类| 久久久性爱视频| 色玖玖玖| 99riAv1国产在线观看| 色情婷婷久久五月天| 99成人网站| 五月丁香免费看| 99在线视频播放| 婷婷五月天久久| 五月天丁香婷婷视频网址| 三区激情四射av| 五月婷婷大香蕉| 六月婷婷综合激情| 欧美在线干| 在线天堂9| 五月丁香婷婷综合网| 91黄色五月天视频| 深情五月天| www.99操| 人人摸人人澡人人| 激情床戏| 丁香六月婷婷综合| 狠狠久久婷五月综合色| 欧美日韩二区在线| 国产成人99久久亚洲综合精品| 色逼综合网| 五月开心婷婷| 99久久偷拍视频| 亚洲aV写真天天综合网久久| 激情九月天天天天婷婷| 69精品人人人人| 久久狠狠欧美| 亚洲欧美在线观看| 婷婷十月激情综合网| 丁香六月欧美| 五月婷精品| 丁香五月香蕉| 亚洲精品久久久无码| 五月丁香激情综合六月涩涩爱| 99在线精品免费视频| 色青青视频| 免费91久久精品| 婷婷丁香五月天中文字幕| 欧美十二区| 夜夜操夜夜操| 91精品婷婷国产综合久久| 婷婷综合激情| 热99只有精品| 色人久夂| 国产伦亲子伦亲子视频观看| 五月婷婷免费在线观看视频| 午夜激情综合| 国产精产国品一二三在观看| 欧美丁香五月| 激情网 五月天| 大操人妻| 天天插综合网| 亚洲欧美999| 91精品国产日韩91久久久久久国模| 97香蕉久久超级碰碰高清版| 人人爽人人爽人人爽人人爽| 性视频久久| 天天插天天射| 色播五月网| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 9l视频自拍9l九色9l成人| 狠狠色色| 热99AV网站| 婷婷伊人久久| 99热人人操人人操| 久久五月婷| 丁香五月天网友自拍啪啪啪视频| 91在线日| 五月色婷婷夜色| 色色色色色色色色综合网| 9999热这里只有精品| www.99热在线| 超碰操日| 无码色| 人。妻久久| 天天做天天爱天天摸| 在线综合91| 天天爽人人综合免费7799| 六月综合婷婷开心伊人| 天天做综合网色综合| 色99热| 91九九九九九九| 久久激情五月婷婷| 啪啪 综合网| 九九草热在线观看| 天天爽天天爽天天爽天天爽天天爽| 天色色综合网| 婷婷五月天97干| www.91色| 成人婷99最新| 日韩黄色电影| 99热这里只有精品8| 五月永久激情| 成人婷婷五月天| 中文字幕视频在线播放| 五月天婷婷香蕉狠狠超碰综合| 婷婷五月天99综合网站| 嫩草AV久久伊人妇女超级A| 色色色99| 综合大香蕉| 五月婷婷在线视频观看| WWW.婷婷| 婷婷丁香人妻天天爽| 呦呦AV| 五月丁香啪啪啪免费看| 性色欲情 网站| 亚洲熟女色| 欧美 日韩 成人| 伊人在线大香蕉网| 国产99久9在线+|+传媒| 日韩av高清| 丁香五月大香蕉在线99| 丁香五月激情五月| 五月丁香婷婷色播无码| 亚洲第二AV| 丁香深五月婷婷| 婷婷六月香| 级人人91| 9 1 A v久久久| 久草婷| 婷婷情色五月| 9超碰在线| 丁香色五月AV在线| 五月婷婷|欧美| 狠狠色狠狠爱| 91se在线视频| 色欲操| 婷婷久久视频| 五月Huangsewang| 久久精品99国产精品日本| 久草婷婷| 狠狠色综合图片| 超碰人人摸AV| 久久久久久久久久91| 婷婷欧美综合| 丁香六月婷婷综合激情欧美 | 欧美日韩成卜| 91传媒无码人妻精| 狠狠色97| 99热 在线观看| 99er6| 欧美天天性| 五月激情天天干| 欧美婷婷综合| 五月色丁香| 婷婷D区| 黄色aa观看aaguochan| 激情五月综合久久| 亚洲一色色色色色色色色| 九九草热在线观看| 99色色视频| 特黄三级片| 国产FREESEXVIDEOS性中国| 第四色在线观看| 欧美一级a| 91色碰| 99久久婷婷国产综合精品草原| 色爱99| 婷婷六月激情综合| 久久这里只有精品8| 96精品成人无码A片观看金桔| 97操碰98| 丁香五月婷婷六月婷婷| www.99成人视频| 99婷婷国产最新视频| 五月丁香色色网| 91热在线观看视频| 婷婷五月天伊人在线| 日日爽天天| 99精品自拍| 丁香五月婷婷免费视频| 久热99| 色噜噜狠狠狠综合曰曰曰| 91视频五月丁香| 梁铮版蜘蛛女在线观看| 婷婷激情六月天视频| 99干日本| 日韩天堂久久| 我要色综合五月婷婷| av在线免费网站| 荡乳尤物3HP1V5| 99精品久久久| 92久操视频| 99在线观看精彩视频| 色99视频| 任你爽在线视频| 色色是色N一| 玖玖资源在线视频| 综合色、色综合| 九九综合久久| 婷婷五月激情的图片| 丁香五月婷婷社区| 色五月丁香总合网| 国产67194| 中文字幕黄色电影网址| 99这里是精品| 97色干在线观看| 亚洲天堂热| 99热这里有精品| 春色激情| 狠狠操天天日| 国产成人精品一区二三区熟女在线| 狠狠色噜噜狠狠狠狠综合| 夜夜爽天操| 成人做爰A片免费看视频| 久久精品五月天| www.婷婷.com| 国产亚洲av片| 色久天| 97日本操| 国产另类综合| 91丨九色丨首页| 亚洲五月综合色播| 中文字幕丰满孑伦无码专区| 婷婷丁香五月天综合网| 婷婷99狠狠躁天天躁| 99久热在线精品| 色婷婷中文在线| 九热电影av| 婷婷五月综合亚洲| 老师把我爽高潮了免费A片| 五月天另类小说久久小说网| 三日本无码| 婷婷之六月丁香| 成人精品视频99在线观看免费| 97色色色视屏| 成人国产欧美大片一区| 色五月开心开心五月激情五月| 中国女人内射6XXXXX| 午夜美女人啪最红院| 激情五月开心五月在线视频| 婷婷五月在线观看| 五月色无码| 丰满少妇猛烈A片免费看观看| 婷婷区日本| 国产精品天天狠天天看| 婷婷五月骚厕所| 亚洲韩国日产综合AV| 啪啪六月婷婷| 91精品婷婷国产综合| 婷婷伊人综合中文字幕| 丁香婷婷人妻| 五月网站| 五月天久久91| www.日本久久videos| www99热| 色婷婷五月天成人网| 级人人91| 五月天狠狠色| 亚洲第一色色色| 国产看真人毛片爱做A片| 五月天色网站| 丁香五月综合激情啪啪| 国产精自产拍久久久久久蜜 | 色情五月天导航| 婷婷成人视频| 天天操天天爱天天日| 国产av天堂| 五月伊人婷婷| 99热自拍| 91久久网站| 色天堂A| 六月丁香视频网站| 肏日网在线看| 深爱综合网| 婷婷激情五月综合丁| 色婷婷另类| 婷婷伊人綜合中文字幕小说| 热99精品视频| 九九人人操| 色婷婷狠狠禁18久久| 99综合自拍| 成人婷婷五月天| 艹天天射| AAA级久久久精品| 婷婷五月网图片区| 桃色成人网| 激情综合一| 婷婷AV丁香| 婷婷丁香www视频日本韩国| 久久婷婷五月| 久久天天| 五月花婷婷最新| 成人电影在线免费试看| 潘金莲AAAAAAAAAA| 四色五月婷婷| 五月婷婷五月| 丁香网五月天激情| 久久亚洲网| 久久婷婷亚洲无码一起| 色五月色综合| 色优久久| 丁香啪啪| 天天日天天插| 五月婷婷网五月在线| 天天射夜夜爽| 伊人五月婷婷| 激情国产综合| 免费色婷婷| 人妻丰满精品一区二区A片| 91色逼| 激情五婷网| 婷婷5月开心6月| 五月婷婷xxx| 啪啪六月婷婷| 亚洲蜜乳AV| 五月综合激情啪啪啪啪啪| 青青草五月天| 亚洲激情婷婷| 久99热| 久操福利| 99热免费精品| 亚洲成人中心| 五月天激情婷婷| 丁香五月激情无码视频| 思思热在线精品视频网站| 激情五月天综合网站网站网站| 玖玖爱综合网| 秋霞A V毛片| 丁香久月婷| 亚洲成人AV在线| 激情五月天福利| 日韩aⅴ视频| seuuu婷婷| 色色色色色色综合网| 亚洲熟妇AV乱码在线观看| 五月天色综合| 97人人射| 成人国产欧美大片一区| 逼特逼在线免费播放| 色播五月天天| 成人超碰AV| 人人草成人视频| 精品99这里有| 91热er| 四虎婷婷五月天| 五月丁香婷婷激情在线| 久久这里有精品99| 九九视频这里有精品| 五月丁香婷婷俺| 色婷婷五月天视频在线| 天天天天天天操| 五月婷婷六月色| 在线天堂9| 啪啪啪综合网| 六月婷婷综合| 激情久久伊人| 亚洲在线成人| 成人av在线电影| wWwCom夜操wwW| 狠狠做五月婷婷| 婷婷五月天首页| 激情五月六月婷婷| 91人人网| 国产人妻人伦精品一区二区| aaaa久久| 大香蕉久久草| 色综合爱综合| 激情五月婷婷综合| 色色网站| 91碰碰视频在线观看| 人妻中文av| 成人丁香五月| 六月丁香激情婷婷| 婷婷久久精品| 日欧一片内射VA在线影院| 色婷婷影视99| 99色在线观看| 26uuu国产激情视频| 久久久大香蕉| 97caop| 任你日热视频| 99热精品10| 五月第四色| 中文字幕在线观看视频www| 久久久国产精品黄毛片| 97色婷婷在线观看| 五月情综合| 亚洲精品婷婷| AA片在线观看视频在线播放| 69色婷婷| 91啪级电影| 激情人妻综合| 亚洲无码 图片区| 五月伊人网| 草做免费在线观看| 99热这里只有精品99| 五月天婷婷丁香人人操91| 丁香色婷婷五月天| 大香蕉视频婷| 九九热这里都是精品6| 色婷婷小说网| 国产免费性爱| 99热精品在线观看| 国产在这里只有精品| 伊人激情AV一区二区三区| 超碰在线99热| 色婷婷狠狠干芒果TV| 天天干天天拍| 国产精典视频在线观看| 色五月婷婷五月天激情综合| 欧美电影在线播放| 亚洲成人在线免费| 国产激情综合五月久久| 乱精品一区字幕二区| 婷婷色播婷婷| 另类 在线| 婷婷五月丁香性爱| 丁香五月婷婷亚洲另类| 99成人| 婷婷色九月| 亚洲激情综合| 色噜婷婷| 26uuu欧美激情另类| 99综合| 99色在线观看| 91精品久久久久久久| 大香蕉伊在| 五月丁香婷婷成人综合网| 亚洲无AV在线中文字幕| 色情五月丁香婷婷网| 日本片日本片祼观看网站在线看中文版网页在线看 | wuyuedingxiang99| 天天爱天天做天天操| 激情婷婷五月| 91色在线/日韩| 九九色大香蕉| h亚洲| 婷婷五月丁香91| 婷婷五月色激情欧美激情| 热久久这里只有三级视频| 99re在线这里只有精品视频首页| 激情五月婷婷老师| 欧美综合五月丁香六月婷| 亚洲精品无AMM毛片| 丁香五月婷婷六月婷| 亚洲精品99| 丁香久色| 激情五月综合网丁| 五月丁香六月婷婷的女人| 蒲京久久无码视频| 欧美色爱五月天| 亚洲第二AV| 天天天天干| 久Se视频在线观看| 五月停亭六月,六月停亭的英语 | 五月丁香激| 色99日韩| 日本色婷婷| 人色五月天婷婷| 五月天天丁香婷婷| 五月婷亚洲精品| 97操碰在线视频| 九九色99| 青青草a在线| 欧美成人AAA片一区国产精品| 丁香五月婷婷激情123| 在线不卡AC| 婷婷亚洲综合| 五月婷久久| 强壮公让我夜夜高潮A片视频| 五月丁香人人婷婷在线观看| 婷婷五月天久| 久久婷婷综| 色五月婷婷成人视频| 伊人婷婷99热精品| 激情六月婷婷| 在线五月婷婷小电影| 风流少妇A片一区二区蜜桃| 美英法精品无码免费视频| 热99久| 日韩aaa| 啪啪激情网站| 亚洲黄3级片网站欧美| www,天天干| 高清无码中文字幕aVDV| 婷婷九月狠狠色| 人人爱操| 婷婷五月激情丁香| 久久中文人妻系列| 九热av| 日日干天天爽| 亚洲色A| 日韩在线视频网站| 日产精品一线二线三线芒果| 激情五月天网站| 久久丁香五月婷婷激情综合网| 亚洲成人电影在线免费观看| 啪啪91| 丁香五月天在线| 97婷婷色| 久re在线| A片试看120分钟做受视频红杏| 激情五月婷婷丁香| 综合激情五月丁香9999久久精| 97超碰色| 色噜噜狠狠色综无码久久合欧美| 天天做天天爱天天玩| 色婷婷成人影片| 色色色五月婷| 国模狼狼| 九九热视频在线观看| 久色大| 色婷婷五月亚洲| 精品五月视频婷婷在线观看| 人人超碰99| 少妇人妻人伦A片| 成人网站在线观看视频| 天天草比天天爽| 热的国产,热的综合,热的有码| 九九精彩久久| 丁香五月色情av| 99精品在线观看| 超碰激情网| 深爱激情综合网| 3p日韩网站视频| 超碰人人超碰| 麻豆精品| 欧美日韩国产成人在线| 99精品国产在热久久| 99热这里只有精品5| 我去色色网五雨天| 亚洲色无码| 99爱最新免费视频在线观看| 九九热这里有精品视频| 亚洲、欧美、国产另类笫二区| 69人人操人人爽| 婷婷丁香日韩五月| 丁香五月偷拍| www.婷婷五月| 色色五月天激情| 夜夜久久综合网| 特级西西4444www无码| 精品少妇蜜臀91| 97色伦另类图片小说视频| 噜综合| 青草网在线观看| 9久精品| 丁香五月自拍| 色色色国产| 丁香婷婷五月六月久久| 4399在线观看免费毛片| 香蕉伊人综合| 色一情一乱一乱91Av| 成人国产网站| 丁香花成人区| 欧美激情久| 97碰成超视频免费视频| 亚洲国产黄色电影| 久久九九经典| 亚洲AV无码成人精品电影| 婷婷六月丁综合| 91怕怕网| www.com.色色| WWW免费视频碰碰碰碰| 成人啪啪色婷婷久| 五月天婷婷色色网| 婷婷内射视频在线| 久9久9久9久9久9久9| 三级三久久线久久99久目本WW| 99操碰| 青青草原中文字幕| 久久ER视频com| 色婷丨日丨天丨综合久久| 久久婷婷欧美| 色婷婷五月天不卡| 四月婷婷五月丁香| 久草A片| 激情综合五月婷婷| 亚洲深喉aV| 香蕉视频性爱BB做爱| 玖色色综合| 人妻九九九九| 26UUU成人网| 日日做夜夜爱| 丁香五月婷婷五月天| 日本啪啪天堂| a久久| 31色区视频免费看| 玖玖在线| 激情丁香五月婷| 五月丁香激情欧洲啪啪| 丁香在线视频| 99精品在线观看| 丁香五月婷婷国产av| 99色久| 狠狠色婷婷在线| 亚洲九九99精品视频在线播放| 玖玖婷婷五月天| 精品久久久人妻| 色一色综合| 麻豆雪千夏| 国产永久一二一起草| 狠狠干思思热| 啊V视频在线观看| 中文成人在线| 国产成人在线不卡AV| 99这里有精品免费| 26uuu| 天天日天天色| 丁香五月综合激情久久潮喷| 欧美天天草人人草| 亚洲色A| 五月天婷婷激情小说电影| 超极99精品| 婷婷五月av| 乱色色色| 性爱久久| 操人精品| 色综合久久天天综合网 | 久久这里只有精彩| 色婷婷狠狠18| 婷婷五月综合激情| pom538精品视频| 亚洲无码成人性爰网| 99视频网址| 99原创自拍视频在线观看| 亚洲综合在线播放| 极品五月天| 五月丁香在线| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 久久五月丁香激情综合| 五月婷婷六月丁香五月| 人人色人人弄人人操| 婷婷五月激情图片| 无码人妻一区| 欧美性生交XXXXX无码小说 | 色五月婷婷开心| 九九色影院| 亚洲成人无码免费| 午夜不卡成人一区二区| 99热精品在线播放| 久re热视频| 五月天狠狠草| 亚洲国产精品二二三三区| 超碰91在线| 婷婷五月色播| 日韩aⅴ视频| 天天肏天天插| 激情婷婷丁香| 九九久久五月天综合伊人| 久久视频这里99| 人人艹艹艹| 国产Va视频| 99热这里有精品| 天天操无码| 激情啪啪五月| Aα在线免费观看| 天天擼久久擼在线| 亚洲精品又粗又大又爽A片| 99色在线| 天天看A片| 欧美三级欧美一级| 色婷另类| 久久新| 国产婷婷综合| 懂色av蜜臀av粉嫩av永陈冠希| 夜夜骑天天玩天天日| 天堂伊人干| 停停色综合伊人| 欧美顶级少妇做爰HD| 精品无码av丁香五月激情| 色色网站在线| 久久五月婷婷电影| 天天干天干| 五月丁香啪啪| 五月天综合色| 婷婷色五月婷婷姐妹| 99热首页| 99re这里只有精品国产99| 特级西西4444www无码| 激情五月激情综合俺也去婷婷小说| 色五月激情网| AV在线大香蕉| 激情综合色| 久久这里只有精品热在99| 久久久精品99亚洲综合| www久久99| 色噜噜伊人| 欧美精品XXXXBBBB| 激情综合婷婷| 任你干aa| 激情綜合W W W,激情五月天| 五月丁香婷婷啪啪综合| 婷婷五月天Av| 99九九精品| 色情综合网| 五月丁香六月停停| 日本高清不卡免费一区二区三区| 色综合色色色| 26uuu精品一区二区| 激情小说视频图片| 十月丁香婷婷| 97色精品视频 | 亚洲尤物在线| a毛片二逼wwwwwwwwww| 激情六月婷婷| 欧美日韩999| 少妇被下春药玩弄A片| 婷婷六月五月天综合| 黑人无码一区| 成功精品影院| 五月婷六月丁香| caopeng97人人| 丁香五月天激情视频| 夜夜夜叫天天天做| 天堂爱啪啪| 99精品久久| 99热免| 91 九色 熟女| 九月激情婷婷丁香| 超碰猛烈的性猛交| 久久国产性爱A V| 日韩有码一区| 五月天天天色| 丁香五月停停av| 99热碰碰热| 亚洲欧美在线观看| 亚洲人人操| 91艹人| 日本97久久久精品| 91九九| 久久五月天婷婷| 电影《战争与艾拉》免费观看| 91日本在线免费| 天天操天天操天天操天天操天天操 | 五月天播播中文字幕| 99色啊| 九九综舍久久| 操操操97| 色999;丁香五月| 思思热国产在线| 天天爽爽日日做做| 日韩操啪| 欧美性色A片免费免费观看的| 婷婷在线视频| 深爱激情久久| 日本一级黄色电影| 一本狠婷婷综合| 婷婷丁香六月| 亚洲综合草草| 五月婷婷综合精品| 琪琪理论片| 99热在线观看精品| 亚洲AV成人一区二区在线观看| 天天狠狠夜夜狠狠2023| AV人人操| 79色色免费| 激情五月伊人婷婷| 伊人婷婷大香蕉| 五他月天啪啪啪| 一本大道熟女人妻中文字幕在线| 97干欧美| 五月天com| 青青草原精品久久| 亚洲熟妇AV综合网五月丁香伊人 | 丰满少妇猛烈A片免费看观看 | 99爱在线视频| www色色色com| 婷婷五月精品中文字幕| 丁香五月婷婷色| 玖玖资源网站最新站| 他改变了拜占庭| 五月久久婷婷天堂视频| 婷婷五月天丁香久久| 色狠狠色综合久久久绯色aⅴ影视| 夜夜干夜夜操| 成人国产综合| WWW.桔色成人.COM| 99免费在线| 中文国产五月天| renre人人操国产超碰在线| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 午夜一区| 久久五月视频| 亚洲熟女色| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 曰韩五月丁香色婷婷无码| 激情第四色| 五月婷视频| 久热91| 久久婷婷热| 激情伊人五月天| 六月丁香婷| 99日韩| www夜夜| 色播五月婷婷| 五月天综合色| 97操操| www.夜夜操| 99re热视频这里只精品| 99热免费| 九九九激情综合| 伊人大综合| 天天色凹凸| 国产第99页| 婷婷久久伊人| 123草逼网| 操碰99| www.激情.com.| 久久久久久天天日天天爱| 99热精品网| 色情激情五月| 国产精品热搜丁香五月婷婷| 99热精品在线播放| 五月婷婷激情综合av| 激情床戏| 色五月丁香五月| 无码激情AAAAA片-区区| 国产视频色色色色色色色 | 99re26视频| 色永久| 亚洲秘 无码一区二区三区妃光/1| 九九热99免费视频| 天天爽天天干| 538在线精品| 92久久久| 夜夜资源站| 丁香五月婷婷性爱| 日日夜夜综合| 久久精品系列| 99热18| 精品人妻午夜一区二区三区四区| 日韩五月婷婷久久| 激情綜合網址| 色黑鬼导航| 99re这里只有精品视频了| 丁香五月激情啪啪| 丁香五月婷婷亚洲天堂| 亚洲AV第二区国产精品| 超碰二区| 成人色五月天| 激情婷婷六月天| 久久人人妻| 国产午夜精品AV一区二区麻豆| 亚洲色区17| 欧美色图天堂网| 开心五月婷| 狠狠干婷婷| 精品久热| 五月亭大香蕉| ss五月天激情| 思思精品热在线| 99色视频| 爱iii做iiii日日| 99热只有精品综合| 久久久97| 久久 视频这里只有精总| 色综合综合色| 激情综合视频| 婷香五月| 操丝袜视频影院导航| 九九自拍网| 色色婷婷综合| 99热国产精品| 久99久热只有精品国产99| 色五月婷婷av| 丁香啪啪中文字幕| 亚洲色精彩| 婷婷丁香五月亚洲| 在线不卡视频| 精品人妻在线| 五月婷婷插一插| 国产成人综合在线| 丁香五月激情五月色综合| 精a品a视a频| 狠狠99| 风流少妇A片一区二区蜜桃| 久久综合首页| 热成人网| 狠狠狠狠狠狠| 91天堂网综合| 亚洲五月天综合| 婷婷五月天色色| 天啪色| 婷婷日日天天| 五月丁香婷婷色| 亚洲一级AV在线免费播放| 天天日人人爽| 亚洲va成人va成人va在线观看| 五月开心播播网| 天天色天天搡| 变态另类9| 欧美日韩国产一区二区| 婷婷网五月| 综合激情五月天| 99ri在线视频| 日韩成人电影在线播放| 国产色色小草视频| 六月婷婷狠狠| 亚洲五月天婷婷| 久久婷婷啪啪视频| 婷婷五月丁香欧洲| 午夜日韩久久久网站| 日韩精品色| 国产日产亚系列精品版优势| 亚洲 综合中文| 婷婷金品综合视频| 高清a片基地| 日撸夜撸日操| 影音先锋美国A| 综合激情综合啪啪| 99热精品在线在线| 九九碰九九爱97超碰| 日韩人妻在线观看| 天堂中文国产| 婷婷月综合| 国产1区2区3区| 婷婷五月天免费视频| AV网址大全在| 欧美人妻一区二区| 国产精品成人网站| 色偷偷色婷婷| 热久久婷婷| 亚洲最大激情无码| 色色婷婷色色| 日本久久精品18| 丁香婷婷五月色成人网站| 色播五月综合网| 色呦呦美女| 日本久久天堂| 亚洲精品乱码久久久久久按摩观| 色播五月网| 亚洲一区国产传媒|