日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Qt+FFmpeg仿VLC接收RTSP流并播放

發(fā)布時間:2023/12/24 windows 41 coder
生活随笔 收集整理的這篇文章主要介紹了 Qt+FFmpeg仿VLC接收RTSP流并播放 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)鍵詞:Qt FFmpeg C++ RTSP RTP VLC 內(nèi)存泄漏 摘要認證 花屏 源碼 UDP

本系列原文地址。

下載直接可運行的源碼,在原文頂部。

效果

產(chǎn)生RTSP流

比播放文件復(fù)雜一點是,為了接收RTSP流,我們需要產(chǎn)生RTSP流。簡單搭建一個RTSP推流環(huán)境:

EasyDarwin開啟RTSP服務(wù)作為RTSP服務(wù)器。

ffmpeg命令行作為客戶端,向EasyDarwin循環(huán)推送一個視頻文件。

./ffmpeg.exe -re -stream_loop -1 -i test.mp4 -c copy -f rtsp rtsp://127.0.0.1/stream

這樣就可以從EasyDarwin接收RTSP流了。

我們用vlc接收RTSP流看看。

成功接收。

FFmepg接收RTSP流代碼

FFmpeg接收RTSP流并播放的流程和播放mp4文件的流程差不多,只不過播放mp4文件時,文件作為播放源,而接收RTSP流時,RTSP流作為了播放源:

我們依舊看下流程中的關(guān)鍵代碼:

if (avformat_open_input(&fileFmtCtx, url.toStdString().c_str(), nullptr, nullptr) != 0) {
    qDebug() << "avformat_open_input() failed";
    return;
}

用于打開一個RTSP地址,跟打開一個文件相比,不僅要查找流信息,還需要和RTSP服務(wù)器建立連接,讓RTSP服務(wù)器開始推流。

接收上述RTSP流后,我們打印AVFormatContext的相關(guān)屬性:

qDebug() << "stream name: " << streamFmtCtx->url;
    qDebug() << "stream iformat: " << streamFmtCtx->iformat->name;
    qDebug() << "stream duration: " << streamFmtCtx->duration << " microseconds";
    qDebug() << "stream bit_rate: " << streamFmtCtx->bit_rate;
/* 
stream name:  rtsp://127.0.0.1/stream
stream iformat:  rtsp
stream duration:  -9223372036854775808  microseconds
stream bit_rate:  0
*/

這次由于是RTSP流,并不能獲取準(zhǔn)確的duration。繼續(xù)打印流相關(guān)的信息:

qDebug() << "nb_streams:";
    for (unsigned int i = 0; i < streamFmtCtx->nb_streams; i++) {
        AVStream *stream = streamFmtCtx->streams[i];
        qDebug() << "Stream " << i + 1 << ":";
        qDebug() << "  Codec: " << avcodec_get_name(stream->codecpar->codec_id);
        qDebug() << "  Duration: " << stream->duration << " microseconds";
    }
/*
nb_streams:
Stream  1 :
  Codec:  h264
  Duration:  -9223372036854775808  microseconds
Stream  2 :
  Codec:  aac
  Duration:  -9223372036854775808  microseconds
*/

可以看到和上次直接讀取文件的結(jié)果一樣,包括1個H264視頻流和1個AAC音頻流。

swsCtx = sws_getContext(decoderCtx->width, decoderCtx->height, decoderCtx->pix_fmt,
                                     decoderCtx->width, decoderCtx->height, FMT_PIC_SHOW,
                                     SWS_BICUBIC, NULL, NULL, NULL);
qDebug() << "decoderCtx->pix_fmt:" << av_get_pix_fmt_name(decoderCtx->pix_fmt);
//decoderCtx->pix_fmt: yuv420p

sws_getContext()用于將RTSP流格式轉(zhuǎn)換為將要顯示的格式,這里是yuv420p=>AV_PIX_FMT_RGB24

int numBytes = av_image_get_buffer_size(FMT_PIC_SHOW, decoderCtx->width, decoderCtx->height, 1);
showBuffer = (unsigned char*)av_malloc(static_cast<unsigned long long>(numBytes) * sizeof(unsigned char));
if(av_image_fill_arrays(showFrame->data, showFrame->linesize,
                        showBuffer, FMT_PIC_SHOW, decoderCtx->width, decoderCtx->height, 1) < 0)
{
    qDebug() << "av_image_fill_arrays() failed";
    return;
}

av_image_get_buffer_size計算了計算圖像數(shù)據(jù)的緩沖區(qū)大小。av_malloc分配了1個內(nèi)存塊給showBufferav_image_fill_arrays用圖像參數(shù)和showBuffer初始化AVFramedatalinesize成員,并且讓AVFrameshowBuffer關(guān)聯(lián)。

while(av_read_frame(streamFmtCtx, packet) >= 0){
    if(packet->stream_index == nVideoIndex){
        if(avcodec_send_packet(decoderCtx, packet)>=0){
            while((ret = avcodec_receive_frame(decoderCtx, decodedFrame)) >= 0){
                //...
            }
        }
    }
}

和播放mp4文件類似的解碼步驟,從RTSP流中讀取一個數(shù)據(jù)包AVPacket,將AVPacket送入解碼器進行解碼,嘗試從解碼器中接收已解碼的視頻幀,并將接收到的幀數(shù)據(jù)存儲在decodedFrame中。

經(jīng)過上述基本步驟,我們的代碼已經(jīng)可以和VLC一樣,從RTSP服務(wù)器接收RTSP流并播放了。

RTSP協(xié)議簡述及驗證

FFmpeg內(nèi)部將RTSP連接建立處理得很好,但我們有必要進一步學(xué)習(xí)一下RTSP協(xié)議。RTSP全稱Real Time Sreaming Protocol,是TCP/IP協(xié)議體系中的一個應(yīng)用層協(xié)議。數(shù)據(jù)傳輸由RTP/RTCP完成,底層通過TCP/UDP實現(xiàn)。

一個標(biāo)準(zhǔn)的RTSP的收流協(xié)議層的交互流程如下:

話不多說,我們直接在上面的推流環(huán)境下(由于EasyDarwin似乎加密了某些信息,我們選擇了一個其他的RTSP服務(wù)器,效果是一樣的),用VLC收流,并用wireshark抓包看看協(xié)議流程是不是這樣的:

直接看看每條信息都是什么:

client => server

Real Time Streaming Protocol
    Request: OPTIONS rtsp://127.0.0.1:554/stream RTSP/1.0\r\n
        Method: OPTIONS
        URL: rtsp://127.0.0.1:554/stream
    CSeq: 2\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    \r\n

client發(fā)送OPTIONSrtsp://127.0.0.1:554/stream詢問server支持哪些RTSP方法。

server=> client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
        Status: 200
    CSeq: 2\r\n
    Session: 4J_bOCNSg
    Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD\r\n
    \r\n

server回復(fù)支持DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD

client => server

Real Time Streaming Protocol
    Request: DESCRIBE rtsp://127.0.0.1:554/stream RTSP/1.0\r\n
        Method: DESCRIBE
        URL: rtsp://127.0.0.1:554/stream
    CSeq: 3\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Accept: application/sdp\r\n
    \r\n

