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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大话ion系列(四)

發布時間:2024/4/11 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话ion系列(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方“LiveVideoStack”關注我們

作者 | 王朋闖

本文為王朋闖老師創作的系列ion文章,LiveVideoStack已獲得授權發布,未來將持續更新。

大話ion系列(一)

大話ion系列(二)

大話ion系列(三)

七、Simulcast流程

1. Simulcast概念

先介紹WebRTC的一個概念——Simulcast(聯播,俗稱大小流):

推流端===f/h/q==>SFU--f--->收流端A|---q--->收流端B|---h--->收流端C
  • 上行一般是三路流,按分辨率和碼率,一般分為fhq(大中小)三層

  • 下行可以分給不同的用戶不同的流,比如網不好時分發個小流q,網變好了再切回大流f

  • 三層的streamId、trackId是一樣的,但是rid和ssrc是不同的,rid一般是f、h、q

  • 對應的SDP部分

......... a=rid:f send a=rid:h send a=rid:q send a=simulcast:send f;h;q

2.收發流程

看本章之前,最好看一下前一章,熟悉一下收發流程,本文只重點介紹其中的Simulcast部分。

收發包邏輯打通步驟:

SDK推流---->OnTrack---->router.AddReceiver(設置Buffer和上行Track)------>SessionLocal.Publish(設置下行Track)---->收發包邏輯打通

3.Simulcast上行流程

非Simulcast情況,OnTrack一般會觸發兩次:一個audioTrack+一個videoTrack。

Simulcast下,OnTrack一般會觸發四次:一個audioTrack+三個videoTrack(rid分別為fhq)。

這個流程會觸發四次:

OnTrack--->router.AddReceiver--->WebRTCReceiver.AddUpTrack

三個videoTrack,共用同一個WebRTCReceiver。

type WebRTCReceiver struct { 。。。receiver *webrtc.RTPReceivercodec webrtc.RTPCodecParametersrtcpCh chan []rtcp.Packetbuffers [3]*buffer.Buffer//需要三個bufferupTracks [3]*webrtc.TrackRemote//三個TrackRemote 。。。pendingTracks [3][]*DownTrack//三個層,每層來訂閱的downtrack 。。。 }

接下來看一下AddUpTrack是如何工作的:

func (w *WebRTCReceiver) AddUpTrack(track *webrtc.TrackRemote,buff *buffer.Buffer, bestQualityFirst bool) {if w.closed.get() {return}//根據RID來區分layervar layer intswitch track.RID() {//如果沒開simulcast,為""case fullResolution:layer = 2case halfResolution:layer = 1default:layer = 0//如果沒開simulcast,為0}w.Lock()//設置空域層layer的trackw.upTracks[layer] = track//設置空域層layer的buffw.buffers[layer] = buffw.available[layer].set(true)//設置空域層layer的downtrackw.downTracks[layer].Store(make([]*DownTrack,0, 10))w.pendingTracks[layer] = make([]*DownTrack,0, 10)w.Unlock()//閉包函數,按最佳質量訂閱,切到f層subBestQuality := func(targetLayerint) {for l := 0; l <targetLayer; l++ {dts :=w.downTracks[l].Load()if dts == nil{continue}for _, dt :=range dts.([]*DownTrack) {_ = dt.SwitchSpatialLayer(int32(targetLayer), false)}}}//閉包函數,按最差質量訂閱,切到q層subLowestQuality := func(targetLayerint) {for l := 2; l !=targetLayer; l-- {dts :=w.downTracks[l].Load()if dts == nil{continue}for _, dt :=range dts.([]*DownTrack) {_ = dt.SwitchSpatialLayer(int32(targetLayer), false)}}}//是否開啟大小流if w.isSimulcast {//如果配置最佳質量,則等到f層到來時,訂閱它if bestQualityFirst &&(!w.available[2].get() || layer == 2) {subBestQuality(layer)//如果配置最差質量,則等到q層到來時,訂閱它} else if!bestQualityFirst && (!w.available[0].get() ||layer == 0) {subLowestQuality(layer)}}//啟動讀寫流程go w.writeRTP(layer) }

真正的收發包流程來了:

func (w *WebRTCReceiver) writeRTP(layer int) {defer func() {//這里設置自動清理函數w.closeOnce.Do(func() {w.closed.set(true)w.closeTracks()})}()//創建一個PLI包,后邊要用pli := []rtcp.Packet{&rtcp.PictureLossIndication{SenderSSRC:rand.Uint32(), MediaSSRC: w.SSRC(layer)},}for {//這里可以看到,真正讀包是從buffer里讀出來的,正是前邊講到的自定義bufferpkt, err :=w.buffers[layer].ReadExtended()if err ==io.EOF {return}//如果開啟大小流if w.isSimulcast {//一開始是pending狀態ifw.pending[layer].get() {//如果收到的包是關鍵幀ifpkt.KeyFrame {w.Lock()//如果有切換中的layer,那就切一下for idx,dt := range w.pendingTracks[layer] {w.deleteDownTrack(dt.CurrentSpatialLayer(), dt.peerID)w.storeDownTrack(layer, dt)dt.SwitchSpatialLayerDone(int32(layer))w.pendingTracks[layer][idx] = nil}w.pendingTracks[layer] = w.pendingTracks[layer][:0]w.pending[layer].set(false)w.Unlock()} else {//如果是非關鍵字,說明需要發送PLIw.SendRTCP(pli)}}}//這里是不是有疑問,[]*downTracks是SessionLocal.Publish里塞過來的,后邊會介紹:)for _, dt := rangew.downTracks[layer].Load().([]*DownTrack){//下行track寫入rtp包if err = dt.WriteRTP(pkt, layer);err != nil {if err ==io.EOF && err == io.ErrClosedPipe {w.Lock()w.deleteDownTrack(layer, dt.id)w.Unlock()}log.Error().Err(err).Str("id", dt.id).Msg("Errorwriting to down track")}}}}

至此一個簡單的Simulcast收發模型:

SFU--->WebRTCReceiver(audio).buffer[0].ReadExtended---->downTracks[0][0].WriteRTP->SDK| |....| |--->downTracks[0][N].WriteRTP||---->WebRTCReceiver(video).buffer[0].ReadExtended---->downTracks[0][0].WriteRTP| |....| |---->downTracks[0][N].WriteRTP||------------->buffer[1].ReadExtended---->downTracks[1][0].WriteRTP| |....| |----->downTracks[1][N].WriteRTP||------------->buffer[2].ReadExtended---->downTracks[2][0].WriteRTP|....|------>downTracks[2][N].WriteRTP

上面省略了SDK--->ReadStreamSRTP.buffer.Write,這個buffer和WebRTCReceiver.buffer是同一個。

訂閱端SDK的切大小流操作,其實就是在0-2來回掛載downTrack而已。

4.Simulcast下行流程

讀者前邊的疑問,downTracks是哪里塞過來的?流程在這里:

OnTrack--->SessionLocal.Publish--->router.AddDownTracks--->router.AddDownTrack--->WebRTCReceiver.AddDownTrack--->WebRTCReceiver.storeDownTrack

pc.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver){//Simulcast一般會觸發OnTrack四次,一個audio,三個video//由于三個video的trackId一樣,共用一個WebRTCReceiverr, pub := p.router.AddReceiver(receiver,track)if pub {//這里video到來的第一次pub才為true//這里把receiver發布到router里,其他peer的downtrack會掛載到receiver下p.session.Publish(p.router, r)

這里為了方便,再貼一下整個流程的代碼,比較繁瑣,可以跳過。

SessionLocal.Publish

func (s *SessionLocal) Publish(router Router,r Receiver) {for _, p := ranges.Peers() {// Don't sub toselfif router.ID() == p.ID() || p.Subscriber() == nil{continue}//表示根據r的信息創建downtrack,并增加到p.Subscriber()和r中if err :=router.AddDownTracks(p.Subscriber(), r); err !=nil {Logger.Error(err, "Errorsubscribing transport to Router")continue}} }

router.AddDownTracks

func (r *router) AddDownTracks(s *Subscriber,recv Receiver) error { 。。。 //如果recv不為空,表示根據recv的信息創建downtrack,并增加到s和recv中if recv != nil{if _, err :=r.AddDownTrack(s, recv); err != nil {return err}s.negotiate()return nil} //如果recv為空,表示遍歷房間中所有的receivers,并增加到s和recv中if len(r.receivers)> 0 {for _, rcv := ranger.receivers {if _, err :=r.AddDownTrack(s, rcv); err != nil {return err}}s.negotiate()}return nil }

router.AddDownTrack

根據recv的信息創建downtrack,并增加到sub和recv中。

func (r *router) AddDownTrack(sub *Subscriber,recv Receiver) (*DownTrack, error) {for _, dt := rangesub.GetDownTracks(recv.StreamID()) {//避免重復添加if dt.ID() ==recv.TrackID() {return dt, nil}}codec := recv.Codec()if err := sub.me.RegisterCodec(codec, recv.Kind()); err !=nil {return nil,err}//創建downtrack,downtrack用來給客戶端下發流downTrack, err := NewDownTrack(webrtc.RTPCodecCapability{MimeType: codec.MimeType,ClockRate: codec.ClockRate,Channels: codec.Channels,SDPFmtpLine: codec.SDPFmtpLine,RTCPFeedback:[]webrtc.RTCPFeedback{{"goog-remb", ""}, {"nack", ""}, {"nack", "pli"}},}, recv, r.bufferFactory,sub.id, r.config.MaxPacketTrack)if err != nil{return nil,err}//把downtrack增加到pc中if downTrack.transceiver,err = sub.pc.AddTransceiverFromTrack(downTrack,webrtc.RTPTransceiverInit{Direction:webrtc.RTPTransceiverDirectionSendonly,}); err != nil {return nil,err}// 設置關閉回調,關閉時pc自動刪除trackdownTrack.OnCloseHandler(func() {if sub.pc.ConnectionState() !=webrtc.PeerConnectionStateClosed {if err :=sub.pc.RemoveTrack(downTrack.transceiver.Sender()); err !=nil {if err ==webrtc.ErrConnectionClosed {return}Logger.Error(err, "Errorclosing down track")} else {//如果刪除成功,再從sub中刪除,然后重協商sub.RemoveDownTrack(recv.StreamID(), downTrack)sub.negotiate()}}})//設置OnBind回調,DownTrack.Bind()里會調用這個;PC協商完成時,DownTrack.Bind()會觸發downTrack.OnBind(func() {go sub.sendStreamDownTracksReports(recv.StreamID())})//增加downTrack到sub中,sub只是用來管理downtracks和生成SenderReport等sub.AddDownTrack(recv.StreamID(), downTrack)//增加downTrack到WebRTCReceiver中,實際收發包是WebRTCReceiver來控制,在writeRTP中recv.AddDownTrack(downTrack,r.config.Simulcast.BestQualityFirst)return downTrack, nil }

5.Simulcast切換流程

第一種,自動切換。

上邊的subBestQuality,會在f層receiver到來時,自動訂閱f層。

第二種,手動切換。

通過信令或datachannel控制來切換。

先來講一下datachannel信令通道,在main里創建了一個內置dc,處理函數為datachannel.SubscriberAPI。

func main() {nsfu := sfu.NewSFU(conf.Config)dc :=nsfu.NewDatachannel(sfu.APIChannelLabel)dc.Use(datachannel.SubscriberAPI)s :=server.NewWrapperedGRPCWebServer(options, nsfu)if err := s.Serve(); err != nil{logger.Error(err,"failed to serve")os.Exit(1)}select {} }

客戶端發過來的切大小流指令會進入此函數。

funcSubscriberAPI(nextsfu.MessageProcessor) sfu.MessageProcessor {return sfu.ProcessFunc(func(ctxcontext.Context, args sfu.ProcessArgs) {srm := &setRemoteMedia{}if err :=json.Unmarshal(args.Message.Data, srm); err != nil {return}// Publisherchanging active layersif srm.Layers !=nil && len(srm.Layers) > 0 { 。。。//當前sdk邏輯不會進入這里} else {//按流ID查找downTracksdownTracks :=args.Peer.Subscriber().GetDownTracks(srm.StreamID)for _, dt :=range downTracks {switch dt.Kind() {casewebrtc.RTPCodecTypeAudio:dt.Mute(!srm.Audio)//音頻是否需要mute/unmutecasewebrtc.RTPCodecTypeVideo:switchsrm.Video {//視頻是否需要切大小流/mutecasehighValue://這里把d.reSync.set設置為true了,writeSimulcastRTP里會自動發PLIdt.Mute(false)dt.SwitchSpatialLayer(2, true)casemediumValue:dt.Mute(false)dt.SwitchSpatialLayer(1, true)caselowValue:dt.Mute(false)dt.SwitchSpatialLayer(0, true)casemutedValue:dt.Mute(true)}switchsrm.Framerate {//當前sdk邏輯也不會進入這里,srm.Framerate=""}}}}next.Process(ctx, args)}) }

DownTrack.SwitchSpatialLayer

func (d *DownTrack) SwitchSpatialLayer(targetLayer int32, setAsMax bool) error {if d.trackType ==SimulcastDownTrack {// Don't switchuntil previous switch is done or canceledcsl := atomic.LoadInt32(&d.currentSpatialLayer)//如果當前運行layer不是正在切的layer,或當前layer是要切的//換句話說,如果當前layer沒切完成,或者當前layer和要切的一樣,那就返回錯誤if csl !=atomic.LoadInt32(&d.targetSpatialLayer) || csl ==targetLayer {returnErrSpatialLayerBusy}//切換layerif err :=d.receiver.SwitchDownTrack(d, int(targetLayer));err == nil {atomic.StoreInt32(&d.targetSpatialLayer,targetLayer)if setAsMax {atomic.StoreInt32(&d.maxSpatialLayer,targetLayer)}}return nil}returnErrSpatialNotSupported }

WebRTCReceiver.SwitchDownTrack

func (w *WebRTCReceiver) SwitchDownTrack(track *DownTrack,layer int) error {if w.closed.get() {returnerrNoReceiverFound}//切換就是把track放入pendingif w.available[layer].get() {w.Lock()w.pending[layer].set(true)w.pendingTracks[layer] = append(w.pendingTracks[layer],track)w.Unlock()return nil}return errNoReceiverFound }

然后在writeRTP里切換:

func (w *WebRTCReceiver) writeRTP(layer int) { ....for {pkt, err :=w.buffers[layer].ReadExtended()if err ==io.EOF {return}//如果是大小流if w.isSimulcast {//如果正在切換,pending[layer]get()為trueifw.pending[layer].get() {// 如果是關鍵幀,才會切換,好在前邊Mute流程里發送了PLI,這里應該很快來一個關鍵幀ifpkt.KeyFrame {w.Lock()//=========這里切換for idx, dt:= range w.pendingTracks[layer] {//刪除原來的w.deleteDownTrack(dt.CurrentSpatialLayer(), dt.peerID)//存儲新的dt,以后writeRTP會寫入新的dtw.storeDownTrack(layer, dt)//設置切換完成dt.SwitchSpatialLayerDone(int32(layer))//pending中此dt置空w.pendingTracks[layer][idx] = nil}//清空pendingTracks此layerw.pendingTracks[layer] = w.pendingTracks[layer][:0]//標志位置為falsew.pending[layer].set(false)w.Unlock()} else {// 如果不是關鍵幀,再次發送PLIw.SendRTCP(pli)}}}for _, dt := rangew.downTracks[layer].Load().([]*DownTrack){if err = dt.WriteRTP(pkt, layer);err != nil {if err ==io.EOF && err == io.ErrClosedPipe {w.Lock()w.deleteDownTrack(layer, dt.id)w.Unlock()}log.Error().Err(err).Str("id", dt.id).Msg("Errorwriting to down track")}}} }

6. 總結

Simulcast在ion-sfu中,默認是通過datachannel來操作切換的。

首先,切換是操作pendingTracks:

SubscriberAPI---》dt.SwitchSpatialLayer-->WebRTCReceiver.SwitchDownTrack--->寫入pendingTracks

然后,在WebRTCReceiver.writeRTP里進行實質切換:

WebRTCReceiver.writeRTP--->讀取pendingTracks---》更換downTracks--》storeDownTrack--》OK

之后,寫包就會寫入新track。至此一個簡單的Simulcast收發模型就建成了:

SDK---SFU--->WebRTCReceiver(audio).buffer[0].ReadExtended---->downTracks[0][0].WriteRTP->SDK| |....| |--->downTracks[0][N].WriteRTP||---->WebRTCReceiver(video).buffer[0].ReadExtended---->downTracks[0][0].WriteRTP| |....| |---->downTracks[0][N].WriteRTP||------------->buffer[1].ReadExtended---->downTracks[1][0].WriteRTP| |....| |----->downTracks[1][N].WriteRTP||------------->buffer[2].ReadExtended---->downTracks[2][0].WriteRTP|....|------>downTracks[2][N].WriteRTP

作者簡介:

王朋闖:前百度RTN資深工程師,前金山云RTC技術專家,前VIPKID流媒體架構師,ION開源項目發起人。

特別說明:

本文發布于知乎,已獲得作者授權轉載。


講師招募

LiveVideoStackCon 2022 音視頻技術大會 上海站,正在面向社會公開招募講師,無論你所處的公司大小,title高低,老鳥還是菜鳥,只要你的內容對技術人有幫助,其他都是次要的。歡迎通過?speaker@livevideostack.com?提交個人資料及議題描述,我們將會在24小時內給予反饋。

喜歡我們的內容就點個“在看”吧!

總結

以上是生活随笔為你收集整理的大话ion系列(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久精品国产一区二区三区 | 特级毛片在线免费观看 | 中文字幕在线观看一区二区 | 欧美日韩aa| 国产无套精品久久久久久 | 亚洲精品久久久久中文字幕m男 | 欧美a级在线| 91视频在线免费看 | 成人在线免费观看网站 | 国产91欧美 | 深夜视频久久 | 狠狠操狠狠干天天操 | 91字幕 | 国产xxxx做受性欧美88 | 三级黄色在线 | 在线а√天堂中文官网 | 色婷婷精品大在线视频 | 18女毛片 | 欧美国产日韩一区二区三区 | 久久美女高清视频 | 欧美视屏一区二区 | 色多视频在线观看 | 97视频在线观看播放 | 久久久精品一区二区三区 | 91自拍视频在线观看 | 国产99久久久久 | 色婷婷激情四射 | 久草在线国产 | 91视频大全 | 久草国产在线 | 99午夜| 最新日韩在线观看 | 在线免费性生活片 | 91精品秘密在线观看 | 亚洲精品在| 日本中文字幕久久 | 日本黄色免费播放 | 最新国产中文字幕 | 伊人久久婷婷 | 亚洲精品456在线播放乱码 | 日韩成人邪恶影片 | www日韩高清 | 久久久亚洲网站 | www.在线观看av | 国产精品大尺度 | www黄免费| 亚洲激情综合 | 中文字幕精品在线 | 人人干干人人 | 91精品视频观看 | 麻豆免费视频 | 中文在线a√在线 | 98精品国产自产在线观看 | 色综合激情网 | 五月亚洲综合 | 天天操婷婷 | 激情综合久久 | 天天色天天骑天天射 | 国产黄色精品网站 | 亚洲丝袜一区二区 | 日本久久免费视频 | 免费观看成人av | 一区二区 精品 | 久久色网站 | 国产精品久久久久久久午夜片 | 超碰人人草 | 大型av综合网站 | 欧美精品国产综合久久 | 96精品高清视频在线观看软件特色 | 日日干天夜夜 | 国产精彩视频一区二区 | 91av在线免费观看 | 国产亚洲免费观看 | 美女网站视频色 | 亚洲精品美女久久久久 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 欧美福利网址 | 99视频黄 | 国产精品中文字幕在线播放 | 五月婷婷开心 | 国产又粗又猛又色又黄网站 | 国产成人免费高清 | 亚洲激情 欧美激情 | 欧美一级裸体视频 | 国产精品嫩草影院9 | 欧美在线a视频 | 中日韩三级视频 | 国产综合在线观看视频 | 超碰免费久久 | 日韩黄色软件 | 开心激情五月网 | 色开心| 在线观看中文字幕dvd播放 | 欧美日韩一区二区三区视频 | 久久久久久久久久久久久久av | 亚洲国产av精品毛片鲁大师 | 中文字幕在线观看网址 | 亚洲国产成人av网 | 欧美一区二区三区在线播放 | 国产精品手机在线播放 | 久久99亚洲热视 | 国产a免费 | 欧美日韩不卡在线 | 色资源在线观看 | 在线观看免费版高清版 | 亚洲最新av在线网站 | 超碰人人在 | 波多野结衣小视频 | 国产成人福利在线观看 | 国产视频综合在线 | 国产中文字幕网 | 中文电影网 | 射久久久 | 欧美性黄网官网 | 亚洲在线a| 91九色在线播放 | 四虎影视成人精品 | 久久免费视频在线 | 激情五月激情综合网 | 婷婷在线视频 | 精品一区二区亚洲 | 人人干人人爽 | 美女黄频网站 | 免费日韩 精品中文字幕视频在线 | 国产网站av| 国产精品黄色 | 国产黄免费在线观看 | 久久激情五月丁香伊人 | av中文国产 | 亚洲在线网址 | 亚洲h在线播放在线观看h | 亚洲精品国产片 | 久久人人做| 亚洲一区二区视频在线 | 在线播放第一页 | 欧美少妇xxx| 国产亚州av| bbb搡bbb爽爽爽 | 一区二区三区精品在线视频 | 豆豆色资源网xfplay | 亚洲免费永久精品国产 | 国产精品综合久久 | 亚洲精品美女视频 | 人人爱爱人人 | 国产亚洲精品久久19p | 久久特级毛片 | 免费看色网站 | 国产在线看 | 亚洲干视频在线观看 | 视频福利在线观看 | 婷婷丁香五 | 国产精品一区二区精品视频免费看 | 97超碰国产在线 | 97超碰人人澡人人爱 | 国产伦精品一区二区三区无广告 | 中文一二区 | 337p日本大胆噜噜噜噜 | 日韩理论视频 | 99精品视频播放 | 欧美aa在线 | 精品国产99 | 正在播放五月婷婷狠狠干 | 黄色三级网站 | 91av99| 婷婷深爱五月 | 最近中文字幕在线中文高清版 | 国产色久 | 亚洲精品在线观 | 国产成人性色生活片 | 岛国av在线不卡 | 久久免费的精品国产v∧ | zzijzzij日本成熟少妇 | 精品国产乱码久久久久久1区2匹 | 久99久精品视频免费观看 | 色综合网在线 | 91chinesexxx| 99热这里| 91麻豆国产福利在线观看 | 人人草在线观看 | 天天色婷婷 | 亚洲情影院 | 免费黄色一区 | adn—256中文在线观看 | 日韩电影在线观看一区二区三区 | 免费的黄色的网站 | 99久久精品免费看国产四区 | 久久免费国产电影 | 9i看片成人免费看片 | 一区二区三区高清在线 | 毛片网站免费在线观看 | 五月天综合网 | 一级精品视频在线观看宜春院 | 手机在线欧美 | 国产999精品久久久久久麻豆 | 欧美日韩大片在线观看 | 国产高清中文字幕 | 久久久影视 | 91香蕉亚洲精品 | 日本久久99 | 色综合久 | 高清久久久 | 成人va天堂 | 国内精品久久久久久久影视麻豆 | 最近更新的中文字幕 | 免费成人黄色 | 久久免费国产精品1 | 伊人亚洲综合 | 国产在线播放一区 | 日韩精品视频在线观看免费 | 久久最新| 亚洲精品h | 国产精品一区二区三区久久 | av在线专区| 午夜久久影院 | 精品 激情 | 五月婷婷影视 | 亚洲开心激情 | 国产精品美女久久久久久 | 精品专区一区二区 | 丁香花在线视频观看免费 | 中文字幕免费高清 | 黄色三级网站 | 99午夜| 99久久久久久久久久 | 国产精久久久久久久 | 夜色资源站wwwcom | 在线日本看片免费人成视久网 | 国产精品久久综合 | 久久香蕉一区 | 亚洲精品在线视频 | 国产玖玖在线 | 国产成人精品在线 | 日韩电影久久久 | 91九色视频在线 | 国内丰满少妇猛烈精品播 | 丁香婷婷综合激情五月色 | 久久久久国产精品厨房 | 亚洲免费av在线播放 | 成人毛片100免费观看 | 成人久久免费 | 91色蜜桃| 亚洲国产精品视频在线观看 | 国产精品久久久久久久午夜片 | free. 性欧美.com | 在线看国产一区 | 欧美一级免费 | 国产黄免费在线观看 | 日韩精品在线看 | 午夜精品电影一区二区在线 | 国产精品系列在线观看 | 超碰97成人 | 97电影在线观看 | 色婷婷综合久色 | 色狠狠久久av五月综合 | 日韩欧美在线观看 | 亚洲国产影院 | 中文字幕一区二区三区四区久久 | 五月开心婷婷 | 久久福利| 999成人| 国产精品高清免费在线观看 | 国产精品九九久久99视频 | 亚洲精品乱码久久久久久高潮 | 天堂资源在线观看视频 | 中文字幕乱码电影 | 成人免费网站在线观看 | 日韩视频免费 | 免费看的黄色 | 五月婷婷另类国产 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美激情片在线观看 | 婷婷久久一区二区三区 | 久久人视频 | 亚洲丝袜中文 | 美女网站在线 | 国产美女视频一区 | 欧美在线观看视频 | 激情自拍av| 69视频网站 | 国产视频日韩视频欧美视频 | 国产亚洲精品久久久久久久久久久久 | 99精品久久久 | 日韩美在线 | 日本爽妇网| 国产五十路毛片 | 在线视频18在线视频4k | 亚洲电影毛片 | 在线观看深夜视频 | 国产福利91精品一区二区三区 | 在线观影网站 | 天天色综合天天 | 九九免费在线看完整版 | 成人黄色在线观看视频 | 99久免费精品视频在线观看 | 精品国产一区二区三区久久久 | 日韩免费观看一区二区三区 | 免费a v观看 | 九九热视频在线播放 | 黄色免费大片 | 五月婷婷一区 | 久精品视频在线观看 | 有码中文字幕在线观看 | 国产韩国精品一区二区三区 | 亚洲一区免费在线 | 免费av片在线 | 国产精品一区二区三区电影 | 国产精品综合久久 | 操操操日日 | 亚洲视频一区二区三区在线观看 | 日韩午夜一级片 | 亚洲免费成人 | 色综合天天色综合 | 九九视频免费在线观看 | av在线看网站 | 美女视频久久久 | 亚洲精品美女在线观看播放 | 天天搞天天 | 日韩免费在线看 | 在线国产福利 | 人人网人人爽 | 韩国av电影网| 欧美日韩在线精品 | 国产中文字幕一区二区三区 | av手机版 | 国产一区在线播放 | 久久精品视频播放 | 国产一区二区在线免费视频 | 久久大片 | 91看片在线免费观看 | 日韩一级电影在线 | 日本精品视频一区二区 | 精品福利网站 | 亚洲激精日韩激精欧美精品 | 色网站视频 | 福利视频网址 | 午夜视频在线瓜伦 | 99久久精品国产免费看不卡 | 麻豆免费视频网站 | 日韩中文字幕一区 | 免费成人av在线看 | 欧美在线a视频 | 在线免费观看视频 | 99久久综合国产精品二区 | 9ⅰ精品久久久久久久久中文字幕 | 国产青春久久久国产毛片 | 欧美国产精品一区二区 | 最近中文字幕高清字幕免费mv | 天堂久久电影网 | 午夜av免费在线观看 | 国产精品久久毛片 | 黄色精品视频 | 久久午夜国产精品 | 在线观看精品一区 | 国产淫a| 福利av在线| 国产香蕉视频 | 在线观看国产成人av片 | 99久久精品免费看 | 亚洲午夜电影网 | 黄a在线观看 | 亚洲精品黄网站 | 高清av免费观看 | 91影视成人 | 亚洲综合欧美日韩狠狠色 | 日韩免费福利 | 九九久久视频 | 美女网站视频一区 | 午夜av一区二区三区 | 欧美黄色免费 | 精品国产_亚洲人成在线 | 久久成人精品视频 | 日韩色在线 | 午夜av免费在线观看 | 免费在线一区二区 | 国产亚洲综合精品 | 综合在线观看 | 91在线公开视频 | 尤物97国产精品久久精品国产 | 久久1电影院 | 久久激情视频 久久 | 日日干干 | 黄色最新网址 | 黄色精品久久久 | 免费a网| av福利在线看 | 国产精品一区电影 | 亚洲激情视频在线观看 | 国产精品免费久久久久久久久久中文 | 欧美天天综合 | 日韩xxxx视频| 超碰在线97国产 | 又黄又刺激视频 | 伊人久久av | 久久 国产一区 | 日韩成人高清在线 | 婷婷色在线播放 | 伊人久久婷婷 | 特级毛片爽www免费版 | 久久手机精品视频 | 91九色成人蝌蚪首页 | 欧美日韩一区二区免费在线观看 | 免费麻豆网站 | 久久精品视频观看 | 精品久久久久一区二区国产 | 天天av在线播放 | 久草免费福利在线观看 | 日韩高清dvd | 久久97超碰 | 夜色资源网 | 久精品在线观看 | 人人爽人人爽人人爽人人爽 | 国产午夜精品一区二区三区四区 | 911久久 | 亚洲精品免费在线观看 | 中文不卡视频 | 成人黄色小说网 | 麻豆视频国产在线观看 | 狠狠操精品 | 在线电影a | 九九久久精品 | 国产精品久久久一区二区三区网站 | 国产精品久久久久久久久久妇女 | 亚洲精品久久久久中文字幕二区 | 亚州人成在线播放 | 国产精品久久二区 | 久久精品国产亚洲a | 国产精品久久久久久一二三四五 | 亚洲午夜精品久久久久久久久久久久 | 国产精品久久久久久婷婷天堂 | 国产在线观看99 | 一级片免费视频 | 久久久免费高清视频 | 久久综合九色综合欧美就去吻 | 欧美日韩91 | a√天堂资源| 黄色av高清| 亚洲成a人片在线www | 国产精品观看在线亚洲人成网 | 中文字幕一区二区三区在线观看 | 欧美激情第28页 | 亚洲激情在线观看 | 中文字幕黄色网 | 人人干人人搞 | 国产综合精品久久 | 91视频电影 | 国产黄色片免费看 | 亚洲禁18久人片 | 日韩在线视频一区 | 最新日韩在线观看 | 亚洲欧美久久 | 国产v在线播放 | 国产91免费在线观看 | 久草免费色站 | 国产在线观看你懂得 | 国产高清av免费在线观看 | 一级黄色免费网站 | 免费高清在线观看成人 | 久草在线最新视频 | 国产不卡视频在线 | 国产精品视频永久免费播放 | 九月婷婷人人澡人人添人人爽 | 天天综合网久久 | 国产精品电影在线 | 亚洲国产免费看 | av一级网站| 欧美日韩久久久 | 狠狠的操你| 欧美午夜精品久久久久久浪潮 | 国产伦理久久精品久久久久_ | 日韩视频免费在线观看 | 国产高清不卡一区二区三区 | 国产r级在线观看 | 日本中文字幕高清 | 日韩欧美电影 | 91久久国产自产拍夜夜嗨 | av网址在线播放 | 国产精品久久久久久久久久免费 | 国内精品久久久久久久 | 天天干天天做 | 久草精品视频在线观看 | 欧美先锋影音 | 欧美一区二区三区在线观看 | 欧美精品久久久久久久久久 | 丁香婷婷综合网 | 99国产一区二区三精品乱码 | 日韩高清网站 | 狠狠色丁香久久婷婷综合_中 | 综合色影院| 久久精品99精品国产香蕉 | 欧美色888| 久久综合狠狠综合久久激情 | 国内精品久久久久久 | 日韩在线欧美在线 | 久草男人天堂 | 91在线视频播放 | 国产精品免费视频观看 | 国产一级二级在线观看 | 免费观看91视频 | 国产精品18久久久 | av免费播放| 婷婷五综合 | 久久免费在线视频 | 园产精品久久久久久久7电影 | 国产麻豆精品传媒av国产下载 | 免费视频二区 | 国产精品国产精品 | 成人免费视频免费观看 | 国产一区二区三区网站 | 国产成人一区二区三区在线观看 | 天天插天天操天天干 | 国产视频一二三 | 黄色大片免费网站 | 成人永久免费 | 97精品国产aⅴ | 亚洲另类视频在线 | 中文字幕日韩高清 | 又黄又刺激 | 国产 在线观看 | 视频在线亚洲 | 亚洲综合激情网 | 91在线产啪| 日日摸日日添日日躁av | 国产在线观看一区 | 中文字幕在线观看免费观看 | 日韩国产精品一区 | 国产特黄色片 | 欧美激情第一页xxx 午夜性福利 | 国产91小视频 | 在线视频国产区 | 免费视频二区 | 热99在线视频 | 精品一区中文字幕 | 香蕉视频久久久 | 国产一级片在线播放 | 国产精品美女在线观看 | 国产精品久久久久aaaa九色 | 亚洲国产福利视频 | 又色又爽又黄高潮的免费视频 | 日b视频国产 | 精品电影一区二区 | 91久久国产综合精品女同国语 | 欧美午夜a | 国内外成人在线 | 国产99爱 | 日韩免费成人 | 欧美极品少妇xbxb性爽爽视频 | 亚洲在线日韩 | 日韩av成人 | 成年人在线观看视频免费 | 日韩免费看视频 | 国产精品日韩精品 | 免费看v片 | 国产一级免费观看 | 韩国av一区二区三区在线观看 | 欧美日韩破处 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 就操操久久| 黄色在线视频网址 | 亚洲成人资源网 | 天天躁天天狠天天透 | 伊人电影在线观看 | 五月天六月婷 | 国内精品国产三级国产aⅴ久 | 欧洲高潮三级做爰 | 91.dizhi永久地址最新 | 91视频免费播放 | a色视频 | 国产精品久久久久毛片大屁完整版 | 成人免费大片黄在线播放 | 亚洲成人av电影在线 | 国产二区精品 | 叶爱av在线| 色婷婷伊人 | 欧美一区视频 | 国产一区二区在线免费播放 | 国产一区二区精品久久91 | 日韩在线视频一区 | 久久九九久久九九 | 黄色a三级| 国产又粗又长又硬免费视频 | 久久久久综合精品福利啪啪 | 黄色在线观看www | 国产福利一区二区三区在线观看 | 久久综合久久综合这里只有精品 | 久久久精华网 | 日韩精品中文字幕有码 | 国产中文字幕一区 | 精品福利在线视频 | 黄色免费在线看 | 丁香激情综合久久伊人久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲成人黄色在线观看 | 亚洲国产午夜精品 | 久久久久久久久久网 | 午夜免费在线观看 | 黄色一级网| 国产精品中文字幕在线 | 97在线观看免费高清完整版在线观看 | 伊人天天干| 国产综合91| 亚洲成人一区 | 日韩在线观看a | 国产在线国偷精品产拍 | 久久国产品 | 视频直播国产精品 | 国产精品久久久久久五月尺 | 国产高清视频免费观看 | 国产成人av一区二区三区在线观看 | 四虎伊人 | 992tv成人免费看片 | 九色精品免费永久在线 | 91在线观看视频网站 | 精品福利网站 | 99久热在线精品视频观看 | 91九色视频导航 | 国产亚洲激情视频在线 | 久久婷婷一区二区三区 | 伊人电影天堂 | 亚洲精品国 | 日韩中文字幕免费看 | 亚洲女欲精品久久久久久久18 | 中文字幕在线国产精品 | 99久久综合国产精品二区 | 色婷婷狠狠五月综合天色拍 | 中文字幕乱码电影 | 狠狠干综合 | 91免费国产在线观看 | 天堂av在线免费观看 | 欧美日韩午夜爽爽 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品 日韩 | 久草视频在线新免费 | 欧美日韩国产一区二区在线观看 | 亚洲一级国产 | 99免费在线观看视频 | 日韩大陆欧美高清视频区 | av福利在线看 | 亚洲国产精久久久久久久 | 一区二区三区观看 | 欧美日韩一级在线 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 成人久久毛片 | 国产精品免费视频久久久 | 91试看 | 色综合久久久久综合99 | 日韩激情视频 | 一区二区精品国产 | 国产激情电影综合在线看 | 午夜少妇一区二区三区 | 成人国产精品免费观看 | 欧美在线视频第一页 | 91精品视频免费观看 | 日韩狠狠操 | 99热官网 | 成年人免费看片 | 婷婷网站天天婷婷网站 | 国产午夜三级一区二区三桃花影视 | 国产精品一区免费在线观看 | 国产高清视频在线播放 | 国产91在线 | 美洲 | 日韩精品久久中文字幕 | 久久草草影视免费网 | 亚洲综合成人婷婷小说 | 欧美一区在线观看视频 | 久久亚洲欧美日韩精品专区 | 黄色成人av | 国产美女精品人人做人人爽 | 久草香蕉在线 | 激情在线免费视频 | 亚州人成在线播放 | 美女精品网站 | 波多野结衣网址 | 日韩有色 | 国产精品白虎 | 亚洲成人午夜av | 欧美午夜精品久久久久 | 欧美极品少妇xbxb性爽爽视频 | 91精品小视频 | a级片在线播放 | 在线观看www. | 国产精品男女视频 | 日韩在线观看一区二区三区 | 亚洲人在线视频 | 久久伦理电影 | 一区二区视频免费在线观看 | 欧美福利网站 | 日韩久久一区二区 | 91麻豆国产福利在线观看 | 热99在线| 婷婷色在线 | 国产黄大片在线观看 | 欧美91视频| 久久夜夜夜 | 国产精品视频在线看 | 亚洲综合黄色 | 黄网站免费久久 | 人人干干人人 | 久久久久久久久久久久电影 | 中文字幕一区二区三区视频 | 91丨九色丨国产丨porny精品 | 日韩av片无码一区二区不卡电影 | 国产精品18久久久久久不卡孕妇 | 色九九视频 | 国产中文字幕一区二区 | 久久国产视频网站 | 国产精品二区在线 | 日韩精品久久中文字幕 | 欧美少妇xxx | 又湿又紧又大又爽a视频国产 | 久草在线久| 激情在线网站 | 久久99精品久久久久婷婷 | 91久久精品日日躁夜夜躁国产 | 亚洲欧洲精品视频 | 黄色免费av | 激情丁香综合五月 | 久久精品国产精品亚洲精品 | 色综合亚洲精品激情狠狠 | 国产在线观看91 | 一区 二区电影免费在线观看 | 国产色女人 | 日韩精品一区二区三区三炮视频 | 色婷婷av一区 | 91试看| 中国一级片视频 | 97超碰成人在线 | 69亚洲精品 | 国产一级片一区二区三区 | www.夜色321.com | 91av欧美| 欧美少妇xx| 操久在线| 97超碰在线久草超碰在线观看 | 天堂网在线视频 | 综合黄色网 | 麻豆国产视频下载 | 国产精品v欧美精品v日韩 | 亚洲成aⅴ人在线观看 | 久久久久久免费毛片精品 | 中文字幕亚洲欧美日韩2019 | 中文字幕在线资源 | 国产精品九九九九九九 | 在线免费观看黄色 | 日韩黄色在线观看 | 欧美日韩三级在线观看 | 国产麻豆剧传媒免费观看 | 精品国产一二三 | 国产成人免费在线 | 激情狠狠干 | 成人a视频 | 日韩av手机在线观看 | www.888av| 国产亚洲精品久久久久动 | 成人精品影视 | 人人藻人人澡人人爽 | 18女毛片 | 视频一区在线免费观看 | 亚洲精品久久激情国产片 | 一二三区av | 日韩av综合网站 | 91av影视| 天天曰视频 | 国内精品美女在线观看 | 国产裸体视频bbbbb | 久久 国产一区 | 国产亚洲激情视频在线 | 成年人免费看的视频 | 丁香视频全集免费观看 | 92国产精品久久久久首页 | 国产免费视频一区二区裸体 | 8x成人在线 | 国产高清精品在线 | 成人av久久 | 婷婷丁香狠狠爱 | 成人黄色影片在线 | 一级黄色片网站 | 国产精品白丝jk白祙 | 91高清完整版在线观看 | 欧美精品免费视频 | 国产高清中文字幕 | 久久精品第一页 | 欧美成a人片在线观看久 | 97天堂 | 丁香综合激情 | 欧美亚洲免费在线一区 | 久久精品久久精品久久39 | 国产香蕉97碰碰久久人人 | 在线观看免费一级片 | 婷婷久久精品 | 四虎影视精品 | 九九热在线视频免费观看 | 国产91免费在线观看 | 97视频在线观看网址 | 亚洲精品国产欧美在线观看 | 天天曰天天射 | 高清av在线 | 一级全黄毛片 | 欧洲精品视频一区二区 | 右手影院亚洲欧美 | 午夜视频在线观看欧美 | 久久久久国产精品午夜一区 | 久久精品人人做人人综合老师 | 99精品在线视频播放 | 国产 在线观看 | 9在线观看免费 | 亚洲欧美在线综合 | 日韩精品2区 | 天堂av在线中文在线 | 国产精品综合在线观看 | 中文字幕国产亚洲 | av黄在线播放 | 黄色成人av网址 | 国产美女精品 | 日日夜夜干 | 国产丝袜一区二区三区 | 亚洲欧美日韩国产一区二区 | 综合激情网... | 色夜影院 | 中文字幕欲求不满 | 亚洲精品视频www | 欧美成年人在线观看 | 日韩在线第一 | 成人小电影在线看 | 久久久久久久久电影 | 天天操夜 | 91一区啪爱嗯打偷拍欧美 | 国产理论一区二区三区 | 亚洲黄色片 | 麻豆国产网站入口 | 国产精品自产拍在线观看中文 | 久久久久国产一区二区三区四区 | 欧美精品久久久久久久久久丰满 | 91av中文字幕 | 黄色视屏免费在线观看 | 夜夜躁日日躁狠狠久久av | 国产精品视频线看 | 在线97| 97精品久久人人爽人人爽 | 久久国产热视频 | 婷婷精品国产一区二区三区日韩 | www.狠狠色.com | 久久这里只有精品久久 | 丰满少妇在线观看资源站 | av免费观看高清 | 日本中文一级片 | 精品伊人久久久 | 国产精品一区二区免费在线观看 | 99久久婷婷国产一区二区三区 | 日韩羞羞 | 日韩网| 久久av一区二区三区亚洲 | 精品亚洲欧美一区 | 久久一区二区免费视频 | 国产精品18久久久久久vr | 亚洲dvd| 99免在线观看免费视频高清 | 国产97色在线 | 久久国产成人午夜av影院潦草 | 少妇bbbb | 亚洲狠狠丁香婷婷综合久久久 | 免费看黄在线看 | 欧美一级黄大片 | 欧美精品亚洲二区 | 天天干.com| 国产精品久久久 | 日韩剧 | a级免费观看 | 国产日产亚洲精华av | www91在线观看| 国产精品专区h在线观看 | 欧洲亚洲精品 | av中文在线 | 一区精品在线 | 黄色软件在线观看 | 久草在线视频免费资源观看 | 国产三级视频 | 久久91久久久久麻豆精品 | 日日爽天天 | 香蕉蜜桃视频 | 天天射天天射天天 | 麻豆视频在线免费看 | 涩五月婷婷 | 亚洲 欧美 日韩 综合 | 999视频精品 | 成人免费观看网站 | 久久精品成人欧美大片古装 | 天天综合天天做天天综合 | 久久精品一区二区 | 狠狠五月婷婷 | 成人四虎影院 | 美女网站久久 | 精品一区二区综合 | 色天天| 婷婷久久网站 | 免费视频久久久 | 久久久国产影视 | 色婷婷在线观看视频 | 丁香资源影视免费观看 | 九九热在线观看 | 久久精品国产精品亚洲精品 | 午夜视频在线观看一区 | 91大片网站 | 亚洲精选视频免费看 | 久久精品成人欧美大片古装 | 五月天综合色激情 | av在线永久免费观看 | 免费三级在线 | 久久久五月天 | 成人av久久 | 国产综合在线视频 | 人人插人人草 | 99国内精品久久久久久久 | 天天爱天天色 | 奇米网8888 | 欧美a视频 | 午夜视频导航 | 欧美日韩国产精品一区二区三区 | 亚洲更新最快 | 欧美色图狠狠干 | 日韩久久片 | 亚洲三级网站 | 精品国产1区 | 免费av影视 | 黄色毛片网站在线观看 | av福利网址导航 | 婷婷综合影院 | 欧美在线日韩在线 | 欧美久草视频 | 久久久久婷 | 日韩av电影中文字幕 | 亚洲涩涩网站 | 亚洲国产高清在线 | 日韩欧美精品一区二区 | 国产精品自产拍在线观看网站 | 久草在线视频网站 | 免费观看黄色12片一级视频 | 天堂v中文 | 毛片888| 不卡电影免费在线播放一区 | 99久久精品久久久久久清纯 | 九九av| 久久久久久久久亚洲精品 | 五月婷在线 | 日韩超碰 | 成片免费观看视频999 | 国产福利在线免费观看 | 国产日韩一区在线 | 成人91视频 | 91自拍视频在线观看 | 成年人免费av网站 | 日韩视频在线观看视频 | 免费成人av网站 | 国产精品久久久久久久久久久免费 | 毛片久久久 | 国产精品美女久久久久久久 | 日日操日日干 | 黄色精品一区二区 | 国产一级黄大片 | 亚洲国产成人久久 | 日本久久高清视频 | 中文不卡视频 | 欧美性脚交 | 亚洲国产日韩欧美 | 99久久99视频 | 亚洲视频99| 日韩试看 | 在线免费色 | 国产精品免费视频久久久 | av高清网站在线观看 | 五月色综合 | 香蕉影院在线播放 | 美女视频黄是免费的 | 97精品国产 | 九九免费观看视频 | 国内99视频 | 热re99久久精品国产66热 | 日韩视频一区二区在线 | 久久国产精品99国产精 | av夜夜操 | 2019中文在线观看 | 免费黄色网止 | 日韩一级片观看 | 欧美日韩中 | 天无日天天操天天干 | 欧美日韩免费看 | 国产精品欧美久久久久无广告 | 欧美日韩一区二区久久 | 欧美一级xxxx | 九九爱免费视频在线观看 | a久久久久| 99久久99视频| 国产美女精品 | 久久精品看| 精品国产一区二区三区久久久久久 | 成年人看片网站 | 欧美成天堂网地址 | 国产成人av综合色 | 国产日韩欧美自拍 |