日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

通过live555实现H264 RTSP直播(Windows版)

發(fā)布時間:2025/3/21 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过live555实现H264 RTSP直播(Windows版) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為何標明“Windows版”,因為firehood大神已經(jīng)實現(xiàn)了linux版:通過live555實現(xiàn)H264 RTSP直播

相關(guān)文章:

【1】Win7(Windows 7)下用VS2013(Visual Studio 2013)編譯live555

【2】RTSP協(xié)議分析

【3】windows命名管道

一.基礎(chǔ)

live555的學習基本上都是從E:\live555\testProgs中的testOnDemandRTSPServer.cpp示例開始的,這個例子實現(xiàn)了一個最簡單的RTSP服務(wù)器。文件名中的“OnDemand”意思是:依指令行事,也就是說只有當客戶端通過URL主動訪問并發(fā)送相關(guān)指令時,該RTSP服務(wù)器才會將文件流化并推送到客戶端。這個例子是基于RTP單播的,關(guān)于單播可以參考:Qt調(diào)用jrtplib實現(xiàn)單播、多播和廣播

通過testOnDemandRTSPServer.cpp可以學習一個RTSP服務(wù)器的搭建步驟。這里新建一個名為h264LiveMediaServer的Win32控制臺工程,新建并添加h264LiveMediaServer.cpp,然后將testOnDemandRTSPServer.cpp拷貝到h264LiveMediaServer.cpp,接著做少量修改,只保留與H.264會話相關(guān)的部分,如下所示:


[cpp] view plain copy
  • #include?"liveMedia.hh"??
  • #include?"BasicUsageEnvironment.hh"??
  • ??
  • UsageEnvironment*?env;??
  • ??
  • //?True:后啟動的客戶端總是從當前第一個客戶端已經(jīng)播放到的位置開始播放??
  • //?False:每個客戶端都從頭開始播放影視頻文件??
  • Boolean?reuseFirstSource?=?False;??
  • ??
  • //該函數(shù)打印相關(guān)信息??
  • static?void?announceStream(RTSPServer*?rtspServer,?ServerMediaSession*?sms,??
  • ????char?const*?streamName,?char?const*?inputFileName);???
  • ??
  • int?main(int?argc,?char**?argv)???
  • {??
  • ????//創(chuàng)建任務(wù)調(diào)度器并初始化使用環(huán)境??
  • ????TaskScheduler*?scheduler?=?BasicTaskScheduler::createNew();??
  • ????env?=?BasicUsageEnvironment::createNew(*scheduler);??
  • ??
  • ????UserAuthenticationDatabase*?authDB?=?NULL;??
  • ??
  • ????//創(chuàng)建RTSP服務(wù)器,開始監(jiān)聽模客戶端的連接??
  • ????//注意這里的端口號不是默認的554端口,因此訪問URL時,需指定該端口號??
  • ????RTSPServer*?rtspServer?=?RTSPServer::createNew(*env,?8554,?authDB);??
  • ????if?(rtspServer?==?NULL)???
  • ????{??
  • ????????*env?<<?"Failed?to?create?RTSP?server:?"?<<?env->getResultMsg()?<<?"\n";??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????char?const*?descriptionString??
  • ????????=?"Session?streamed?by?\"h264LiveMediaServer\"";??
  • ??
  • ????//流名字,媒體名??
  • ????char?const*?streamName?=?"h264ESVideoTest";??
  • ????//文件名,當客戶端輸入的流名字為h264ESVideoTest時,實際上打開的是test.264文件。??
  • ????//這里需要特別注意一點,當通過IDE運行h264LiveMediaServer時,live555推送的是項目工作目錄中的視頻或音頻。工作目錄也就是和*.vcxproj同級的目錄,??
  • ????//此時視頻應(yīng)該放在這個目錄下。當雙擊h264LiveMediaServer.exe運行時,視頻理所當然的和h264LiveMediaServer.exe放在一個目錄。??
  • ????char?const*?inputFileName?=?"480320.264";???
  • ????//當客戶點播時,要輸入流名字streamName,告訴RTSP服務(wù)器點播的是哪個流。????
  • ????//創(chuàng)建媒體會話,流名字和文件名的對應(yīng)關(guān)系是通過增加子會話建立起來的。媒體會話對會話描述、會話持續(xù)時間、流名字等與會話有關(guān)的信息進行管理。????
  • ????//第2個參數(shù):媒體名、3:媒體信息、4:媒體描述????
  • ????ServerMediaSession*?sms=?ServerMediaSession::createNew(*env,?streamName,?streamName,descriptionString);??
  • ????//添加264子會話?這里的文件名才是真正要打開文件的名字???
  • ????//H264VideoFileServerMediaSubsession類派生自FileServerMediaSubsession派生自O(shè)nDemandServerMediaSubsession????
  • ????//而OnDemandServerMediaSubsession和PassiveMediaSubsession共同派生自ServerMediaSubsession????
  • ????//關(guān)于讀取文件之類都在這個類中實現(xiàn)的,如果要將點播改為直播就是要新建類繼承此類然后添加新的方法????
  • ????sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(*env,?inputFileName,?reuseFirstSource));??
  • ????//為rtspserver添加session???
  • ????rtspServer->addServerMediaSession(sms);??
  • ????//答應(yīng)信息到標準輸出??
  • ????announceStream(rtspServer,?sms,?streamName,?inputFileName);??
  • ??????
  • ????//試圖為RTSP-over-HTTP通道創(chuàng)建一個HTTP服務(wù)器.??
  • ????if?(rtspServer->setUpTunnelingOverHTTP(80)?||?rtspServer->setUpTunnelingOverHTTP(8000)?||?rtspServer->setUpTunnelingOverHTTP(8080))???
  • ????{??
  • ????????*env?<<?"\n(We?use?port?"?<<?rtspServer->httpServerPortNum()?<<?"?for?optional?RTSP-over-HTTP?tunneling.)\n";??
  • ????}??
  • ????else???
  • ????{??
  • ????????*env?<<?"\n(RTSP-over-HTTP?tunneling?is?not?available.)\n";??
  • ????}??
  • ????//進入事件循環(huán),對套接字的讀取事件和對媒體文件的延時發(fā)送操作都在這個循環(huán)中完成。???
  • ????env->taskScheduler().doEventLoop();??
  • ??
  • ????return?0;???
  • }??
  • ??
  • static?void?announceStream(RTSPServer*?rtspServer,?ServerMediaSession*?sms,??
  • ????char?const*?streamName,?char?const*?inputFileName)?{??
  • ????char*?url?=?rtspServer->rtspURL(sms);??
  • ????UsageEnvironment&?env?=?rtspServer->envir();??
  • ????env?<<?"\n\""?<<?streamName?<<?"\"?stream,?from?the?file?\""??
  • ????????<<?inputFileName?<<?"\"\n";??
  • ????env?<<?"Play?this?stream?using?the?URL?\""?<<?url?<<?"\"\n";??
  • ????delete[]?url;??
  • }??
  • 如何測試可參考【1】,測試結(jié)果如下所示:



    二.實現(xiàn)

    在通過live555實現(xiàn)H264 RTSP直播中,博主是通過FIFO隊列實現(xiàn)的,FIFO隊列實際上是Linux下的命名管道,而Windows下也有命名管道,因此在Windows中的流程圖如下所示:


    關(guān)于Windows命名管道詳見【3】。

    這里不使用命名管道來實現(xiàn),而是直接讀取本地H264文件,分解成StartCode+NALU內(nèi)存塊,然后拷貝到Live555 Server。這樣一來,就很容易改成命名管道的形式,命名管道的客戶端只需讀取本地H264文件,分解成StartCode(0x000001或0x00000001)+NALU內(nèi)存塊,并寫入管道,命名管道服務(wù)器端(在Live555 Server中)讀取管道數(shù)據(jù),并拷貝到Live555 Server。


    通過“基礎(chǔ)”中的分析可以得出,想實現(xiàn)自定義服務(wù)器,需要將sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(*env, inputFileName,reuseFirstSource)),中的H264VideoFileServerMediaSubsession替換成自己的子會話。H264VideoFileServerMediaSubsession類在其createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate)函數(shù)中調(diào)用了ByteStreamFileSource::createNew(envir(), fFileName),而frame的獲取正是在ByteStreamFileSource類中的doGetNextFrame()函數(shù)中實現(xiàn)的。因此,這里需要繼承H264VideoFileServerMediaSubsession和ByteStreamFileSource類,并重寫其中的createNewStreamSource和doGetNextFrame函數(shù)。


    代碼如下所示:

    h264LiveFramedSource.hh

    [cpp] view plain copy
  • #ifndef?_H264LIVEFRAMEDSOURCE_HH??
  • #define?_H264LIVEFRAMEDSOURCE_HH??
  • ??
  • ??
  • #include?<ByteStreamFileSource.hh>??
  • ??
  • ??
  • class?H264LiveFramedSource?:?public?ByteStreamFileSource??
  • {??
  • public:??
  • ????static?H264LiveFramedSource*?createNew(UsageEnvironment&?env,?unsigned?preferredFrameSize?=?0,?unsigned?playTimePerFrame?=?0);??
  • ??
  • ??
  • protected:??
  • ????H264LiveFramedSource(UsageEnvironment&?env,?unsigned?preferredFrameSize,?unsigned?playTimePerFrame);??
  • ????~H264LiveFramedSource();??
  • ??
  • ??
  • private:??
  • ????//重定義虛函數(shù)??
  • ????virtual?void?doGetNextFrame();??
  • };??
  • ??
  • #endif??
  • h264LiveFramedSource.cpp
    [cpp] view plain copy
  • #include?"h264LiveFramedSource.hh"??
  • #include?"GroupsockHelper.hh"??
  • #include?"spsdecode.h"??
  • ??
  • int?findStartCode(unsigned?char?*buf,?int?zeros_in_startcode)??
  • {??
  • ????int?info;??
  • ????int?i;??
  • ??
  • ????info?=?1;??
  • ????for?(i?=?0;?i?<?zeros_in_startcode;?i++)??
  • ????if?(buf[i]?!=?0)??
  • ????????info?=?0;??
  • ??
  • ????if?(buf[i]?!=?1)??
  • ????????info?=?0;??
  • ????return?info;??
  • }??
  • //此處的NALU包括StartCode??
  • int?getNextNalu(FILE*?inpf,?unsigned?char*?buf)??
  • {??
  • ????int?pos?=?0;??
  • ????int?startCodeFound?=?0;??
  • ????int?info2?=?0;??
  • ????int?info3?=?0;??
  • ??
  • ????while?(!feof(inpf)?&&?(buf[pos++]?=?fgetc(inpf))?==?0);??
  • ??
  • ????while?(!startCodeFound)??
  • ????{??
  • ????????if?(feof(inpf))??
  • ????????{??
  • ????????????return?pos?-?1;??
  • ????????}??
  • ????????buf[pos++]?=?fgetc(inpf);??
  • ????????info3?=?findStartCode(&buf[pos?-?4],?3);??
  • ????????startCodeFound=(info3?==?1);??
  • ????????if?(info3?!=?1)??
  • ????????????info2?=?findStartCode(&buf[pos?-?3],?2);??
  • ?????????startCodeFound?=?(info2?==?1?||?info3?==?1);??
  • ????}??
  • ????if?(info2)??
  • ????{??
  • ????????fseek(inpf,?-3,?SEEK_CUR);??
  • ????????return?pos?-?3;??
  • ????}??
  • ????if?(info3)??
  • ????{??
  • ????????fseek(inpf,?-4,?SEEK_CUR);??
  • ????????return?pos?-?4;??
  • ????}??
  • }??
  • ??
  • FILE?*?inpf;??
  • unsigned?char*?inBuf;??
  • int?inLen;??
  • int?nFrameRate;??
  • H264LiveFramedSource::H264LiveFramedSource(UsageEnvironment&?env,?unsigned?preferredFrameSize,?unsigned?playTimePerFrame)??
  • :?ByteStreamFileSource(env,?0,?preferredFrameSize,?playTimePerFrame)??
  • {??
  • ????char?*fname?=?"480320.264";??
  • ????inpf?=?NULL;??
  • ????inpf?=?fopen(fname,?"rb");??
  • ????inBuf?=?(unsigned?char*)calloc(1024?*?100,?sizeof(char));??
  • ????inLen?=?0;??
  • ????inLen?=?getNextNalu(inpf,?inBuf);??
  • ????//?讀取SPS幀??
  • ????unsigned?int?nSpsLen?=?inLen?-?4;??
  • ????unsigned?char?*pSps?=?(unsigned?char*)malloc(nSpsLen);??
  • ????memcpy(pSps,?inBuf?+?4,?nSpsLen);??
  • ??
  • ????//?解碼SPS,獲取視頻圖像寬、高信息??
  • ????int?width?=?0,?height?=?0,?fps?=?0;??
  • ??
  • ????h264_decode_sps(pSps,?nSpsLen,?width,?height,?fps);??
  • ??
  • ????nFrameRate?=?0;??
  • ????if?(fps)??
  • ????????nFrameRate?=?fps;??
  • ????else??
  • ????????nFrameRate?=?25;??
  • }??
  • ??
  • H264LiveFramedSource*?H264LiveFramedSource::createNew(UsageEnvironment&?env,?unsigned?preferredFrameSize,?unsigned?playTimePerFrame)??
  • {??
  • ????H264LiveFramedSource*?newSource?=?new?H264LiveFramedSource(env,?preferredFrameSize,?playTimePerFrame);??
  • ????return?newSource;??
  • }??
  • ??
  • H264LiveFramedSource::~H264LiveFramedSource()??
  • {??
  • ????free(inBuf);??
  • ????fclose(inpf);??
  • }??
  • ??
  • //?This?function?is?called?when?new?frame?data?is?available?from?the?device.??
  • //?We?deliver?this?data?by?copying?it?to?the?'downstream'?object,?using?the?following?parameters?(class?members):??
  • //?'in'?parameters?(these?should?*not*?be?modified?by?this?function):??
  • //?????fTo:?The?frame?data?is?copied?to?this?address.??
  • //?????????(Note?that?the?variable?"fTo"?is?*not*?modified.??Instead,??
  • //??????????the?frame?data?is?copied?to?the?address?pointed?to?by?"fTo".)??
  • //?????fMaxSize:?This?is?the?maximum?number?of?bytes?that?can?be?copied??
  • //?????????(If?the?actual?frame?is?larger?than?this,?then?it?should??
  • //??????????be?truncated,?and?"fNumTruncatedBytes"?set?accordingly.)??
  • //?'out'?parameters?(these?are?modified?by?this?function):??
  • //?????fFrameSize:?Should?be?set?to?the?delivered?frame?size?(<=?fMaxSize).??
  • //?????fNumTruncatedBytes:?Should?be?set?iff?the?delivered?frame?would?have?been??
  • //?????????bigger?than?"fMaxSize",?in?which?case?it's?set?to?the?number?of?bytes??
  • //?????????that?have?been?omitted.??
  • //?????fPresentationTime:?Should?be?set?to?the?frame's?presentation?time??
  • //?????????(seconds,?microseconds).??This?time?must?be?aligned?with?'wall-clock?time'?-?i.e.,?the?time?that?you?would?get??
  • //?????????by?calling?"gettimeofday()".??
  • //?????fDurationInMicroseconds:?Should?be?set?to?the?frame's?duration,?if?known.??
  • //?????????If,?however,?the?device?is?a?'live?source'?(e.g.,?encoded?from?a?camera?or?microphone),?then?we?probably?don't?need??
  • //?????????to?set?this?variable,?because?-?in?this?case?-?data?will?never?arrive?'early'.??
  • void?H264LiveFramedSource::doGetNextFrame()??
  • {??
  • ????fFrameSize?=?inLen;??
  • ????if?(fFrameSize?>?fMaxSize)??
  • ????{??
  • ????????fNumTruncatedBytes?=?fFrameSize?-?fMaxSize;??
  • ????????fFrameSize?=?fMaxSize;??
  • ????}??
  • ????else??
  • ????{??
  • ????????fNumTruncatedBytes?=?0;??
  • ????}??
  • ????memmove(fTo,?inBuf,?fFrameSize);??
  • ??
  • ????inLen?=?0;??
  • ????inLen?=?getNextNalu(inpf,?inBuf);??
  • ????gettimeofday(&fPresentationTime,?NULL);//時間戳???
  • ????fDurationInMicroseconds?=?1000000?/?nFrameRate;//控制播放速度??
  • ????//表示延遲0秒后再執(zhí)行afterGetting函數(shù),也可以直接用afterGetting(this)??
  • ????nextTask()?=?envir().taskScheduler().scheduleDelayedTask(0,?(TaskFunc*)FramedSource::afterGetting,?this);??
  • }??
  • h264LiveVideoServerMediaSubssion.hh [cpp] view plain copy
  • #ifndef?_H264LIVEVIDEOSERVERMEDIASUBSSION_HH??
  • #define?_H264LIVEVIDEOSERVERMEDIASUBSSION_HH??
  • #include?"H264VideoFileServerMediaSubsession.hh"??
  • ??
  • class?H264LiveVideoServerMediaSubssion?:?public?H264VideoFileServerMediaSubsession?{??
  • ??
  • public:??
  • ????static?H264LiveVideoServerMediaSubssion*?createNew(UsageEnvironment&?env,?Boolean?reuseFirstSource);??
  • ??
  • protected:???
  • ????H264LiveVideoServerMediaSubssion(UsageEnvironment&?env,?Boolean?reuseFirstSource);??
  • ????~H264LiveVideoServerMediaSubssion();??
  • ??
  • protected:???
  • ????//重定義虛函數(shù)??
  • ????FramedSource*?createNewStreamSource(unsigned?clientSessionId,?unsigned&?estBitrate);??
  • };??
  • ??
  • #endif??
  • h264LiveVideoServerMediaSubssion.cpp

    [cpp] view plain copy
  • #include?"h264LiveVideoServerMediaSubssion.hh"??
  • #include?"h264LiveFramedSource.hh"??
  • #include?"H264VideoStreamFramer.hh"??
  • ??
  • H264LiveVideoServerMediaSubssion*?H264LiveVideoServerMediaSubssion::createNew(UsageEnvironment&?env,?Boolean?reuseFirstSource)??
  • {??
  • ????return?new?H264LiveVideoServerMediaSubssion(env,?reuseFirstSource);??
  • }??
  • ??
  • H264LiveVideoServerMediaSubssion::H264LiveVideoServerMediaSubssion(UsageEnvironment&?env,?Boolean?reuseFirstSource)??
  • :?H264VideoFileServerMediaSubsession(env,?0,?reuseFirstSource)??
  • {??
  • ??
  • }??
  • ??
  • H264LiveVideoServerMediaSubssion::~H264LiveVideoServerMediaSubssion()??
  • {??
  • }??
  • ??
  • FramedSource*?H264LiveVideoServerMediaSubssion::createNewStreamSource(unsigned?clientSessionId,?unsigned&?estBitrate)??
  • {??
  • ????//estimate?bitrate:估計的比特率,記得根據(jù)需求修改??
  • ????estBitrate?=?1000;?//?kbps??
  • ????//創(chuàng)建視頻源??
  • ????H264LiveFramedSource*?liveSource?=?H264LiveFramedSource::createNew(envir());??
  • ????if?(liveSource?==?NULL)??
  • ????{??
  • ????????return?NULL;??
  • ????}??
  • ??
  • ????//為視頻流創(chuàng)建Framer??
  • ????return?H264VideoStreamFramer::createNew(envir(),?liveSource);??
  • }??

  • 還需在h264LiveMediaServer.cpp中做相應(yīng)的修改 [cpp] view plain copy
  • #include?"liveMedia.hh"??
  • #include?"BasicUsageEnvironment.hh"??
  • #include?"h264LiveVideoServerMediaSubssion.hh"??
  • ??
  • UsageEnvironment*?env;??
  • ??
  • //?True:后啟動的客戶端總是從當前第一個客戶端已經(jīng)播放到的位置開始播放??
  • //?False:每個客戶端都從頭開始播放影視頻文件??
  • Boolean?reuseFirstSource?=?True;??
  • ??
  • //該函數(shù)打印相關(guān)信息??
  • static?void?announceStream(RTSPServer*?rtspServer,?ServerMediaSession*?sms,?char?const*?streamName);???
  • ??
  • int?main(int?argc,?char**?argv)???
  • {??
  • ????//創(chuàng)建任務(wù)調(diào)度器并初始化使用環(huán)境??
  • ????TaskScheduler*?scheduler?=?BasicTaskScheduler::createNew();??
  • ????env?=?BasicUsageEnvironment::createNew(*scheduler);??
  • ????UserAuthenticationDatabase*?authDB?=?NULL;??
  • ??
  • ????//創(chuàng)建RTSP服務(wù)器,開始監(jiān)聽模客戶端的連接??
  • ????//注意這里的端口號不是默認的554端口,因此訪問URL時,需指定該端口號??
  • ????RTSPServer*?rtspServer?=?RTSPServer::createNew(*env,?8554,?authDB);??
  • ????if?(rtspServer?==?NULL)???
  • ????{??
  • ????????*env?<<?"Failed?to?create?RTSP?server:?"?<<?env->getResultMsg()?<<?"\n";??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????char?const*?descriptionString?=?"Session?streamed?by?\"h264LiveMediaServer\"";??
  • ??
  • ????//流名字,媒體名??
  • ????char?const*?streamName?=?"h264ESVideoTest";??
  • ??
  • ????//當客戶點播時,要輸入流名字streamName,告訴RTSP服務(wù)器點播的是哪個流。????
  • ????//創(chuàng)建媒體會話,流名字和文件名的對應(yīng)關(guān)系是通過增加子會話建立起來的。媒體會話對會話描述、會話持續(xù)時間、流名字等與會話有關(guān)的信息進行管理。????
  • ????//第2個參數(shù):媒體名、3:媒體信息、4:媒體描述????
  • ????ServerMediaSession*?sms=?ServerMediaSession::createNew(*env,?streamName,?streamName?,descriptionString);??
  • ??
  • ????//修改為自己實現(xiàn)的H264LiveVideoServerMediaSubssion??
  • ????sms->addSubsession(H264LiveVideoServerMediaSubssion::createNew(*env,?reuseFirstSource));??
  • ??
  • ????//為rtspserver添加session???
  • ????rtspServer->addServerMediaSession(sms);??
  • ??
  • ????//答應(yīng)信息到標準輸出??
  • ????announceStream(rtspServer,?sms,?streamName);??
  • ??????
  • ????//進入事件循環(huán),對套接字的讀取事件和對媒體文件的延時發(fā)送操作都在這個循環(huán)中完成。???
  • ????env->taskScheduler().doEventLoop();??
  • ??
  • ????return?0;???
  • }??
  • ??
  • static?void?announceStream(RTSPServer*?rtspServer,?ServerMediaSession*?sms,char?const*?streamName)???
  • {??
  • ????char*?url?=?rtspServer->rtspURL(sms);??
  • ????UsageEnvironment&?env?=?rtspServer->envir();??
  • ????env?<<?"\n\""?<<?streamName?<<?"\"?stream\"\n";??
  • ????env?<<?"Play?this?stream?using?the?URL?\""?<<?url?<<?"\"\n";??
  • ????delete[]?url;??
  • }??
  • 關(guān)于spsdecode.h,詳見: H.264(H264)解碼SPS獲取分辨率和幀率

    三.測試




    參考鏈接:http://blog.csdn.net/firehood_/article/details/16844397

    總結(jié)

    以上是生活随笔為你收集整理的通过live555实现H264 RTSP直播(Windows版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 日韩精品毛片 | 91麻豆精品国产午夜天堂 | 国产成人精品一二三区 | 私人午夜影院 | 国产日产精品一区二区 | 男女视频在线免费观看 | 久久久久99 | 成人wwwww免费观看 | 99热这里只有精品9 日韩综合在线 | 美女久久久久久久久 | 在线视频欧美亚洲 | 国产精品高清无码在线观看 | 欧美成人免费在线视频 | 欧美 日韩 国产 高清 | 第一毛片 | 朝桐光av在线一区二区三区 | 日本韩国毛片 | 四虎毛片| 无码av免费毛片一区二区 | 日韩女优一区 | 九色在线观看视频 | 免费99视频 | 黄色大全免费观看 | 五月激情小说网 | 亚洲97| 粉嫩av蜜桃av蜜臀av | 日本中文视频 | 国产福利精品一区 | 九九热视频免费观看 | 色站在线 | 亚洲精品国产一区二区 | 久久久久一 | 风流少妇一区二区三区91 | 国产成人综合精品 | 凹凸精品熟女在线观看 | 国产jzjzjz丝袜老师水多 | 久久久久成人精品 | 顶级嫩模啪啪呻吟不断好爽 | 福利所第一导航 | 欧美大尺度视频 | 久久久激情| 青青草国产成人av片免费 | 理论片大全免费理伦片 | www.国产区 | 午夜在线精品 | 三级a视频 | 美女网站在线免费观看 | 久久精品中文闷骚内射 | 国产一级精品毛片 | 日本一级片在线观看 | www.色综合.com | 久操社区 | 亚洲精品aaaaa| 好色婷婷 | 国产99热 | 亚洲激情视频在线 | 暗呦丨小u女国产精品 | 爱的天堂| 日韩精品一区在线观看 | 黄色大片免费网站 | 一级女性全黄久久生活片免费 | 色女生影院 | 色av色| 玉足调教丨vk24分钟 | 欧美精品一区二区三区视频 | 男人的天堂免费 | 蘑菇福利视频一区播放 | 欧美一二三区在线观看 | 小柔的淫辱日记(h | 婷婷视频 | 人妻与黑人一区二区三区 | 一级片在线免费播放 | 北条麻妃一区二区三区免费 | 天天做天天爱夜夜爽 | 亚洲欧洲日本国产 | 男女插插插视频 | 欧美一级性生活视频 | 成人午夜精品 | 97影院| www.在线播放| 亚洲人女屁股眼交6 | 91pao| 国产成人av免费观看 | 少妇又色又爽 | 午夜精品久久久久久 | 精品久久久国产 | 色综合99久久久无码国产精品 | 天堂av一区 | 国产激情小视频 | 牛牛澡牛牛爽一区二区 | 校花被c到呻吟求饶 | 老司机一区二区 | 欧美性猛交aaaa片黑人 | 欧美不卡高清 | 国产又爽又黄免费软件 | 国产精品丝袜黑色高跟 | 欧美99| 五月婷婷色综合 | 成人宗合网 |