client請求媒體描述文件,格式為application/sdp

一般server會進行用戶認證,如果未攜帶Authorization鑒權(quán)信息,或者認證失敗,server會返回錯誤號為401的響應(yīng),client接收到401響應(yīng)時,需要根據(jù)已知的用戶鑒權(quán)信息,生成Authorization,再次發(fā)送DESCRIBE,如果認證成功,服務(wù)器返回攜帶有SDP的響應(yīng)信息。

是否進行認證和RTSP服務(wù)器有關(guān),這里我們沒有為EasyDarwin設(shè)置認證。

server=> client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
    CSeq: 3\r\n
    Session: _ZLZ7_NSR
    Content-type: application/sdp
    Content-length: 511
    \r\n
    Session Description Protocol
        Session Description Protocol Version (v): 0
        Owner/Creator, Session Id (o): - 0 0 IN IP4 127.0.0.1
        Session Name (s): No Name
        Connection Information (c): IN IP4 127.0.0.1
        Time Description, active time (t): 0 0
        Session Attribute (a): tool:libavformat 58.76.100
        Media Description, name and address (m): video 0 RTP/AVP 96
        Bandwidth Information (b): AS:1894
        Media Attribute (a): rtpmap:96 H264/90000
        Media Attribute (a): fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAKqwspQFAFumoCAgKAAADAAIAAAMAYcTAAc/YABW+f4xwEA==,aOkJNSU=; profile-level-id=64002A
        Media Attribute (a): control:streamid=0
        Media Description, name and address (m): audio 0 RTP/AVP 97
        Bandwidth Information (b): AS:317
        Media Attribute (a): rtpmap:97 MPEG4-GENERIC/48000/2
        Media Attribute (a): fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1190
        Media Attribute (a): control:streamid=1

server返回SDP信息,告訴client當(dāng)前有哪些音視頻流和屬性,sdp協(xié)議不做展開。這里我們要關(guān)注的比較重要的信息是:server可以發(fā)送streamid=0H264視頻流和streamid=1AAC音頻流。

client => server

Real Time Streaming Protocol
    Request: SETUP rtsp://127.0.0.1:554/stream/streamid=0 RTSP/1.0\r\n
        Method: SETUP
        URL: rtsp://127.0.0.1:554/stream/streamid=0
    CSeq: 4\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Transport: RTP/AVP;unicast;client_port=52024-52025
    \r\n

client發(fā)送SETUP告訴server需要建立streamid=0即視頻流的連接,這里RTP/AVP表示通過UDP傳輸,unicast表示單播,client_port=52024-52025需要單獨解釋一下,前面說到RTSP協(xié)議數(shù)據(jù)傳輸通過RTP+RTCP完成。RTPRTCP都是建立在UDP之上的,RTP默認使用1個偶數(shù)端口號,而RTCP則默認使用RTP端口的下1個奇數(shù)端口號,就是這里的52024和52025。

server => client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
        Status: 200
    CSeq: 4\r\n
    Session: 4J_bOCNSg
    Transport: RTP/AVP;unicast;client_port=52024-52025
    \r\n


server向client返回確認。

client => server

Real Time Streaming Protocol
    Request: SETUP rtsp://127.0.0.1:554/stream/streamid=1 RTSP/1.0\r\n
        Method: SETUP
        URL: rtsp://127.0.0.1:554/stream/streamid=1
    CSeq: 5\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Transport: RTP/AVP;unicast;client_port=52028-52029
    Session: 4J_bOCNSg
    \r\n

client告訴server需要建立streamid=1的音頻流的連接,RTPRTCP的端口分別在52028和52029。

server => client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
        Status: 200
    Transport: RTP/AVP;unicast;client_port=52028-52029
    CSeq: 5\r\n
    Session: 4J_bOCNSg
    \r\n

server向client返回確認。

client=>server

Real Time Streaming Protocol
    Request: PLAY rtsp://127.0.0.1:554/stream RTSP/1.0\r\n
        Method: PLAY
        URL: rtsp://127.0.0.1:554/stream
    CSeq: 6\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Session: 4J_bOCNSg
    Range: npt=0.000-\r\n
    \r\n

client發(fā)送PLAY告訴server開始傳輸,Range代表媒體播放時間,server會根據(jù)Range的值播放指定段的數(shù)據(jù)流,對于實時流,一般只會指定起點,即Range: npt=0.000-

server=>client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
        Status: 200
    CSeq: 6\r\n
    Session: 4J_bOCNSg
    Range: npt=0.000-\r\n
    \r\n

server返回確認,使用同一Session

client=>server

Real Time Streaming Protocol
    Request: TEARDOWN rtsp://127.0.0.1:554/stream RTSP/1.0\r\n
        Method: TEARDOWN
        URL: rtsp://127.0.0.1:554/stream
    CSeq: 7\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Session: 4J_bOCNSg
    \r\n

client發(fā)送TEARDOWN發(fā)起停止流傳輸請求。

server=>client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
        Status: 200
    CSeq: 7\r\n
    Session: 4J_bOCNSg
    \r\n

server返回確認,使用同一Session,停止流傳輸。

搭建摘要認證環(huán)境

上面說到了server可能會進行用戶認證,那我們現(xiàn)在得創(chuàng)造一個需要認證的環(huán)境,直接看看EasyDarwin能不能直接選擇認證,打開easydarwin.ini

[http]
port=10008
default_username=admin
default_password=admin
#...
;是否使能向服務(wù)器推流或者從服務(wù)器播放時驗證用戶名密碼. [注意] 因為服務(wù)器端并不保存明文密碼,所以推送或者播放時,客戶端應(yīng)該輸入密碼的md5后的值。
;password should be the hex of md5(original password)
authorization_enable=0
#...

可以看到authorization_enable變量是控制認證的,把它的值改為1,重新啟動服務(wù)。這時候發(fā)現(xiàn)原來的ffmpeg命令推流不成功了。

那就是說,向EasyDarwin推流的時候,也需要進行認證。從注釋上來看,需要加入用戶名和密碼的md5值,我們用正確的參數(shù)再推流(下面mad5ofpassword換成你密碼的md5):

./ffmpeg.exe -re -stream_loop -1 -i test.mp4 -c copy -f rtsp rtsp://admin:mad5ofpassword@127.0.0.1/stream

成功了:

這時候用vlc接收試試,果然要進行認證,要求輸入用戶名和密碼:

注意這里密碼也要輸入md5后的值。輸入正確的密碼后,vlc可以接收RTSP流了:

同樣地,用wireshark抓包看看帶有認證的流程是什么樣的:

client=>server

Real Time Streaming Protocol
    Request: DESCRIBE rtsp://127.0.0.1:554/stream RTSP/1.0\r\n
        Method: DESCRIBE
        URL: rtsp://127.0.0.1:554/stream
    CSeq: 6\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Accept: application/sdp\r\n
    \r\n

首先client同樣發(fā)起DESCRIBE

server=>client

