亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

QT+FFMPEG音頻播放實(shí)現(xiàn):重采樣、環(huán)形緩沖區(qū)與音畫(huà)同步 1. 從視頻到音頻為什么播放器的另一半才是真正的硬骨頭很多人做播放器Demo的時(shí)候習(xí)慣先把視頻畫(huà)面跑通看到窗口里能出畫(huà)面了就覺(jué)得大功告成。但真正做過(guò)完整播放器的人都知道音頻這條鏈路才是最容易翻車的地方。視頻丟幾幀你可能肉眼根本察覺(jué)不到但音頻只要緩沖區(qū)管理稍微出點(diǎn)偏差立刻就是刺耳的爆音、卡頓或者音畫(huà)不同步。我見(jiàn)過(guò)不少項(xiàng)目視頻渲染做得漂漂亮亮結(jié)果一播放聲音就像老式收音機(jī)搜不到臺(tái)一樣滋啦滋啦響個(gè)不停。這個(gè)項(xiàng)目標(biāo)題說(shuō)的是“QT FFMPEG實(shí)現(xiàn)基本播放器”的第四篇聚焦在音頻播放實(shí)現(xiàn)上。前面幾篇大概率已經(jīng)把解封裝、視頻解碼、視頻渲染這些環(huán)節(jié)跑通了現(xiàn)在輪到音頻這塊。QT負(fù)責(zé)界面和事件循環(huán)FFMPEG負(fù)責(zé)解封裝和解碼這兩者的組合算是桌面端播放器開(kāi)發(fā)里最經(jīng)典的搭配之一。但經(jīng)典不代表簡(jiǎn)單音頻播放涉及的東西比視頻要多得多——采樣率、聲道布局、采樣格式、重采樣、音頻緩沖區(qū)管理、設(shè)備回調(diào)機(jī)制每一個(gè)環(huán)節(jié)都有坑。這篇文章適合誰(shuí)看如果你已經(jīng)用QT和FFMPEG搭出了一個(gè)能播視頻的框架現(xiàn)在想把它補(bǔ)全成真正能用的播放器那這篇就是寫給你的。如果你還沒(méi)接觸過(guò)FFMPEG建議先把解封裝和解碼的基礎(chǔ)過(guò)一遍再來(lái)看音頻部分不然可能會(huì)有點(diǎn)吃力。我會(huì)把音頻播放的完整鏈路拆開(kāi)從解碼后的原始音頻數(shù)據(jù)一直講到怎么讓它從揚(yáng)聲器里出來(lái)中間涉及的重采樣、緩沖區(qū)設(shè)計(jì)、線程同步這些關(guān)鍵點(diǎn)都會(huì)給出可直接參考的實(shí)現(xiàn)思路。先說(shuō)一個(gè)核心結(jié)論音頻播放的本質(zhì)就是把解碼出來(lái)的PCM數(shù)據(jù)按照正確的時(shí)間節(jié)奏源源不斷地喂給音頻設(shè)備。聽(tīng)起來(lái)很簡(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)致音畫(huà)不同步或者聲音變調(diào)。2. 音頻播放鏈路的整體設(shè)計(jì)思路2.1 為什么不能直接拿解碼后的數(shù)據(jù)去播放FFMPEG解碼出來(lái)的音頻數(shù)據(jù)格式是不確定的。它可能是AAC解碼出來(lái)的浮點(diǎn)數(shù)據(jù)也可能是MP3解碼出來(lái)的16位整型數(shù)據(jù)采樣率可能是44100Hz也可能是48000Hz聲道數(shù)可能是單聲道也可能是5.1環(huán)繞聲。而音頻設(shè)備對(duì)輸入格式是有明確要求的比如大部分聲卡只接受S16LE16位有符號(hào)整型小端序格式、44100Hz或48000Hz采樣率、雙聲道的數(shù)據(jù)。這就意味著解碼后的數(shù)據(jù)幾乎不可能直接丟給音頻設(shè)備去播。中間必須經(jīng)過(guò)一個(gè)格式轉(zhuǎn)換的環(huán)節(jié)也就是重采樣。FFMPEG提供了swresample庫(kù)專門做這件事它能把任意格式的音頻數(shù)據(jù)轉(zhuǎn)換成目標(biāo)設(shè)備需要的格式。這個(gè)環(huán)節(jié)是必須的不是可選的。我剛開(kāi)始做的時(shí)候想過(guò)一個(gè)偷懶的辦法能不能讓音頻設(shè)備去適配解碼器的輸出格式理論上可以但實(shí)際操作中你會(huì)發(fā)現(xiàn)不同文件的解碼輸出格式千差萬(wàn)別你不可能為每種格式都去協(xié)商設(shè)備參數(shù)。而且音頻設(shè)備打開(kāi)后格式就固定了中途切換格式意味著要關(guān)閉再重新打開(kāi)設(shè)備這會(huì)造成明顯的播放中斷。所以統(tǒng)一轉(zhuǎn)成一種固定格式是唯一靠譜的做法。2.2 音頻緩沖區(qū)的設(shè)計(jì)哲學(xué)音頻播放和視頻渲染最大的區(qū)別在于視頻是“拉”模式音頻是“推”模式。視頻渲染是你主動(dòng)去畫(huà)一幀畫(huà)完就完事什么時(shí)候畫(huà)下一幀由你的主循環(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)音畫(huà)不同步的問(wèn)題調(diào)整起來(lái)會(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)來(lái)對(duì)抗網(wǎng)絡(luò)抖動(dòng)。2.3 線程模型的選擇QT和FFMPEG結(jié)合做播放器線程模型的設(shè)計(jì)直接決定了整個(gè)系統(tǒng)的穩(wěn)定性和復(fù)雜度。常見(jiàn)的方案有三種第一種是全部放在主線程用QTimer定時(shí)去驅(qū)動(dòng)解碼和播放。這種方案最簡(jiǎn)單但問(wèn)題也最大——主線程還要處理UI事件一旦UI卡頓音頻就會(huì)跟著卡。而且音頻設(shè)備回調(diào)通常在自己的線程里跨線程操作緩沖區(qū)需要加鎖在主線程里做重活容易導(dǎo)致鎖競(jìng)爭(zhēng)。第二種是解碼在一個(gè)獨(dú)立線程音頻設(shè)備回調(diào)在它自己的線程兩者通過(guò)線程安全的環(huán)形緩沖區(qū)通信。這是最經(jīng)典的方案也是我推薦的做法。解碼線程只管往緩沖區(qū)里寫數(shù)據(jù)音頻回調(diào)只管從緩沖區(qū)里讀數(shù)據(jù)兩者通過(guò)讀寫指針來(lái)同步不需要頻繁加鎖。第三種是解碼和音頻輸出都在同一個(gè)線程用阻塞式的音頻API來(lái)播放。這種方案在某些平臺(tái)上可行但在QT里不太合適因?yàn)镼T的事件循環(huán)和音頻設(shè)備的阻塞調(diào)用容易互相干擾。我最終采用的是第二種方案一個(gè)獨(dú)立的解碼線程負(fù)責(zé)解封裝、解碼、重采樣然后把PCM數(shù)據(jù)寫入環(huán)形緩沖區(qū)音頻設(shè)備通過(guò)回調(diào)函數(shù)從環(huán)形緩沖區(qū)讀取數(shù)據(jù)。環(huán)形緩沖區(qū)用原子操作來(lái)管理讀寫指針避免加鎖帶來(lái)的性能開(kāi)銷。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)來(lái)取。這里有一個(gè)容易忽略的點(diǎn)音頻解碼器有時(shí)候會(huì)輸出多個(gè)AVFrame對(duì)應(yīng)一個(gè)AVPacket尤其是AAC這種格式。所以你不能假設(shè)一個(gè)packet進(jìn)去就一個(gè)frame出來(lái)需要循環(huán)調(diào)用avcodec_receive_frame直到返回AVERROR(EAGAIN)為止。這個(gè)細(xì)節(jié)如果處理不好會(huì)導(dǎo)致音頻數(shù)據(jù)丟失表現(xiàn)出來(lái)就是聲音斷斷續(xù)續(xù)或者有規(guī)律的卡頓。3.2 SwrContext的初始化與參數(shù)配置SwrContext是重采樣的核心它的初始化需要明確輸入和輸出兩端的參數(shù)。輸入?yún)?shù)從解碼器的AVCodecContext里獲取包括采樣率、采樣格式、聲道布局。輸出參數(shù)根據(jù)音頻設(shè)備的能力來(lái)定通常選擇S16LE、44100Hz或48000Hz、立體聲。初始化的時(shí)候有一個(gè)關(guān)鍵點(diǎn)聲道布局要用AVChannelLayout而不是舊的channel_layout整數(shù)。新版本的FFMPEG已經(jīng)廢棄了舊的channel_layout字段如果你還在用舊接口編譯的時(shí)候會(huì)有一堆警告而且未來(lái)版本可能會(huì)直接移除。正確的做法是用av_channel_layout_default或者av_channel_layout_copy來(lái)設(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來(lái)做時(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)者的無(wú)鎖環(huán)形緩沖區(qū)用原子變量來(lái)管理讀寫位置。緩沖區(qū)的大小需要是2的冪次方這樣可以用位運(yùn)算來(lái)代替取模運(yùn)算提高效率。比如設(shè)置緩沖區(qū)大小為65536字節(jié)那么寫入位置的計(jì)算就是(write_pos len) (size - 1)。讀寫位置的更新用std::atomic來(lái)保證原子性避免加鎖。有一個(gè)細(xì)節(jié)需要注意緩沖區(qū)的“滿”和“空”的判斷。當(dāng)寫指針等于讀指針時(shí)緩沖區(qū)是空的當(dāng)寫指針加一等于讀指針時(shí)緩沖區(qū)是滿的。這意味著緩沖區(qū)實(shí)際可用的空間比總大小少一個(gè)字節(jié)。對(duì)于音頻數(shù)據(jù)來(lái)說(shuō)這個(gè)字節(jié)的浪費(fèi)完全可以接受。寫入數(shù)據(jù)的時(shí)候如果緩沖區(qū)剩余空間不夠可以選擇等待或者丟棄。我的做法是等待因?yàn)橐纛l數(shù)據(jù)丟棄會(huì)導(dǎo)致聲音斷裂而等待最多只會(huì)造成短暫的延遲。但等待不能無(wú)限等需要設(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ū)里沒(méi)有足夠的數(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ì)出問(wèn)題。4. 完整實(shí)操流程從零搭建音頻播放模塊4.1 環(huán)境準(zhǔn)備與依賴配置在開(kāi)始寫代碼之前需要確保FFMPEG的開(kāi)發(fā)庫(kù)已經(jīng)正確安裝。Windows下可以用vcpkg或者自己編譯Linux下用包管理器安裝libavcodec-dev、libavformat-dev、libswresample-dev這些開(kāi)發(fā)包。QT這邊需要確保Multimedia模塊已經(jīng)啟用在.pro文件里加上QT multimedia。FFMPEG的版本建議用5.0以上因?yàn)樾掳姹镜穆暤啦季諥PI和舊版本差異比較大用新版本可以避免很多兼容性問(wèn)題。如果用的是4.x版本需要注意channel_layout相關(guān)的接口還是舊的代碼需要做相應(yīng)的適配。編譯的時(shí)候有一個(gè)常見(jiàn)的坑FFMPEG的庫(kù)文件順序。鏈接器對(duì)庫(kù)的順序是有要求的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來(lái)保證讀寫指針的可見(jiàn)性。寫入數(shù)據(jù)后更新寫指針用release語(yǔ)義讀取寫指針用acquire語(yǔ)義這樣可以確保數(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。如果格式不匹配播放出來(lái)的聲音會(huì)是噪音。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 聲音卡頓、斷斷續(xù)續(xù)這是最常見(jiàn)的問(wèn)題原因通常有三個(gè)緩沖區(qū)太小、解碼速度跟不上、或者音頻設(shè)備回調(diào)讀取數(shù)據(jù)不及時(shí)。排查的時(shí)候可以先看緩沖區(qū)的水位。如果緩沖區(qū)經(jīng)常處于接近空的狀態(tài)說(shuō)明解碼速度不夠需要優(yōu)化解碼邏輯或者增大緩沖區(qū)。如果緩沖區(qū)經(jīng)常是滿的說(shuō)明音頻設(shè)備讀取太慢可能是回調(diào)線程被阻塞了。我遇到過(guò)一次比較隱蔽的情況解碼線程和音頻回調(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 音畫(huà)不同步音畫(huà)不同步是播放器開(kāi)發(fā)中最頭疼的問(wèn)題之一。音頻和視頻有各自的時(shí)間基如果兩者沒(méi)有對(duì)齊就會(huì)出現(xiàn)聲音和畫(huà)面不一致的情況。我的做法是以音頻時(shí)鐘為基準(zhǔn)視頻渲染的時(shí)候根據(jù)音頻時(shí)鐘來(lái)調(diào)整。具體來(lái)說(shuō)音頻播放的時(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)聽(tīng)起來(lái)就是“啪”的一聲。解決辦法是在播放結(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 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決方案聲音卡頓緩沖區(qū)太小觀察緩沖區(qū)水位增大緩沖區(qū)到200-500ms聲音變調(diào)采樣率不匹配打印輸入輸出采樣率檢查SwrContext參數(shù)音畫(huà)不同步時(shí)鐘未對(duì)齊對(duì)比音頻和視頻時(shí)間戳以音頻時(shí)鐘為基準(zhǔn)同步播放結(jié)束有雜音緩沖區(qū)數(shù)據(jù)被截?cái)鄼z查關(guān)閉流程等緩沖區(qū)播完再關(guān)閉設(shè)備完全沒(méi)聲音格式不匹配檢查QAudioFormat確保與SwrContext輸出一致聲音有回聲緩沖區(qū)數(shù)據(jù)重復(fù)檢查讀寫指針確認(rèn)讀寫指針更新正確5.6 幾個(gè)我踩過(guò)的坑第一個(gè)坑是avcodec_receive_frame的循環(huán)沒(méi)有正確處理。我一開(kāi)始只調(diào)用了一次以為一個(gè)packet對(duì)應(yīng)一個(gè)frame結(jié)果AAC音頻丟了很多幀聲音斷斷續(xù)續(xù)。后來(lái)改成循環(huán)調(diào)用直到EAGAIN才解決。第二個(gè)坑是環(huán)形緩沖區(qū)的內(nèi)存屏障。我一開(kāi)始用relaxed語(yǔ)義在單線程測(cè)試的時(shí)候沒(méi)問(wèn)題但多線程跑起來(lái)偶爾會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂。后來(lái)改成acquire/release語(yǔ)義就穩(wěn)定了。這個(gè)問(wèn)題的隱蔽性很強(qiáng)因?yàn)槌鲥e(cuò)的概率不高但一旦出現(xiàn)就很難排查。第三個(gè)坑是QAudioSink的緩沖區(qū)大小設(shè)置。QAudioSink默認(rèn)的緩沖區(qū)大小可能不適合所有場(chǎng)景可以通過(guò)setBufferSize來(lái)調(diào)整。我一開(kāi)始沒(méi)設(shè)置結(jié)果在某些機(jī)器上延遲特別大后來(lái)設(shè)置成固定值就正常了。第四個(gè)坑是重采樣器的flush。播放結(jié)束的時(shí)候SwrContext內(nèi)部可能還有緩存的樣本沒(méi)有輸出需要調(diào)用swr_convert傳入nullptr來(lái)flush。如果忘了這一步最后一段音頻會(huì)丟失。6. 性能優(yōu)化與擴(kuò)展思路6.1 減少內(nèi)存拷貝音頻數(shù)據(jù)從解碼到播放中間會(huì)經(jīng)過(guò)多次拷貝解碼器輸出到AVFrame是一次重采樣到輸出緩沖區(qū)是一次寫入環(huán)形緩沖區(qū)是一次音頻設(shè)備讀取是一次。每次拷貝都會(huì)消耗CPU時(shí)間對(duì)于高采樣率的音頻來(lái)說(shuō)這些開(kāi)銷累積起來(lái)不容忽視。優(yōu)化的思路是盡量減少中間緩沖區(qū)。比如重采樣的時(shí)候可以直接輸出到環(huán)形緩沖區(qū)的可寫區(qū)域避免一次額外的拷貝。不過(guò)這需要環(huán)形緩沖區(qū)支持“預(yù)留空間”的操作實(shí)現(xiàn)起來(lái)會(huì)復(fù)雜一些。另一個(gè)優(yōu)化點(diǎn)是使用內(nèi)存池來(lái)管理AVFrame和AVPacket避免頻繁的alloc和free。FFMPEG提供了av_frame_alloc和av_packet_alloc但每次調(diào)用都有開(kāi)銷??梢灶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í)鐘的精度直接影響到音畫(huà)同步的效果。我的做法是記錄已經(jīng)寫入環(huán)形緩沖區(qū)的總樣本數(shù)減去緩沖區(qū)里還未播放的樣本數(shù)得到實(shí)際已經(jīng)播放的樣本數(shù)再除以采樣率就是當(dāng)前音頻時(shí)間。這個(gè)計(jì)算需要考慮到音頻設(shè)備的延遲。QAudioSink提供了processedUSecs()方法可以獲取已經(jīng)處理的微秒數(shù)用這個(gè)值來(lái)計(jì)算音頻時(shí)鐘會(huì)更準(zhǔn)確。但要注意processedUSecs()的更新頻率可能不夠高需要結(jié)合樣本數(shù)來(lái)計(jì)算。6.4 后續(xù)可以擴(kuò)展的方向這個(gè)音頻播放模塊目前只做了最基本的播放功能后續(xù)可以擴(kuò)展的方向很多。比如加上音量控制、靜音切換、音頻軌道切換、變速播放等功能。變速播放需要修改重采樣的輸出采樣率同時(shí)調(diào)整視頻的播放速度來(lái)保持同步。如果要做音頻可視化可以在音頻回調(diào)里獲取PCM數(shù)據(jù)做FFT變換后繪制頻譜圖。這個(gè)功能在音樂(lè)播放器里很常見(jiàn)實(shí)現(xiàn)起來(lái)也不復(fù)雜但要注意不能在音頻回調(diào)里做太重的計(jì)算否則會(huì)影響播放的流暢性。另外如果要做網(wǎng)絡(luò)流播放緩沖區(qū)管理需要更復(fù)雜的策略來(lái)對(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í)鐘同步、性能這些方面。不要一上來(lái)就追求完美先把聲音放出來(lái)再慢慢調(diào)優(yōu)。遇到問(wèn)題的時(shí)候多打印日志觀察緩沖區(qū)的水位變化大部分問(wèn)題都能從數(shù)據(jù)上找到線索。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产精品在线一区二区| 色婷婷网| 一区在线国产播放| 玖玖97综合| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 天天欧美色| 亚洲综合码| 一区二区视频你懂的| 亚洲涩图欧美| 男人的天堂 在线一区| 日本国产亚洲一区在线观看| 九九人妻| 国产女人视频三四五区| 大香蕉免费乱伦视频| 中文字幕成人| 久久爱超碰网| 日韩内| 91老司机在线| 国产精品无码论坛| 91中文精品日韩欧美在线| 91老熟女91老女人| 日韩免费三级黄片电影| 九热视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 九九精品无码专区免费| 日本123区操B视频| 日韩ab网| 九九亚洲| 热99这里只有精品| 国产精品久久久久久久久久久久久久久久 | 亚欧美天堂在线| 久久久九九九九| 人人妻人人爽一区二区三区| 国产精选三级在线观看| 一本一首道人妻少妇免费久久| 欧美宗合网| 成人av影院在线观看| 天天做天天爽| 97操97干| 国产黄色影片在线观看| 91狠| 日夜精品| 爆操无码| 色网综合网| 国产亚洲99久久精品熟| 黄污污污污| 中文字幕午夜精品久久久| a男人的天堂久久一级A毛片| 日韩人妻网站| 人妻色偷色噜| 大香蕉伊人亚洲| 97操b| 91成人在线免费视频| 99999精品成人| 久久久精品,3| 五月丁香婷婷色| 亚洲日韩熟女人妻高清在线| 天天色黄色影院天天操| 免费网色网站| 天天操夜夜嗨| 天天色踪合| 亚洲av成人精品一区| 五月婷在线| 国产外初女出血视频| 色操逼网| 欧美大战久久久伊人| 校园春色综合网| 99精品久久| 97爱啪| 久久社区一区二区三区| 九九热在线精品视频| 国产精品久久久吖| 人人手机欧洲亚洲国产人妻| 日本一级真人黄色性爱视频| 久久一区无码| 国产成人超碰在线| 综合 青草 伊久久 影院 综合| 欧美成人精品欧美一级乱黄一区二… | 欧洲精品二区| 欧洲色色| 91国模| 热久久这里只有精品| 黄站在线免费观看| 激情综合五| 欧美熟妇精品黑人巨大91| 成人性爱电影一区二区| 操久久久久| 五月天综合| 亚洲毛片久久| 人妻天天爽夜夜爽爽| 四虎免费在线观看| 日本一区二区三区欧美日韩中文字幕| 欧美成人A√在线一区二区| 91夜夜蜜桃臀1区2区3区| 操b在线观看| 96免费视频在线| 中国少妇XXXX做受| 精品国产乱码久久久| 十八禁视频网站| 亚洲AV色图一区| 色综合九九| 农村少妇久久久久久久| a在线观看| 日韩人妻无码不卡网站| 一区黄二区黄| 国产精品女生av| 99re99视频在线免费观看| 夜夜天天噜狠狠爱2021| 天天色综合影视网| 久久9精品视频| 人妻啪| 天海翼久久| 人妻系列无码专区中文有码| 2017超碰| 五月丁香亭亭| 国产福利视频精品视频| 亚洲少妇自拍中文字幕懂色| 精品免费一区二区三区在线亚洲人成| 久久久久久69国产一区二区| 天天干夜夜操一区二区| 天天91~综合入口| 国产品精品自在在线午夜免费| 啊啊啊好舒服好爽啊啊啊视频| 日本三级一区二区 在线 | 欧美高清第一页| 91夜色chaopeng| 多乙久久久久久| 南澳成人一级片在线播放| 丝袜美腿欧美| 欧美极度丰满熟妇hd| 青青草影视蜜久久| 国产精品九9| 国产区91柔拿会所技师| 亚洲综合999| 高跟伊人julia ann| 日本欧美国内在线| 人人看黄色视频| 久久宗合亚洲| 天天干2区3区| 乱伦av.com| 这里只有97精品| 91女网站| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 美女啊啊啊啊啊啊| 九九九九九九九九九九九九九九九女| 夜夜爽爽爽| 岛国AB视频| 亚洲天堂2020| 999热日韩精品| 色大师网站www永久网站视频| 亚洲AV无码乱码在线观看性色| 亚洲毛片基地专区| 丁香7月婷婷| 熟女中出视频| 成人欧美一区二区三区黑人一| 欧美成人A√在线一区二区| 综合亚州欧美| 免费超碰97久久| 国产视频一区二区在线观看| 亚洲夜夜欢无码一区二区| 国产品精品自在在线午夜免费| 人妻天天爽夜夜爽2| 91色黑人少妇| 久久久久久久久久久97| 综合婷婷| 久久精视频美日韩在线视频| 久久久精品电影| 亚洲熟妇A V黑人| 超碰在线1234区| 97久久精品国产| 神马精品视频| 丁香五月AV| 亚洲免费成人精品电影| 免费av高清无码| 午夜经典| 亚洲双插| 东方亚洲在线操逼天堂| 歐美性天天| 99青草| 狼人久草| 一起草AV| 99操逼| 久久久夜夜嗨免费视频| 久久成人国产| 亚洲精品成人动漫在线| 富女玩鸭子一级毛片| 91亚洲情色| 亚洲偷91色| 91天射| 欧美中字二区| 农村妇女精品一区二区| 欧美精品91| 91美腿丝袜在线观看| 日本污ww视频网站| 亚洲操人| 国产福利精品最新在线| 2018色综合天天操| 激情综合五月丁香| 色婷婷视频| 亚洲啪啪性视频| 国产高清无码一区二区三区四区皇冠| 免费黄色A片| av在线一区二区三区| 日韩无码黄色片| 免费又黄又裸乳的视频| 少妇一级婬片免费放一级a性色.| 韩三级a视频在线观看| 久久久久99999| 日韩射精| 无码人妻精品酒店| 国产粉嫩蜜臀av一区二区三区| 欧美中文综合| 午夜亚洲WWW湿好大| 翔田千里AV无码秘 三区| 亚洲色婷婷综合久久久久中文| 美女丝袜激情小说| 我爱操| 色天天野狼综合社区| 欧美日韩亚洲少妇寂寞影院正在播放| 午夜啊啊| 日韩无限资源| 人妻久久一区二区三区 | 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 丝袜狠狠草尤物人妻av91| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 人妻天天夜夜爽一区二区| 91久久久久免| 麻豆黄四叶草网站| 黄色AAAAAAAAAAA大片| 一区二区三区高清天码| 人人操人人狠狠操| 麻豆天美国美国产AV| 淫色网综合| 欧美97视频| 91日日夜夜| 激情小说激情视频| 色吧5亚洲| 久久直播国产| 五月丁香成人网| 欧美专区第一页| 99re69综合| 91在线/欧洲| 热热色青青草| 狠狠色噜噜狠狠狠狠2018| 五月久久HDAV| 麻豆天美国美国产| 极品丝袜无码| n1038 一二三区| 中出789在线视频| 青青草字幕AV| 欧洲亚洲人妻无码高清久久三区四区| 精品视频一二三中文| 亚洲日韩在线a不卡99精品| 久久国产AⅤ| 奇米狠999| 強姦亂倫a| 国产成人一级av88| 亚洲一区二区三区麻豆传媒| 亚洲精品天堂久久A∨51成人漫| 涩涩五月天| 91性情| 留下AⅤ黄色片| 亚洲电影中字一区二区| 蜜乳av首页| 一区二区首页| 国产精品区在线12p| 搡老女人老妇女AAA一VU麻豆| 日日插夜夜| 成年人网站在线免费观看| 人人妻人人操人人乐| 天天操美美| 操一对老熟妇爽上天视频| 花花AV导航| 无码黑人精品一区二区三区三| 九月伊人中文字幕| 丁香九月激情啪| 日韩传媒在线| 伊香蕉综合久久久久久久噜噜噜| 农村少妇久久久久久久| 欧美日韩操逼动图| 亚洲精品97久久中文字幕| 四虎影视国产精品| 国产综合网站在线播放| 五月天社区| 久久加勒比| 97伦综合| 少妇激情一区二区三区视频| 欲色啪| 国产精品999zyz| 草草影院日本第一页| 97超碰人操| 日本免费中文一区二区三区四区| 熟妇人妻一二三区免费| 一区二区视频你懂的| 精品久久在线区一区| 97av在线视频| 自偷自拍的亚洲视频| 国产精品女生av| 亚洲在饯| 91亚洲欧美激情| 日本不卡免费二区| 91欧美巨乳| 九九国产| 大香蕉在线SuP| 久久久久久大| 色月天AV导航| 最新亚洲风情电影| 久久免费看高潮毛片韩国| 久久99操天天日| 丰满精品人妻少妇久久字幕| 96久久久久| 欧美丰满少妇xx高潮| 色第一页| av亚洲天堂资源网站| 少妇69中文| 色九九综合| 激情久久av一区av二区av| 熟妇操花| 久草大| 啊啊啊啊啊啊在线| 亚洲最大无码中文字幕网站| 草B在线| 人妻少妇一区二区| 精品无码秘 人妻一区二区| 思思热国产高清| 91美女高潮| 九九热只有精品| 青青草大香蕉视频| 97色碰| 欧美Ⅴ性爱| 黑人白女精品一区| 污色区网站| 久日91在线| 亚洲成人性爱在线观看| 亚洲色图欧美色图制服丝袜| 婷婷三区| 国产精品国产| 亚洲欧洲自拍| 日韩精品国产一区二区| 国产亚洲禁久一区二区| 男人亚洲91首页在线| 精品免费1| 青青草久久在线| 精品国产乱码久久久久久久久久毛片| …亚洲黄色厕厕女女在线播…| 日韩av在线精品观看| 91午夜无码| 91|九色|国产熟女| 97色97好| 伊人久久亚洲中文字幕不卡| 男人天堂欧美| 岛国激情视频软件| 九九综合色| 九一综合精品视品av| 一二视频神马久久传媒| 乱伦熟女专区| 亚洲国产欧美中日韩成人综合视频| 六月婷婷色综合| 97久久免费| 女人午夜视频777| 黑人娇小av在线播放| 超碰人妻中文在线| 欧美日韩在线小说 | 老熟女搡BBBB搡BBBB视频| 福利伊人玖玖国产| 歐美一級亂黃99在綫精品| 天天躁狠狠躁av| 91综合网| 97在线精品| 1024手机看片欧美日韩| 欧美99999| 隔壁邻居波多野结衣中文字幕 | 国产家庭乱伦表演| 久久久四区| 色网1| 97免费视频网| 欧美 亚洲 大香| 色色99| 丁香六月东京热| 99re免费视频精品全部| 91在线精品一区二区三区| 99天堂网| 亚洲色图 图片| 亚洲影院成人| 96精品在线| 插插综合网天天影视网| 亚洲日韩美女中文字幕乱| 欲色影视综合吧| 天天综合网在线观看| 中文字幕88av在线| 日本综合色图| 蜜臀久久99精品久久久老,,| 九九黄色网| 激情文学亚洲| 天天干干天天干干| 蜜桃色色网站视频三区| 操操碰| 这里都是精品在线观看| 女人 A一级| 加勒比在线视频一区二区三区| 激情小说日韩无码| 久热影视| 天天碰操中国年青熟妇| 精品无码久久久| 97天天搞在线| 蜜臀在线免费观看在线免费观看| 吉川爱美98堂在线| 成人贴图日韩欧美| 免费人人搞97| 亚洲日韩东京热一区| 97欧美色资源| 亚洲啪啪性视频| 伊人久久久日韩一区| 日本精品中文字幕视频| 香蕉久久精品| 三级特黄60分钟播放| 99久在线精品99re8a| 26uuu偷拍亚洲欧洲综合| 99在线视频播放| 欧美黄片免费在线观看视频| 韩国嫰模上门援交视频| 欧美操人| 久久精品人妻一区| 蜜臀精品1区2区| 久久久久亚洲熟妇熟女| 欧美男人亚洲天堂| 久久久国产成人一区二区三区在线 | 超碰偷拍| 日韩乱码av| 午夜福利一区二区影院| 久久久内射良家| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 青春草A| 99精品热| 色av中文字| 在线亚洲丝袜视频网站| 国产精品不卡少妇白| 欧美激情高清性猛交| 九九视频黄色片| 黄色片大香蕉| 麻豆性爱视频在线播放| 在线啊啊啊| 一级性爱视频免费观看 | 操逼操逼操| 亚洲欧洲无码bt精品合集| 久久超碰97中文字幕| 亚洲第一页欧美| 久久蜜色情在线视频xxx免费观看| 肉丝中文无码高清| 久久丁香久草综合网| 影音先锋视频在线| 美女十八禁| 伊人久久亚洲中文字幕| 久久精品国产96精品亚洲拳交| 丝袜 中出 制服 人妻 美腿 中文字幕| 97人亚洲综合字幕| 婷婷丁香五月综合| 五月丁香六月综合缴清无码| ,成人免费啪啪视频| 在线综合色| 欧美 传媒 麻豆 日韩 偷拍| 国产成人精品网站| 日韩成人精品视频自拍| 99久久综合| 加勒比伊人| 91狠狠综合久久| 男人的天堂久久狠| 一级黄色性爱A级片| 久草资源欧美在线视频| 成人性爱免费播放| 91精品丝袜在线观看| 啊啊啊啊好疼视频| 四虎影视永久在线免费| 亚州色站 日韩电影| 91欧美网| 久久97| 超碰欧美在线欧美| 一区二区视频你懂的| 久悠悠av| 欧美激情片一区二区| 亚洲欧洲美腿丝袜| 蜜桃久久综合视频| 久久综合九九| 丁香五月综合| 日本精品一区二区中文字幕| 日韩精品免费高清视频在线| 欧美人人操人人插| av一区二区三区不卡| 999综合网| 日日骚网站| 丝袜美腿操av| 青草精品视频一日本久久久久网站| 亚洲色图欧美色图制服诱惑| 久久久99999久网站| 亚洲色欲一区二区三区| 少妇与黑人高潮在线| 超碰在线974| 亚洲色阁| 天天日天天爽| 亚洲一区二区三区在线激情| 超碰人妻中文在线| 97chaopengongkai| 香蕉大久久久| 综合熟妇一区二区三区| 久久97超碰| 亚洲夜色在线| 色欧美色交综合| 欧美日韩资源在线| 久久欧美按摩999| 欧美少妇一区二区三区| 宗合情欲网| 日韩精品操少妇| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 日韩黄色av中文字幕| 日韩操p| 午夜免费视频1000| 欧美色图电影| 97香蕉碰碰人妻国产欧美| 中文字幕在线第二页| 日韩一区二区三区四区五区| 最新国产精品久久精品| 97亚洲一区| 精品丰满熟妇人妻一区| 久热99| 日韩综合无码一区久久92| 日韩电影中文字幕| 91少妇香蕉久久精品| 99re99在线视频| 凹凸视频在线一区二区| 超碰AV在线| 91成人精品| 欧美72网页| 欧美国产操逼| 91精品久久久久五月天精品| 国产不卡的视频| 女人被添高潮免费视频| 色综91| 日韩肏逼视频| 婷婷15月天青娱乐| 亚洲骚女一区二区三区| 黄片免费看的| 丁香婷婷五月| 日韩内| 操学生天天| 日日日日日| 成人无码影片视频在线| 久久久久久久强迫| www.五月天| 一级毛片电影免费看| 久久无码精品| 国产欧美一区激情交| 久久久国产精品人妻丝袜| 熟女91网| 天天色天天干天天爱| 五月婷婷久久综合| 欧美78| 六月丁香久久| 东京热视频网| 一个国产在线综合网站| 国产JDAV无码视频在线观看| 97超碰中文在线| 天美传媒av在线| 懂色中文一区二区三区| www.超碰| 国产精品另类一区大香蕉| 26uuu国产亚洲综合| 91亚州日韩高清| KK色在线影院| 欧美少妇性爱网站| 九九九九精品一区| 97在线精品观看视频| 国产一区96在线| 欧美激情视频一区二区| 色五月综合| 亚洲一区制服诱惑| 久久九九视频九九视频| 国产亚洲一黄| 91综合网站| 久久精品小视频| 9九九国产| 日本精品一区二区中文字幕| 欧美极度丰满熟妇hd| 免费精品国偷自产在线在线 | 国产亚洲色婷婷99精品91| 天堂精品小草| 97综合久第一页| 国产精品午夜成人福利| 大香蕉伊人网| 操人妻逼91| 熟妇综合一区二区三区| 97超碰天天爱天天爱| 日韩精品资源专区二区| 伊人久久亚洲中文字幕| 精品无码一区二区三区色欲| 国产99 中文字幕日韩小视频| 欧美综合777| 欧美特大黄一级片片免费| 久久伦理视频久久大香蕉视频| 91人妻精华帖| 男人天堂网手机版婷婷| 亚洲少妇中文字幕网址| 日韩本不卡视频在线观看| 在线99热| 久久国产乱子伦精品免费女,网站| 亚州色图第三区| 欧美成人免费在线观看| 久久免费看高潮毛片韩国| 欧美精品日韩久久久九| 男女猛烈无遮掩视频免费软件| 操一操摸一摸| 91人人| 亚洲天堂电影精品一区| 污色区网站| 国产精品久久久久久久久久久久久久久久久久| 中文字幕一区电影在线观看| 自拍第一页| 大香蕉色十月| 日韩乱伦AⅤ| 97av,com| 99中出在线| 国产黄片在线免费观看| chaopen97久久| www鬼畜国产男人的天堂| 日小BB小视频| 亚洲国产97在线精品一区| 久久精品亚洲婷婷| 久久久久久99AV无码免费网站| 在线黄色污污网站| 色婷视频| 在线不欧美| 加勒比伊人影院| 久久一区二区蜜桃| 无码高清少妇久久| 国产四虎在线| 91综合站| 狼人久草| 日本天堂网| WWW啪啪的com| 亚洲精品第一| 亚洲国产欧美日韩人妻日中文| 67914在线兔费成人视频| 天天干天天燥| 97欧美色资源| 后入式999| 欧美中文字幕日韩在线| 国产四虎在线| 校园春色 男人天堂| 十八禁电影伊人网| 一区二区三区 日韩欧美| 免费看国产曰批40分钟怎么下载| 麻豆人妻偷人精品无码视频| 综合色图,成人综合网| 麻花传媒免费网站在线观看| 成年无码动漫av片无尽在线| 伦激情人妻另类人妻| 后入人妻无码| 一本久久精品中文字| 欧美刺激色黄片免费看| 久久青青草原免费视频| 爱逼综合| 另类小说欧美激情校园春色| 裸体美女久久久| 中文字幕亚洲欧美在线不卡| www.丁香五月| 人人摸人人添人人操 | 国产在线不卡导航| 超碰成人最新最好看| 大奶的诱惑| 一摸二插三插| 丝袜狂射91| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 一区二区三区美女超清| 97硬碰| 91n处女在线观看| 日日AV加勒比| 亚洲 欧美 小说| 精品免费一区二区三区在线亚洲人成| 97色色网| 99免费在线视频| 亚洲砖码砖专无区2023| 亚洲人妻中文高清| 欧美日日操| 国产日逼视频| 岛国毛片在线观看免费| 在线综合 亚洲 欧美中文字幕| 凹凸精品熟女在线观看| 日韩猛交| 亚洲 在线| 91色欧美| 好爽视频在线观看视频 | 爱欲AV| AV丝袜少妇| 青青草亚洲一区| 男人的天堂不卡一区二区| 免费视频a级毛片免费视频| www黄片免费看com| 国产精品三级视频网站| 91干熟女| 水澄无码AV| 久久久久久亚洲精品不卡人乳| 日韩人妻少妇 一区二区三区| 免费精品福利在线观看| 任你草| 性爱乱伦视频免费| 久久久月天| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 97在线视频观看免费| 一区二区视频你懂的| 激情四射熟女丝袜| 久九九九九九九九热| 欧美色老汉| 久久久久97| 欧美极品美女aaaaaa级黄片| 9999久久久久| 久久狠狠色噜噜狠狠狠狠97| 日本中文字幕熟妇| 亚洲熟妇乱女区二区三区| 亚洲欧美在线观看免费| 欧美少妇色图| 嫩草91| 日本999精品| 无码9区| 久操不卡视频| 成年女人黄网站| 黄色免费网| 美女91| 91综合国产精品| 激情露脸爱| 精品色色| 91AV入口| 一类av片在线看| 熟妇熟女视频一区二区三区| 97这里都是精品| 久久熟女嫩草成人片免费| 久久久久99999| 91社操逼| 亚洲五月丁香花狠狠干一区二区三区 | a人欧美综合天堂麻豆| 99免费在线视频| 97在线精品| 牛牛aV| 亚洲天堂精品日韩电影| 男女无套 免费网站| 萌白酱自拍视频| 后X久久| 欧美高潮| 五月婷婷丁香六月丁香| 五月丁香激情综合网| julia中文字幕在线观看| 中国少妇啪啪视频| 国产浮力影院第1页| 中文字幕日韩国产传媒欧美精品| 久久↗↗| 日韩免费av片高清无码| 丁香五月影院| 中国女人内射6XXXXX| 久久精品一区二区三区四区五区| 亚洲影视高清第一页| 蜜桃视频精品一区二区三区| 99操碰| 国产欧美精选自拍一区| 亚洲天天更新| 精品二区三四区五电影 | 加勒比中文av| 蜜桃狠狠色伊人亚洲综合 | 777超碰| 极品一区二区三区免费| 国产农村妇女精品1区二区| 日本在线一二 | 国产亚洲欧洲在线观看| 久久久影院| 91精品久久综合熟女| 伊人久久大香线蕉无码| 激情小说图片亚洲首页| 亚欧成人一级片在线播放| 91精品少妇搡搡搡| 精品一二三区四视频| 伊人影院在线理论播放| 98色网| 亚洲欧美成人在线| 爱媛媛久久国产福利| 九色精品视频导航1| 国产丝袜欧美在线视频| 美女黄网| 中文字幕三四区| 97国产|免费| 色五月69夫妻| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 蜜臀th| 欧美97爱| 18禁网站在线播放| 亚洲天堂人妻一区二区| 黄呦呦在线| 蜜桃臀AV在线| 男人的天堂 在线一区| av麻豆啪啪| 7777奇米影视久久| 亚州色图欧美| 国产综合网站在线播放 | 家庭乱伦性爱av| 亚洲av热热色| 精品成人动漫一区二区| 竹菊一区二区三区AV线| 色视频蜜乳| 人人扣人人操| 东北女人操比视频| 美女网站91| 午夜黄色免费在线观看| 操人妻丝袜高跟| 加勒比伊人综合| 人妻天天爽天天爽三区| 午夜久久无码1000合集| 绯色AV粉色AV蜜臀AV| 人妻丰满熟妇av无码区蜜桃| 人人操人人操人人人操| 大香蕉手机视频| 极品色电影院| 久久原创中文| 国产AV超爽| 亚洲中文字幕熟女少妇一区二区| 亚洲熟女乱色| 女同女同恋久久级三级| 天天热精品| www.超碰| 免费av在线播放二区| 成人欧美日超碰| 99热综合| 国产亚洲色停停久久99精品91| 伊人精品视频| 精品免费囯产一区二区三区| 操美女高潮抽搐白浆| 91网站视频在线观看| 日韩欧无码一区二区三区免费不卡 | 九九九九九九九九九五码| 日韩中文字幕视频在线观看| 精产国品一区二三产品| 另类小说欧美激情校园春色| 亚洲日本男人天堂网| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 自拍偷拍 日韩无码| 亚洲图片欧美在线视频| 日本有码影片下载 | 亚洲在线网站| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 国产99999久久精品| 91久久久久久久| 18禁无码永久免费无限制| 少好三P| 北京专精特新企业招聘信息| 乱论91| 成人午夜高潮av猛片| 久久成人午夜狠狠| 久艹伊人精品综合在线| 欧美五十路熟| 九九热九九| 精品一久久久| 日韩丝袜人妻AV| 一区二区三区黄片免费观看| 97av在线观看| 国产中午字一暮区| 国产污视频麻豆传媒一区二区| 97人人射| 激情综合网五月婷婷五月天| 夜夜草天天| 青青操在线视频| 日韩精品大香蕉伊人在线| 亚洲天堂性爱| 99精品久久久久久久婷婷蜜桃| 人妻二区| 久久久亚洲| 国产97在线播放| 久久一二三四五六七八九区区区| 亚洲av影音先锋| 精品丝袜无码一区二区三APP| 中文字幕视频在线观看| 亚欧操逼片在线观看 | 激情网色| 超碰色男人操熟女| 欧美Ⅴ性爱| www.av家庭乱伦| 欧美 亚洲精品首页| 99re在线视频国产| 久久婷婷欧美| 双插在线| 亚洲色图欧美色图制服丝袜| 91天天日| 欧美久久九九| 在线观看中文av字幕| 99re热有精品视频国产| 蜜乳成人AV| 久久久久九九九| 91天堂| 亚洲色阁| 校园春色五月天| 中文字幕一区二区三区四区在线视频| 亚洲欧美激情在线视频| 日日日日做夜夜夜夜做无码97| 精品久久視頻在线| 99久久久久| 五月大香蕉| 91久热| 久欲AV| 男女激烈网站最新| 嗯嗯啊在线视频| 欧美综合色图网| 亚洲丝袜诱惑| 26uuu国产免费观看| 91麻豆天美国产欧美日| 欧美日韩人妻精品一区二区三区| 欧美日本一区二区a人| 亚洲情色一区二区三区| 伊人五月天婷婷| 久久综合精品一区二区三区| 无码人妻1727| 久久久久久久一级黄色打同平台| 色色97爱| 欧美日韩国产在线| 91情色在线| 久热这里| 久久9精品网站| 黄色AAAAA欧美| 精品人妻一二三四区视频| 亚洲天堂一区二区久久| 日韩人妻精品中文字幕| 综合国产影视三级| 美女AV一区二区| 国产极品粉嫩馒头一线天av| 三级网站超变态精品| 国产精品96久久久久久| 超碰调教97| 欧美高清18A片| 亚洲人在线| 日韩簧片免费看| 91美女在线视频| 亚洲AV噜噜狠狠网址蜜桃动漫| 久久久久国产精品喷潮免费观看臀 | 人人性爱视频免费| 久久成人午夜精品影院 | 久久欧洲| 综合色图,成人综合网| 色婷婷导航| 日韩强奸av| 人人爽夜夜玩视频| 97综合久第一页| 九九九只有精品| 玖玖草久草99蜜月一区二区三区| 九九九九免费高| 曰本熟女视频| 精彩国产视频播放1区2区| 性饥渴少妇av无码毛片| 欧洲亚洲少妇| 日韩精品免费高清视频在线| 九九精品热| 97色色色综合网站| 亚洲素人综合| 国产成人无码a| 自慰白浆在线观看| 欧美一区二区传媒| 大香蕉青青9| 亚洲日韩国产精品| 熟女突然公开看18禁影片| 99热色精品| 欧美亚洲国产91在线| 中文字幕日韩人妻视频一区二区三区| 亚洲操逼网| 国产后入精品| 性欧美第一页| 欧美日产国产在线成人第一区| 色啪网| 91女优在线观看| 精品国产一区探花在线观看| 亚洲国产一区二区三区四区国产| 67194国产| 男人把坤坤插入女人的下体| 成人小说另类在线| 99热91| 欧美成人精品一区二区男人蜜臀 | 五月丁香激情综合网| 欧美72网页| 欧美日韩成人在线| 欧美黄色大片在线观看| 精品一区二区人妖| 日韩偷拍色图| av情色影音| 国产AV天美传媒一区二区三区 | 亚洲av综合色| 毛片视频白嫩| 久久中文字幕在线观看| 最新av网站在线观看| 久久精品小视频| 嗯嗯啊啊日韩精品| 日韩亚洲中文字幕在线| 色诱中文字幕| 亚欧无码线免费观看视频| 91原创在线观看| 久久久久女教师免费一区 | 欧美色图亚洲色| 国产最火爆久久国产网站网站| 91人妻中文| 夜夜嗨一区二区| 激情综合五月婷婷| 欧美暴力猛交| 久久亚州精品成人Av无| 91网18| 青娱乐福利99| 成人女人国产| 成人a级高清视频在线观看| 日韩精品人妻中文字幕有码午| 无码不卡亚洲成?人片| 志村玲子视频一区二区| 青娱乐黄色录像| 天天欧美色| 91丨人妻丨国产丨丝袜| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 377p欧洲日本亚洲大胆| 99视频只有精品| 日本高清视频在线观看黄已三辽| 日韩无码专区| 天天综合网AV91| 脫衣舞一区二区三区| 欧美日本视频一区| 黄片不用下载在线观看| 青青操在线视频| 国产蜜臀精品一区免费尤物| 夜夜嗨视频| 69人妻精品丰满熟女区| 亚洲精品国产无码高清| 欧洲精品在线播放| 黄片无码在线制服| 日本成a人v网站在线观看| 色色婷婷五月天| 在线观看午夜婷婷久久久久清性观看| 性生活无遮挡纯毛片在线看| 亚洲免费成人在线高清无码视频| 亚州 综合 色图| 免费看日产一区二区三区| 东京热AV男人的天堂| 蜜桃色色网站视频三区| 日韩在线欧美精品一区二区| 青青青国产| gogogo免费高清看中国国语| AV天堂电影网| 国产操操日韩三级黄| 色九色久| 鲁鲁色综合网| 人妻中文字幕精品无码| 色偷偷综合91久久噜噜| 丁香六月婷婷综合| 国产最火爆久久国产网站网站 | 91色情黑丝搞鸡在线观看一区二区三区三州| 色臀AV| 国产又大又粗又长视频在线| 中文字幕av乱伦| 色九九九九九九| 色婷婷成人综合| 日本精品一区二区中文字幕| 高清无码人妻久久久一区二区三区aⅴ| 97超碰天天爱天天爱| A片 AV一级在线播放观看免费 | 麻豆天美国美国产AV| 性饥渴少妇av无码毛片| 国产67194| 91美女视频在线免费观看| 黄片免费视频2019| 亚洲大色堂| 欧美日韩操逼动图| 视频在线中文字幕| 国产黄色av大片网站| 全国男人天堂网| 天天天天操| 91视频综合网| 好舒服视频| 农村少妇久久久久久久| 欧洲综合视频| 色狠狠 - 百度| 日本高清一本二本免费不卡| 久久婷婷热| 国产精品九九九| 欧美狠狠弄| 亚洲啪啪视频一区二区| 天天综合网在线91| 97视频网站在线观看| 自拍六区| 精品人妻一区二区三区-国产| 国产欧美日韩一区二区三区| 中文字幕熟女人妻丝袜丝| 亚洲高潮少妇| 好舒服视频| www.久久| 久久久久国产精品喷潮免费观看臀| 操逼无码操逼| 91精品老女人| 曰韩少妇无码| 神马午夜久久久| 探花精品视频| 一区二区三区四区免费视频| a片偷拍视频| 久久春色| 91色婷婷综合久久中文字幕二区| 国产亚洲禁久一区二区| 91亚洲色图| 日本黄色裸日本黄色裸体| 少妇人妻在线| 熟女网站最新| 欧美啪啪女女| 亚洲偷拍自拍在线视频| 成人三一级一片aaa| 四虎午夜影院| 波多野结衣AV无码一区| 在线综合网| 欧综合网| 亚洲一卡2卡3卡4卡乱码网站| 大香蕉www.超碰| 最新无码国产| 97亚洲综合影院| 欧美综合另类| 亚洲狠| 99999亚洲另类| 久久9久久| 日韩精品人妻中文字幕不卡乱码| 中出20p| 941超碰| 久久久精品视频欧州站| 超碰偷拍| 久久久一二三四区| 一区二区三区在线日韩影院观看| 人妻大香蕉| 久久老熟女| 99热婷婷一区二区三| 9999久久久| 欧洲黄色网| 999久久久免费精品国产牛牛| 婷婷色色五月天福利| 另类TS人妖一区二区三区| 性爱综合一区二区| 中文字幕美女91| 18禁网站在线播放| 青娱乐国产精品| 精品一区二区亚洲国产| 国产91久久九九免费精品无码| 亚洲 欧美日韩 另类| 依人大香蕉| 人妻天天爽夜夜爽精品2| 青青草吊丝| 亚洲国产青青| 久草看看看| 国产亚洲日本| 国产熟女一区二区| 小说区 图片区色 综合区| 大JI巴好深好爽又大又粗视频| 亚洲欧美综合| ..日韩av毛片精品久久久| 欧美1区二区三区公司| 美女自卫慰黄网站免费| 99热精品在线| 精品国产一区二区三区av在线资源| 亚洲有薄码区日本系列中文字幕| 欧美亚男人的天堂| 91美女視頻| 美女91在线|