Real Time Streaming Protocol
    Response: RTSP/1.0 401 Unauthorized\r\n
        Status: 401
    CSeq: 6\r\n
    Session: ayQBojNIg
    WWW-Authenticate: Digest realm="EasyDarwin", nonce="539c6afee35b8edd354e983a6af947bf", algorithm="MD5"\r\n
    \r\n

server返回401,WWW-Authenticate: Digest表示需要摘要認證,realmnonce用于生成responsealgorithm="MD5"表示需要md5算法生成response

client=>server

Real Time Streaming Protocol
    Request: DESCRIBE rtsp://127.0.0.1:554/stream RTSP/1.0\r\n
        Method: DESCRIBE
        URL: rtsp://127.0.0.1:554/stream
    CSeq: 7\r\n
    Authorization: Digest username="admin", realm="EasyDarwin", nonce="539c6afee35b8edd354e983a6af947bf", uri="rtsp://127.0.0.1:554/stream", response="d6a48b37f2010b3ddfad1eef18692648"\r\n
    User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)\r\n
    Accept: application/sdp\r\n
    \r\n

client用對應(yīng)算法生成response并返回給server,response的計算方法單獨再講。

server=>client

Real Time Streaming Protocol
    Response: RTSP/1.0 200 OK\r\n
        Status: 200
    Content-length: 511
    CSeq: 7\r\n
    Session: ayQBojNIg
    \r\n
    Data (511 bytes)

server驗證response通過,則返回200。

這里其實和上面一樣返回了SDP信息(Data 511 bytes中的信息),但EasyDarwin是做了加密處理還是什么,是無法解析出來的。

之后的流程就和沒有摘要認證的過程是一樣的了。

完善代碼,處理摘要認證

既然可能會存在認證,那我們代碼中得處理server有認證的情況,否則肯定收不到RTSP流。首先我們定位server的返回在哪里被捕捉了,經(jīng)過一番嘗試,發(fā)現(xiàn)在方法avformat_open_input中:

if ((ret = avformat_open_input(&streamFmtCtx, url.toStdString().c_str(), nullptr, nullptr)) != 0) {
    qDebug() << "ret:" << ret;
}
//打印輸出
//ret: -825242872
//ffmpeg日志輸出
//[rtsp @ 000001d2d3940ec0] method DESCRIBE failed: 401 Unauthorized

在需要認證的情況下,avformat_open_input直接返回了一個負數(shù)。再結(jié)合ffmpeg的日志,大致可以斷定這是server返回Unauthorized時的情況。但我們需要更具體的確認,所以查看avformat_open_input的聲明:

//avformat.h
/*
* @return 0 on success, a negative AVERROR on failure.
*/
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options);

返回值是一個int,注釋中寫到如果是失敗,則返回AVERROR,那么接下來,我們可以去ffmpeg的源碼中,找關(guān)于AVERROR的內(nèi)容了。

如果編譯了ffmpeg源碼,直接debug就可以看到最終是如何返回的,但現(xiàn)在我們不想花額外的時間去編譯源碼,所以我們用宇宙第一IDE——Visual Studio,打開ffmpeg的源碼文件夾,直接搜索AVERROR,很方便找到了AVERROR的定義:

//error.h
#define AVERROR(e) (-(e))   ///< Returns a negative error code from a POSIX error code, to return from library functions.

可以看到AVERROR是用來取POSIX中標(biāo)準(zhǔn)錯誤相反數(shù)的宏,繼續(xù)追蹤沒有發(fā)現(xiàn)相關(guān)返回的地方。但我們在頭文件卻看見了Unauthorized的相關(guān)定義:

//error.h
#define AVERROR_HTTP_UNAUTHORIZED  FFERRTAG(0xF8,'4','0','1')
#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))
//common.h
#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))

按照定義,AVERROR_HTTP_UNAUTHORIZED實際上是(0xF8,'4','0','1')組合的移位,按照定義計算后AVERROR_HTTP_UNAUTHORIZED確實等于-825242872。為了驗證,我們把宏定義從ffmpeg源碼中復(fù)制出來,直接在我們項目中打印:

//mainwindow.h
#define AVERROR_HTTP_UNAUTHORIZED  FFERRTAG(0xF8,'4','0','1')
#define MKTAG(a, b, c, d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))
//mainwindow.cpp
qDebug() << "AVERROR_HTTP_UNAUTHORIZED:" <<FFERRTAG(0xF8,'4','0','1');

//輸出
//AVERROR_HTTP_UNAUTHORIZED: -825242872

輸出和前面的日志輸出還有我們計算出來的結(jié)果都是一樣的,到這里我們確定報出了AVERROR_HTTP_UNAUTHORIZED錯誤。順手把error.h中其他宏定義打印出來,ffmpeg常用錯誤碼錯誤碼表如下:

錯誤碼宏定義 錯誤碼 錯誤說明
AVERROR_BSF_NOT_FOUND -1179861752 Bitstream filter not found
AVERROR_BUG -558323010 Internal bug, also see AVERROR_BUG2
AVERROR_BUFFER_TOO_SMALL -1397118274 Buffer too small
AVERROR_DECODER_NOT_FOUND -1128613112 Decoder not found
AVERROR_DEMUXER_NOT_FOUND -1296385272 Demuxer not found
AVERROR_ENCODER_NOT_FOUND -1129203192 Encoder not found
AVERROR_EOF -541478725 End of file
AVERROR_EXIT -1414092869 Immediate exit was requested; the called function should not be restarted
AVERROR_EXTERNAL -542398533 Generic error in an external library
AVERROR_FILTER_NOT_FOUND -1279870712 Filter not found
AVERROR_INVALIDDATA -1094995529 Invalid data found when processing input
AVERROR_MUXER_NOT_FOUND -1481985528 Muxer not found
AVERROR_OPTION_NOT_FOUND -1414549496 Option not found
AVERROR_PATCHWELCOME -1163346256 Not yet implemented in FFmpeg, patches welcome
AVERROR_PROTOCOL_NOT_FOUND -1330794744 Protocol not found
AVERROR_STREAM_NOT_FOUND -1381258232 Stream not found
AVERROR_BUG2 -541545794
AVERROR_UNKNOWN -1313558101
AVERROR_EXPERIMENTAL -733130664
AVERROR_INPUT_CHANGED -1668179713
AVERROR_OUTPUT_CHANGED -1668179714
AVERROR_HTTP_BAD_REQUEST -808465656
AVERROR_HTTP_UNAUTHORIZED -825242872
AVERROR_HTTP_FORBIDDEN -858797304
AVERROR_HTTP_NOT_FOUND -875574520
AVERROR_HTTP_OTHER_4XX -1482175736
AVERROR_HTTP_SERVER_ERROR -1482175992

于是可以在代碼中增加Unauthorized情況的處理,如果Unauthorized則讓用戶輸入用戶名和密碼。

//ffmpegmanager.cpp
if ((ret = avformat_open_input(&streamFmtCtx, url.toStdString().c_str(), nullptr, nullptr)) != 0) {
    if (ret == AVERROR_HTTP_UNAUTHORIZED)
    {
        //...
        return;
    }else{
        //...
        return;
    }
}

vlc中,如果輸入的用戶名和密碼無法通過驗證,則會重新彈出驗證框(且用戶名不用重新輸入),直至輸入正確或取消輸入(效果看開頭)。所以我們也加入RTSP地址合法性的檢查等操作:

//ffmpegmanager.cpp
int rtspIndex = url.indexOf("rtsp://");
int atIndex = url.lastIndexOf("@");
if(rtspIndex != -1 && atIndex != -1){
    QString couple = url.mid(rtspIndex + 7, atIndex - rtspIndex - 7);
    username = couple;
    if(couple.contains(':')){
        username = couple.mid(0, couple.lastIndexOf(':'));
    }
}

到這里,我們的代碼可以適配需要摘要認證的情況了。

增加錯誤窗口

vlc在無法打開RTSP地址的時候會彈出錯誤窗口。

我們也增加一個錯誤窗口,把所有錯誤都歸為無法打開地址,并打印出來。

解決內(nèi)存泄漏

最然程序可以正常接收RTSP流了,但出現(xiàn)了之前沒出現(xiàn)的情況:內(nèi)存持續(xù)增加。這種情況下一般是發(fā)生了內(nèi)存泄露,之前讀取MP4文件沒有發(fā)現(xiàn),可能是因為文件大小固定,現(xiàn)在持續(xù)收流,現(xiàn)象比較明顯,我們得排查我們的代碼。簡單定位之后,我們發(fā)現(xiàn)是下面的代碼塊發(fā)生泄露:

while(av_read_frame(streamFmtCtx, packet) >= 0){
    if(packet->stream_index == nVideoIndex){
        if(avcodec_send_packet(decoderCtx, packet)>=0){
            while((ret = avcodec_receive_frame(decoderCtx, decodedFrame)) >= 0){
                //...
            }
        }
    }
}

接下來我們逐句排查,首先是av_read_frame,查看它的聲明:

//avformat.h
/**
 *.....
 * On success, the returned packet is reference-counted (pkt->buf is set) and
 * valid indefinitely. The packet must be freed with av_packet_unref() when
 * it is no longer needed. 
 *.....
 */
int av_read_frame(AVFormatContext *s, AVPacket *pkt);

這里面有些有用的信息:pktreference-counted的,如果不av_packet_unref() ,則它將永久有效。繼續(xù)看它的定義,我們的目標(biāo)是找出和pkt相關(guān)的進行reference-counted的語句:

//avformat.cpp
int av_read_frame(AVFormatContext *s, AVPacket *pkt){
    //...
    ret = read_frame_internal(s, pkt);
    ret = avpriv_packet_list_put(&s->internal->packet_buffer,
                                 &s->internal->packet_buffer_end,
                                 pkt, NULL, 0);
    //...
}

最終pkt都要執(zhí)行這兩個函數(shù),avpriv_packet_list_put就是我們要找的地方,繼續(xù)看它的聲明和定義:

//packet_internal.h
/**
 * Append an AVPacket to the list.
 *
 * @param head  List head element
 * @param tail  List tail element
 * @param pkt   The packet being appended. The data described in it will
 *              be made reference counted if it isn't already.
 */
int avpriv_packet_list_put(PacketList **head, PacketList **tail,
                           AVPacket *pkt,
                           int (*copy)(AVPacket *dst, const AVPacket *src),
                           int flags);
//avpacket.c
int avpriv_packet_list_put(PacketList **packet_buffer,
                           PacketList **plast_pktl,
                           AVPacket      *pkt,
                           int (*copy)(AVPacket *dst, const AVPacket *src),
                           int flags)
{
    //...
    if (*packet_buffer)
        (*plast_pktl)->next = pktl;
    else
        *packet_buffer = pktl;
    *plast_pktl = pktl;
    return 0;
}

最后pkt添加到了buffered packet中。其他細節(jié)我們可以不用深究,只需要知道pkt被添加到了一個list中,那么這里的確會產(chǎn)生內(nèi)存泄漏。根據(jù)前面聲明中的提示,我們需要使用av_packet_unref()來釋放pkt的引用,那么直接在讀取和使用完1個AVPacket和結(jié)束時調(diào)用av_packet_unref()

while(av_read_frame(streamFmtCtx, packet) >= 0){
    //...
    av_packet_unref(packet);
}
av_packet_unref(packet);

加上后發(fā)現(xiàn),內(nèi)存泄漏的問題被解決了,那就不再繼續(xù)向下排查了。

遺留問題

至此,一個簡單好用的RTSP收流功能就算是完成了,但別高興的太早,事情往往沒有我們想象的那么簡單——經(jīng)過測試,接收高分辨率視頻一段時間后(甚至一開始),就會產(chǎn)生花屏現(xiàn)象:

考慮到篇幅原因,后面單獨篇章再去討論解決這個問題,依舊是需要從源碼切入:)

TO-DO

  • 適配BASE認證

總結(jié)

以上是生活随笔為你收集整理的Qt+FFmpeg仿VLC接收RTSP流并播放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产精品专区一 | 91入口在线观看 | 手机av在线免费观看 | a电影在线观看 | 综合网天天色 | 久草视频视频在线播放 | 免费三级在线 | 久久久久女人精品毛片 | 午夜12点| 天天鲁一鲁摸一摸爽一爽 | 欧美日韩高清一区二区 国产亚洲免费看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 成人看片 | 日韩在线视频播放 | 国内精品99| 一级黄色大片在线观看 | 色综合www | 天天操天天干天天爽 | 亚洲精选视频在线 | 免费视频区 | 亚洲精品看片 | 国产精品久久久区三区天天噜 | 久久狠狠干| 一区二区三区免费在线播放 | 久久再线视频 | 免费av网址大全 | 黄色成人av | 少妇bbb搡bbbb搡bbbb′ | 免费av观看 | 草草草影院| 最新一区二区三区 | 欧美日本国产在线观看 | 349k.cc看片app | 国产 欧美 日本 | 欧美在线视频日韩 | 久久久国产毛片 | 免费黄色一区 | 日韩视频在线观看视频 | 国产精品久久久久久久午夜片 | 九九免费观看视频 | 最新中文字幕在线观看视频 | 九九热精品视频在线播放 | 国产乱码精品一区二区三区介绍 | 久久久性 | 国产亚洲观看 | 91久久国产精品 | 国产一级电影 | 亚洲午夜电影网 | 美女网站在线观看 | 欧美在线1| 国产精品精品国产 | 激情久久一区二区三区 | 国产自产在线视频 | 在线免费看片 | 麻豆国产网站 | 在线视频福利 | 欧美少妇18p | 日韩一区二区三区不卡 | 日韩有码中文字幕在线 | 色视频在线免费 | 久久精品亚洲国产 | 国产无套视频 | 美女久久久久 | 成人在线视频免费 | 麻豆果冻剧传媒在线播放 | 九九九视频在线 | 日韩字幕 | 久久综合偷偷噜噜噜色 | 天天色天天操天天爽 | 亚洲精品乱码久久久久久蜜桃欧美 | 激情综合色图 | 在线中文字母电影观看 | 激情五月婷婷综合网 | 亚洲区另类春色综合小说校园片 | 麻豆视频观看 | 欧美一级视频在线观看 | 婷婷5月色 | 色在线高清| 久久久久电影网站 | 夜色资源网 | 99精品视频在线观看播放 | 日日摸日日爽 | 国内99视频| 涩涩爱夜夜爱 | 欧美福利视频一区 | 精品在线视频观看 | 久草在线网址 | 狠狠色丁香婷婷综合欧美 | 日韩色视频在线观看 | 国产盗摄精品一区二区 | 黄色大片日本 | 国内小视频在线观看 | 欧美狠狠操 | 综合久久久 | 日韩理论片在线观看 | www.日日日.com| 国产精品久久久久久久久婷婷 | 欧美日韩免费一区二区 | 国产福利av| 九九热有精品 | 97超碰在线播放 | 欧美日韩久久一区 | 国产一区免费在线 | 国内精品久久久久久久久久清纯 | 国产亚洲精品中文字幕 | 人人插人人射 | 天天干,天天操 | 999成人国产 | 98超碰在线 | 2019中文字幕网站 | 欧美日韩免费在线观看视频 | 日韩av免费一区二区 | 超碰在线最新地址 | 高清不卡一区二区三区 | 国产精品久久久久久久久久久杏吧 | 欧美91片 | 在线观看中文字幕网站 | 91禁在线观看 | 91av免费看 | 免费看成人av | 久久久久久久久久影视 | 波多野结衣视频一区 | 亚洲一区视频免费观看 | 绯色av一区 | 99热最新精品 | 欧美一区,二区 | 伊人成人激情 | 国产精品 久久 | 久久亚洲热 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 色88久久| 日韩在线观看一区 | 亚洲成熟女人毛片在线 | 国产探花在线看 | 干 操 插 | 日韩成人邪恶影片 | 久久欧美精品 | 中文字幕第一页在线播放 | 福利在线看片 | 97天天综合网| 国产日韩欧美精品在线观看 | 亚洲va在线va天堂 | 亚洲一区二区三区四区精品 | 天堂在线一区二区三区 | 黄色三级在线观看 | 国产高清精| 国产精品去看片 | 亚洲人在线视频 | 日本性生活免费看 | 蜜臀av性久久久久av蜜臀三区 | 国模视频一区二区三区 | 国产日韩欧美在线播放 | sesese图片 | 欧美在线视频一区二区三区 | 国产成人一级电影 | 天天操天天摸天天干 | 久黄色 | 久久综合狠狠狠色97 | 国产专区在线看 | 成人在线视频免费 | 中文字幕在线观看第一区 | 色综合欧洲 | 色婷婷亚洲综合 | 日韩三级久久 | 人人玩人人添人人澡超碰 | 黄色免费电影网站 | 国产在线欧美日韩 | 国产黄色片久久久 | 中文字幕在线国产 | 国产男男gay做爰 | 亚洲国产精品va在线看黑人动漫 | 激情视频免费观看 | 超碰电影在线观看 | 四虎在线免费观看 | 免费观看的黄色片 | 亚洲精品2区 | 天天干天天干天天色 | 日韩乱色精品一区二区 | 有码视频在线观看 | 激情丁香综合 | 国产精品一区免费在线观看 | 国内精品久久久久影院男同志 | 免费网站在线观看人 | 欧美一级片在线免费观看 | 波多野结衣视频一区 | 美女免费黄视频网站 | 在线v片免费观看视频 | 天天操天天添 | 午夜视频一区二区 | 精品久久福利 | 天天综合91| 美国av片在线观看 | 日韩中文字幕a | 菠萝菠萝在线精品视频 | 欧美日韩精品在线免费观看 | 国产高清专区 | 又黄又爽又刺激 | 久草在线官网 | 97av.com| 涩涩网站在线播放 | 日韩在线精品一区 | 91精品老司机久久一区啪 | 激情 婷婷 | 久久久久久久久影院 | 天天综合视频在线观看 | 亚洲精品国产自产拍在线观看 | av+在线播放在线播放 | 天天插天天干天天操 | 青青网视频 | 精品国模一区二区三区 | 粉嫩av一区二区三区四区五区 | 香蕉视频日本 | 久热色超碰 | 91成人精品一区在线播放 | 国产精品 日韩精品 | 黄色网址中文字幕 | 久久免费av电影 | 91精彩视频 | 中文字幕乱码电影 | 久久伊人色综合 | 久久久久一区二区三区 | 成人黄色国产 | 黄色毛片视频免费观看中文 | 韩国视频一区二区三区 | 久久久久久久久久久久久久免费看 | av在线免费观看网站 | 久久久999免费视频 日韩网站在线 | 欧美亚洲免费在线一区 | 欧美日韩午夜爽爽 | 四虎在线影视 | 国产打女人屁股调教97 | 亚洲japanese制服美女 | 中文字幕电影高清在线观看 | 久久久久成人免费 | www.99在线观看| 精品国内 | 国产日本高清 | 色资源中文字幕 | 狠狠五月婷婷 | 美女在线国产 | 久久免费大片 | 日日夜夜91| 91精品老司机久久一区啪 | 99精品偷拍视频一区二区三区 | 成人在线播放网站 | 亚洲激色| 97av超碰 | 91视频高清免费 | 99久久精品无码一区二区毛片 | 99色视频在线 | 91精彩在线视频 | 国内精品久久久久久久久久清纯 | 日韩精品一区二区三区水蜜桃 | 丁香在线视频 | 欧美在线观看视频免费 | 亚洲另类视频在线 | 69欧美视频 | 国产日韩在线一区 | 免费黄色av电影 | 国产成人一区二区三区久久精品 | 欧美 另类 交 | 日韩网站在线看片你懂的 | 在线视频日韩一区 | 一区在线电影 | 久久国产影院 | 天天干夜夜夜操天 | 婷婷五情天综123 | 日韩欧美一区二区三区黑寡妇 | 久久久久久久久久久黄色 | 黄色影院在线免费观看 | 国产又粗又长的视频 | 成人黄色在线电影 | 五月天天天操 | 91精品国产高清自在线观看 | 国产高清在线免费观看 | www.xxxx欧美| 十八岁以下禁止观看的1000个网站 | 国产精品一区二区电影 | 日本成人免费在线观看 | 97香蕉超级碰碰久久免费软件 | 日韩福利在线观看 | 久久久久久久久久久久电影 | 国产精品原创在线 | 中文字幕在线观看资源 | 国产精品永久免费观看 | 亚洲免费一级电影 | 国产精品久久久久永久免费观看 | 人人看黄色| 亚洲资源在线 | 久草国产在线观看 | 中文字幕久久网 | 久久亚洲免费 | av观看免费在线 | 天天色天天射综合网 | 美女视频国产 | 最新av网址在线观看 | 天天操天天舔天天干 | 国产特黄色片 | 日韩免费观看av | 97视频免费观看 | 99九九热只有国产精品 | 国产精品刺激对白麻豆99 | 亚洲国产激情 | 婷婷六月天天 | 日韩丝袜 | 黄色视屏av | 97超碰在线免费观看 | av视屏在线 | 国内精品久久久久久久影视简单 | 久久麻豆精品 | 日本精品视频免费观看 | 97国产一区二区 | 制服丝袜亚洲 | 亚洲伊人天堂 | 伊人中文字幕在线 | 免费在线观看视频a | 91试看 | 国产精品久久久久久久毛片 | 狠狠狠色丁香综合久久天下网 | 欧美日韩高清在线一区 | 欧美激情精品久久 | 麻豆传媒视频观看 | 成人四虎| 亚洲狠狠丁香婷婷综合久久久 | 综合激情网| 日本高清免费中文字幕 | 免费av网站在线看 | 精品一区二区日韩 | 在线免费观看黄色 | 中文字幕中文中文字幕 | 国产黄色精品在线 | 欧美-第1页-屁屁影院 | 最近中文字幕视频网 | 黄色国产区 | 欧美日韩久久久 | 成人久久影院 | www日| 在线观看中文字幕dvd播放 | 日本免费一二三区 | 中文字幕在线免费观看 | 国产成人精品一区二区三区在线观看 | 久久狠狠一本精品综合网 | 激情狠狠干 | 久久精品视频国产 | 丁香电影小说免费视频观看 | 91精品国产自产91精品 | 亚洲人成在 | aⅴ精品av导航 | 日韩精品久久久久 | 久要激情网 | 日韩精品一区二区三区电影 | 国产精品视频永久免费播放 | 中文字幕日韩免费视频 | 国产精品久久电影观看 | 日日日网| 成人资源站 | 西西444www大胆高清图片 | 久久久久久久99 | 亚洲综合涩 | 亚洲国产成人精品在线观看 | 亚洲 欧美 国产 va在线影院 | 91在线日韩| 探花系列在线 | 爱色av.com| 黄色性av | 久久美女高清视频 | 日日干天天插 | 最新av免费在线观看 | 中文资源在线播放 | 天天av在线播放 | 夜夜爱av | 狠狠久久伊人 | 中文字幕亚洲精品在线观看 | 在线国产能看的 | 久久视频国产精品免费视频在线 | 亚洲成av人片在线观看香蕉 | 伊人影院99 | 69av视频在线 | 免费在线观看av网址 | 九九交易行官网 | 日韩av免费大片 | 91高清免费 | 91精品91 | 亚洲在线网址 | 黄色a级片在线观看 | 成人欧美一区二区三区在线观看 | 国产h片在线观看 | 精品久久国产精品 | 精品久久美女 | 97电影网站 | 日黄网站 | 国产精品第三页 | 五月激情六月丁香 | 国产精品第52页 | 婷婷色在线 | 婷婷中文字幕综合 | 欧美在线视频第一页 | 午夜在线免费观看 | 香蕉久草| 国产原创在线 | 国产精品久久久久久久久久妇女 | 国产在线一区二区三区播放 | 又大又硬又黄又爽视频在线观看 | 日韩在线观看 | 在线亚洲人成电影网站色www | 中文av网 | 91禁看片 | 中文字幕一区二区三 | 成年人免费在线观看网站 | 国产精品mm | 中文字幕在线视频一区二区 | 日韩精品一区二区三区在线播放 | 五月婷av | 久保带人| 伊人亚洲精品 | 国产在线视频在线观看 | 综合久久久久久久久 | 涩涩爱夜夜爱 | 鲁一鲁影院 | 欧美成人亚洲 | 一级欧美一级日韩 | 成人午夜剧场在线观看 | 91视频在线观看下载 | 国产精品片 | 深爱激情综合网 | 97超碰国产精品女人人人爽 | 欧美在线观看视频一区二区三区 | 日本公妇在线观看高清 | 久久精品中文字幕 | 摸阴视频 | 国产黄色精品网站 | 国产精品免费久久久久久 | 亚洲综合在线观看视频 | 日韩不卡高清 | 亚洲免费不卡 | 国产精品综合av一区二区国产馆 | 色综合久久88色综合天天6 | 91视频中文字幕 | 中文字幕资源站 | 国产精品一码二码三码在线 | 日韩黄色一级电影 | 亚洲国产精品久久久 | 国产一级久久久 | www五月天婷婷 | 久久艹艹 | 欧美人人爱| 精品国产自 | 国产精品女同一区二区三区久久夜 | 国产精品毛片完整版 | 精品亚洲成人 | 成年人看片网站 | 91麻豆精品国产自产 | 涩涩网站在线观看 | 婷婷av网站 | 国产污视频在线观看 | 亚洲国产成人精品在线观看 | 麻豆系列在线观看 | 亚洲黄色片在线 | 97超碰人人澡人人爱学生 | av一区在线播放 | 天天操天天添天天吹 | 999视频网站 | 日日摸日日爽 | www.国产在线 | 午夜私人影院久久久久 | 99精品国产免费久久 | 在线中文字幕观看 | 999精品视频 | 国产精品麻豆视频 | 四虎影视成人永久免费观看亚洲欧美 | 亚洲精品福利在线观看 | 色视频网页 | 国产视频在线观看一区 | 国产精品美女久久久久久久久久久 | 色天天综合久久久久综合片 | 免费av高清| 麻花豆传媒mv在线观看 | av电影在线观看完整版一区二区 | 日b视频在线观看网址 | 中文字幕丰满人伦在线 | 色噜噜狠狠色综合中国 | 亚洲视频2 | 人人添人人澡人人澡人人人爽 | 国产小视频在线播放 | 91最新地址永久入口 | 久久久久97国产 | 亚洲激情网站免费观看 | 国产美女免费 | av免费电影在线观看 | 日韩在线视频网站 | 91大神电影 | 性色av免费看 | 香蕉精品视频在线观看 | 色婷婷福利视频 | 久久人人看 | 就要干b| 美女视频黄,久久 | 99久久精品久久久久久动态片 | 国产丝袜在线 | 国产成人一区二区啪在线观看 | 国色天香在线观看 | 久久久一本精品99久久精品66 | 又粗又长又大又爽又黄少妇毛片 | 成人国产精品久久久春色 | 中文字幕日韩精品有码视频 | 久久国产a | 最近中文国产在线视频 | 日本精品在线视频 | 日本精品视频在线观看 | 亚洲国产精品第一区二区 | av888.com| 国产手机精品视频 | 久久久久久久av | www.xxxx变态.com | www免费看片com | 人人干天天射 | 天天干天天草天天爽 | 成人免费视频在线观看 | 国产精品久久嫩一区二区免费 | 天天色天天综合 | 午夜久久久影院 | 久久久鲁 | 999久久久| 波多野结衣一区 | 亚洲成人频道 | 久久久这里有精品 | 国产美女久久 | 久久九九视频 | 免费视频一二三区 | 国产精品免费不卡 | 国产一区欧美二区 | 99热官网| 麻豆av一区二区三区在线观看 | 久久久69 | 久草视频免费在线播放 | 91资源在线免费观看 | 国产精品嫩草影院99网站 | 91手机在线看片 | 国产免费又爽又刺激在线观看 | 久久高清国产视频 | 欧美成人h版在线观看 | 欧美精品xx | 久久这里只有精品首页 | 一区 二区电影免费在线观看 | 日韩精品久久一区二区 | 精品中文字幕在线观看 | ww视频在线观看 | 国产精品久久久久毛片大屁完整版 | 日本久久免费视频 | 久久99精品久久久久久清纯直播 | 欧美日韩国产综合一区二区 | 国产成人一区二区在线观看 | 夜夜干夜夜 | 色片网站在线观看 | 久久婷婷一区二区三区 | 欧美精品一区二区三区四区在线 | 中文字幕av网站 | 五月婷婷天堂 | 色无五月 | 久久黄色免费视频 | 一级免费黄色 | 91精品在线麻豆 | av成人免费观看 | 国产香蕉视频在线播放 | 91av短视频| 在线国产片| 欧美一级片在线免费观看 | 精品国产精品久久 | 亚洲精品乱码久久久久久蜜桃不爽 | 中文字幕一区在线观看视频 | 91av手机在线观看 | 亚洲精品视频一二三 | .国产精品成人自产拍在线观看6 | 欧美日韩国产精品久久 | 国产精品麻豆视频 | 麻豆国产精品永久免费视频 | 国产精品成人一区二区三区吃奶 | 91久久久久久久一区二区 | 天天干夜夜操视频 | 国产在线观看国语版免费 | 日韩色综合 | 亚洲性xxxx | a天堂最新版中文在线地址 久久99久久精品国产 | 国产黄色片一级三级 | 91精品视频观看 | 色婷丁香 | 久草网在线观看 | 天天射一射| 99热精品视 | 中文字幕在线久一本久 | 中文字幕视频播放 | 国产精品久久久久av福利动漫 | 日韩免费在线观看网站 | 五月婷婷六月丁香 | 久久久久国产一区二区 | 91精品国产综合久久婷婷香蕉 | 最新日韩在线观看视频 | 久久免费在线 | 天天草天天干 | 激情av五月婷婷 | 久久久久久久99精品免费观看 | 国语麻豆 | 国产精品成人久久久久久久 | 69国产精品视频 | 狠狠躁日日躁狂躁夜夜躁av | 欧美激情一区不卡 | 又黄又爽又色无遮挡免费 | 99热精品免费观看 | 国产成人三级一区二区在线观看一 | 国产精品专区在线 | 99久久精品免费看国产麻豆 | 国产在线黄色 | 九九视频网站 | 国产精品免费久久久久 | 亚洲视频网站在线观看 | 韩国av电影网 | 免费一级黄色 | 久久九九精品久久 | 丁香亚洲 | 亚洲国产精品资源 | 91成人精品一区在线播放69 | 国产a网站 | 日本精油按摩3 | 91精品国自产在线观看欧美 | 狠狠操夜夜| 超碰免费av | 日韩在线网址 | 麻豆精品在线视频 | 久久国产午夜精品理论片最新版本 | 日日夜夜国产 | av免费高清观看 | 青草视频网 | 亚洲精品国偷拍自产在线观看 | 黄色小网站在线观看 | 久久综合导航 | 欧美性脚交 | 亚洲色五月 | 免费高清av在线看 | 欧美 国产 视频 | 亚洲福利精品 | 日日夜夜网站 | 一区二区三区在线视频观看58 | 精品成人在线 | 91九色精品女同系列 | 日本精品中文字幕 | 麻豆久久一区 | 午夜精品久久久久 | 九九爱免费视频在线观看 | 五月天久久激情 | 在线国产欧美 | 狠狠激情中文字幕 | 欧美激情精品久久久久 | 久草在线免费新视频 | 99久久综合狠狠综合久久 | 日韩午夜电影网 | 99这里都是精品 | 人人揉人人揉人人揉人人揉97 | 丁香激情综合国产 | 国产亚洲激情视频在线 | 日韩大片免费在线观看 | 狠狠操精品 | 久久深爱网 | 国产精品美女久久久久久久久 | 免费高清在线视频一区· | 热99在线 | 国产 日韩 欧美 自拍 | 久久综合久久伊人 | 国产精品手机在线观看 | 伊人电影在线观看 | 国产美腿白丝袜足在线av | 99久久婷婷国产综合亚洲 | 日韩精品中文字幕在线观看 | 国产精品九九久久久久久久 | 久久精品这里热有精品 | 九九九在线观看 | 精品二区视频 | 久草在线播放视频 | 精品女同一区二区三区在线观看 | 99久久精品费精品 | 久久精品视频网 | 中文字幕av免费 | 中文字幕在线观看91 | 激情久久小说 | 日韩免费高清在线 | 2021国产视频| 天天射色综合 | 欧美成天堂网地址 | 久久免费片 | 婷婷在线五月 | 中文字幕乱码在线播放 | 婷婷久久一区二区三区 | 成人网页在线免费观看 | 日韩性色| www国产精品com| 亚洲国产电影在线观看 | 国产精品视频久久 | 一区二区三区av在线 | 亚洲综合射 | 国产五月色婷婷六月丁香视频 | 国产传媒中文字幕 | 日韩国产高清在线 | 黄色av电影在线观看 | 日本黄区免费视频观看 | 91在线www| 在线www色 | 一区二区三区 亚洲 | 天天摸天天操天天舔 | 日韩成人在线一区二区 | 黄色在线免费观看网站 | 伊人黄色网 | 色在线中文字幕 | 色黄视频免费观看 | 一区二区三区精品在线 | 成人毛片久久 | 国产精品久久久久久久久久久久久久 | 亚洲撸撸 | 91高清完整版在线观看 | 黄色av一区二区三区 | 成人观看视频 | 久久黄网站| 精品视频97| 99精品久久只有精品 | 国产麻豆果冻传媒在线观看 | 黄色av免费看| 色综合天天综合在线视频 | 国产日韩亚洲 | 国产精品一区二区视频 | 国产精品中文字幕在线观看 | 97av.com| 亚洲视频观看 | 97香蕉久久超级碰碰高清版 | 国产在线播放观看 | 成人黄色国产 | 国产高清精 | 丁香激情婷婷 | 国产亚洲午夜高清国产拍精品 | 久久精品国产成人精品 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产美腿白丝袜足在线av | 国产精品美 | www视频在线观看 | 国产亚洲精品中文字幕 | 亚洲丁香日韩 | 操老逼免费视频 | 一本一本久久a久久精品综合妖精 | 免费在线观看成人av | 欧美乱淫视频 | 97超碰影视 | 久久精品99久久久久久 | 波多野结衣精品视频 | 国产精品久久久久永久免费 | 色婷婷视频在线 | 久久久亚洲麻豆日韩精品一区三区 | 免费在线成人 | 亚洲精品456在线播放第一页 | 亚洲草视频| 最新av在线播放 | 免费av在线网 | 日日夜夜精品免费视频 | 人人舔人人爽 | 久久久亚洲麻豆日韩精品一区三区 | www.午夜| 亚洲天堂视频在线 | 欧美一级欧美一级 | 月下香电影 | 香蕉视频免费在线播放 | 久久久久亚洲国产精品 | 中文字幕在线观看第一区 | 嫩模bbw搡bbbb搡bbbb | 亚洲欧美视频在线观看 | 成人av一区二区兰花在线播放 | 国产精品露脸在线 | 国产综合在线视频 | 日日干干夜夜 | 成人av在线看 | 国产精品女主播一区二区三区 | a级国产乱理伦片在线观看 亚洲3级 | 99精品视频精品精品视频 | 日韩精品免费一线在线观看 | 中文av不卡 | 999视频在线播放 | 丁香5月婷婷| 综合av在线 | 免费黄色在线播放 | 右手影院亚洲欧美 | 国产高清成人av | 国产一级片视频 | 成人久久久久 | 久久夜夜操 | 一区二区三区电影 | 久久天天综合网 | 国产一区电影在线观看 | 国产精品 久久 | av免费观看高清 | 国产精品中文字幕在线 | 丁香激情综合国产 | 亚洲色图色 | 在线观看岛国片 | 久久情侣偷拍 | 91看片在线播放 | 国产精品久久久久aaaa九色 | 欧美一级性生活 | 一级淫片a | 中文字幕丝袜一区二区 | 97自拍超碰 | 88av色| 麻豆91网站 | 国产精品久久久久久久久久久免费 | 丁香资源影视免费观看 | 国产区免费在线 | 国产九色在线播放九色 | 亚洲精品一区中文字幕乱码 | 亚洲精品国偷拍自产在线观看 | 国产一级片免费观看 | 久久久久久久久久久影院 | 99爱这里只有精品 | 精品视频久久 | 日韩一级电影网站 | av东方在线 | 久久久伊人网 | 精品久久久免费 | 综合激情网 | 精品久久久久久综合 | 亚洲aⅴ一区二区三区 | 精品一区二区免费视频 | 婷婷丁香九月 | 国产一区二区日本 | av一区二区在线观看中文字幕 | 免费看毛片网站 | 日韩中文字幕免费视频 | 国产精品久久久久毛片大屁完整版 | 2024国产精品视频 | 欧美日韩在线观看一区二区 | 免费视频一区二区 | 中文字幕日本电影 | 免费视频97 | 欧美日韩国产亚洲乱码字幕 | 免费久久99精品国产婷婷六月 | 色网站黄 | 国产精品久久久久久电影 | 成人网在线免费视频 | 欧美视频18 | 久久久精品国产一区二区三区 | 成人网在线免费视频 | 色综合咪咪久久网 | 欧美精品免费在线 | 国产专区一 | 国产精品av在线免费观看 | www.夜夜草| 在线成人中文字幕 | 国产最新福利 | 97超碰免费| 最近中文字幕mv | av片中文 | 四虎免费在线观看视频 | 免费观看www小视频的软件 | 又黄又爽又湿又无遮挡的在线视频 | 亚洲激情电影在线 | 啪啪午夜免费 | 成片视频免费观看 | 欧美中文字幕久久 | 日韩天堂网| 麻豆久久久久 | 91最新视频在线观看 | 91免费观看视频网站 | 九九免费精品视频在线观看 | 黄色大片日本 | 大型av综合网站 | 久久国产一区 | 久久亚洲综合国产精品99麻豆的功能介绍 | 天堂在线视频中文网 | 日韩欧美网址 | 国产精品国产三级国产不产一地 | 国产色小视频 | 五月婷婷在线综合 | 狠狠狠色丁香婷婷综合久久五月 | av福利网址导航 | 日韩h在线观看 | 在线观看中文字幕dvd播放 | 国产99久久久精品 | 久久99这里只有精品 | 天天爽夜夜爽精品视频婷婷 | 午夜精品久久久久久久爽 | 一级免费av | 少妇bbw揉bbb欧美 | 亚洲黄色免费网站 | 这里有精品在线视频 | 日本黄色免费在线 | 久久国产二区 | 91精品天码美女少妇 | 亚洲国产精品小视频 | 久久亚洲视频 | 欧产日产国产69 | 婷婷丁香导航 | 午夜视频免费播放 | 狠狠狠干| 最新av中文字幕 | 久青草电影 | 97超碰香蕉| 日韩一区二区三区高清免费看看 | 91在线视频免费观看 | 久草网在线 | 五月天亚洲综合小说网 | 爱色av.com | 在线观看中文字幕视频 | 97超碰福利久久精品 | 欧美激情第八页 | 九九视频免费在线观看 | 国产精品免费麻豆入口 | 国产超碰在线观看 | 日韩丝袜 | 少妇bbbb搡bbbb桶 | 996久久国产精品线观看 | 超级碰99 | 很污的网站 | 亚洲国内在线 | 91视频免费视频 | 九九视频精品免费 | 欧美激情视频久久 | 91精品免费在线视频 | 欧美大片大全 | 人人爽人人干 | 日韩字幕在线观看 | 久久不卡视频 | 婷婷久久久 | 日韩精品一区二区在线观看视频 | 蜜臀一区二区三区精品免费视频 | 国产不卡一二三区 | 久久精品视频中文字幕 | 狠狠躁18三区二区一区ai明星 | av电影在线播放 | 1024手机基地在线观看 | 最新日本中文字幕 | 亚洲综合狠狠干 | 国产99自拍 | 中文字幕美女免费在线 | 国产精品一区二区免费在线观看 | 日本丶国产丶欧美色综合 | 激情五月综合网 | 国产91精品久久久久 | 久久精品亚洲综合专区 | 国产亚洲精品久久久久久久久久久久 | 日本黄色免费观看 | 美女精品久久久 | 国产精品99久久久久久武松影视 | 欧美亚洲国产精品久久高清浪潮 | 国内精品中文字幕 | 欧美性生爱 | 国产日产在线观看 | 久久综合操 | 奇米影视777四色米奇影院 | 国产午夜在线 | 六月丁香婷婷网 | 黄色网在线免费观看 | 欧美福利在线播放 | av在线不卡观看 | 国产一线二线三线性视频 | 国产精品国产三级在线专区 | 成人av在线资源 | 奇人奇案qvod| 四虎在线免费 | 久久久久亚洲精品 | 亚洲女同ⅹxx女同tv | 天天色欧美| 国产成人久久77777精品 | 在线观看视频你懂 | 嫩草91影院 | 久久国产精品视频免费看 | 天天综合网久久综合网 | 久久久久久久久久久久影院 | 日韩电影一区二区在线观看 | 成人毛片一区二区三区 | 亚洲欧洲日韩在线观看 | 伊人色综合久久天天 | 521色香蕉网站在线观看 | 一级黄色片在线观看 | 成人午夜电影久久影院 | 中文字幕五区 | 久久久久久久久免费 | 69精品在线观看 | 狠狠色丁香婷婷综合视频 | 成 人 黄 色 片 在线播放 | 欧美日韩后 | 91精品国产自产91精品 | 最新av免费在线观看 | av中文字幕在线观看网站 | 欧美91成人网 | 久久99国产精品 | 色播激情五月 | 日韩精品久久久免费观看夜色 | 四虎亚洲精品 | 91麻豆精品国产91久久久无限制版 | 欧美日韩国产综合一区二区 | av免费看在线 | 青草视频免费观看 | 日韩欧美在线第一页 | 久久黄色免费视频 | 视频在线99re |