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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

直播推流实现RTMP协议的一些注意事项

發布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 直播推流实现RTMP协议的一些注意事项 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

018年8月4日第三次更新,詳細介紹了RTMP協議與遇到的坑,另外純Java重寫了RTMP協議,做了個Android 推流項目,包含安卓相機采集,編碼和RTMP推流,上傳到github了。
項目地址:https://github.com/gezhaoyou/SimpleLivePublisherLite
參考文章:

  • Android 直播推流簡介: https://www.jianshu.com/p/0318ff29ac32
  • 帶你吃透RTMP:http://mingyangshang.github.io/2016/03/06/RTMP%E5%8D%8F%E8%AE%AE/
  • :RTMP 協議整理成腦圖,比較清晰,包括rtmp 消息類型,rtmp 分塊chunking,rtmp分塊例子。免費腦圖工具 Xmind 格式,Here Get It

  • rtmp 消息類型

    ?

    Paste_Image.png

  • rtmp 消息分塊

    ?

    Paste_Image.png

  • 1. 簡介

    RTMP協議是Real Time Message Protocol(實時信息傳輸協議)的縮寫,它是由Adobe公司提出的一種應用層的協議,用來解決多媒體數據傳輸流的多路復用(Multiplexing)和分包(packetizing)的問題。隨著VR技術的發展,視頻直播等領域逐漸活躍起來,RTMP作為業內廣泛使用的協議也重新被相關開發者重視起來。本文主要分享對RTMP的一些簡介和實際開發中遇到的一些狀況。

    RTMP協議基本特點:

    ? 基于TCP協議的應用層協議

    ? 默認通信端口1935

    RTMP URL格式:
    rtmp://ip:[port]/appName/streamName
    例如: rtmp://192.168.178.218:1935/live/devzhaoyou

    參考:https://blog.csdn.net/ai2000ai/article/details/72771461

    2. RTMP 握手

    RTMP 握手分為簡單握手和復雜握手,現在Adobe公司使用RTMP協議的產品用復雜握手的較多,不做介紹。

    握手包格式:

    0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ | version | +-+-+-+-+-+-+-+-+C0 and S0 bits

    C0和S0:1個字節,包含了RTMP版本, 當前RTMP協議的版本為 3

    0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time (4 bytes) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | zero (4 bytes) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | random bytes | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | random bytes | | (cont) | | .... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+C1 and S1 bits

    C1和S1:4字節時間戳,4字節的0,1528字節的隨機數

    0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| time (4 bytes) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| time2 (4 bytes) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| random echo |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| random echo || (cont) || .... |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+C2 and S2 bits

    C2和S2:4字節時間戳,4字節從對端讀到的時間戳,1528字節隨機數

    RTMP握手基本過程:

    +-------------+ +-------------+ | Client | TCP/IP Network | Server | +-------------+ | +-------------+| | | Uninitialized | Uninitialized| C0 | ||------------------->| C0 || |-------------------->|| C1 | ||------------------->| S0 || |<--------------------|| | S1 |Version sent |<--------------------|| S0 | ||<-------------------| || S1 | ||<-------------------| Version sent| | C1 || |-------------------->|| C2 | ||------------------->| S2 || |<--------------------|Ack sent | Ack Sent| S2 | ||<-------------------| || | C2 || |-------------------->| Handshake Done | Handshake Done| | |Pictorial Representation of Handshake

    握手開始于客戶端發送C0、C1塊。服務器收到C0或C1后發送S0和S1。

    當客戶端收齊S0和S1后,開始發送C2。當服務器收齊C0和C1后,開始發送S2。

    當客戶端和服務器分別收到S2和C2后,握手完成。

    注意事項: 在實際工程應用中,一般是客戶端先將C0, C1塊同時發出,服務器在收到C1 之后同時將S0, S1, S2發給客戶端。S2的內容就是收到的C1塊的內容。之后客戶端收到S1塊,并原樣返回給服務器,簡單握手完成。按照RTMP協議個要求,客戶端需要校驗C1塊的內容和S2塊的內容是否相同,相同的話才徹底完成握手過程,實際編寫程序用一般都不去做校驗。

    RTMP握手的這個過程就是完成了兩件事:

    校驗客戶端和服務器端RTMP協議版本號

    是發了一堆隨機數據,校驗網絡狀況。

    3. RTMP 消息

    RTMP消息格式:

    0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Message Type | Payload length || (1 byte) | (3 bytes) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Timestamp || (4 bytes) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Stream ID || (3 bytes) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Message Header

    ? 1字節消息類型

    ? 3字節負載消息長度

    ? 4字節時間戳

    ? 3字節 Stream ID,區分消息流

    注意事項: 實際RTMP通信中并未按照上述格式去發送RTMP消息,而是將RTMP 消息分塊發送,之后將介紹RTMP消息分塊。

    3.1. RTMP 消息分塊(chunking)

    而對于基于TCP的RTMP協議而言,協議顯得特別繁瑣,但是有沒有更好的替代方案。同時創建RTMP消息分塊是比較復雜的地方,涉及到了AFM(也是Adobe家的東西)格式數據的數據。

    RTMP消息塊格式:

    +--------------+----------------+--------------------+--------------+| Basic Header | Message Header | Extended Timestamp | Chunk Data |+--------------+----------------+--------------------+--------------+| ||<------------------- Chunk Header ----------------->|Chunk Format

    RTMP消息塊構成:

    ? Basic Header

    ? Message Header

    ? Extended Timestamp

    ? Chunk Data

    Chunk Basic header格式有3種:

    格式1:

    0 1 2 3 4 5 6 7+-+-+-+-+-+-+-+-+|fmt| cs id |+-+-+-+-+-+-+-+-+Chunk basic header 1

    格式2:

    0 10 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|fmt| 0 | cs id - 64 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Chunk basic header 2

    格式3:

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|fmt| 1 | cs id - 64 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Chunk basic header 3

    注意事項:

    fmt: 用于指定Chunk Header 里面 Message Header的類型,后面會介紹到

    cs id: 是chunk stream id的縮寫,同一個RTMP消息拆成的 chunk 塊擁有相同的 cs id, 用于區分chunk所屬的RTMP消息, chunk basic header 的類型cs id占用的字節數來確定

    Message Header格式:

    Message Header的類型通過上文chunk basic header中的fmt指定,共4種:

    格式0:

    0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| timestamp | message length|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| message length (cont) |message type id| msg stream id |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| message stream id (cont) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Chunk Message Header - Type 0

    Message Header占用11個字節, 在chunk stream的開始的第一個chunk的時候必須采用這種格式。

    ? timestamp:3個字節,因此它最多能表示到16777215=0xFFFFFF=2^24-1, 當它的值超過這個最大值時,這三個字節都置為1,實際的timestamp會轉存到Extended Timestamp字段中,接受端在判斷timestamp字段24個位都為1時就會去Extended timestamp中解析實際的時間戳。

    ? message length:3個字節,表示實際發送的消息的數據如音頻幀、視頻幀等數據的長度,單位是字節。注意這里是Message的長度,也就是chunk屬于的Message的總數據長度,而不是chunk本身Data的數據的長度。

    ? message type id:1個字節,表示實際發送的數據的類型,如8代表音頻數據、9代表視頻數據。

    ? msg stream id:4個字節,表示該chunk所在的流的ID,和Basic Header的CSID一樣,它采用小端存儲的方式

    格式1:

    0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| timestamp | message length|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| message length (cont) |message type id| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Chunk Message Header - Type 1

    Message Header占用7個字節,省去了表示msg stream id的4個字節,表示此chunk和上一次發的chunk所在的流相同。

    ? timestamp delta:3個字節,注意這里和格式0時不同,存儲的是和上一個chunk的時間差。類似上面提到的timestamp,當它的值超過3個字節所能表示的最大值時,三個字節都置為1,實際的時間戳差值就會轉存到Extended Timestamp字段中,接受端在判斷timestamp delta字段24個位都為1時就會去Extended timestamp中解析時機的與上次時間戳的差值。

    格式2:

    0 1 2 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Chunk Message Header - Type 2

    Message Header占用3個字節,相對于格式1,又省去了表示消息長度的3個字節和表示消息類型的1個字節,表示此chunk和上一次發送的chunk所在的流、消息的長度和消息的類型都相同。余下的這三個字節表示timestamp delta,使用同格式1。

    格式3:

    0字節,它表示這個chunk的Message Header和上一個是完全相同的,無需再次傳送

    Extended Timestamp(擴展時間戳):

    在chunk中會有時間戳timestamp和時間戳差timestamp delta,并且它們不會同時存在,只有這兩者之一大于3個字節能表示的最大數值0xFFFFFF=16777215時,才會用這個字段來表示真正的時間戳,否則這個字段為0。

    擴展時間戳占4個字節,能表示的最大數值就是0xFFFFFFFF=4294967295。當擴展時間戳啟用時,timestamp字段或者timestamp delta要全置為1,表示應該去擴展時間戳字段來提取真正的時間戳或者時間戳差。注意擴展時間戳存儲的是完整值,而不是減去時間戳或者時間戳差的值。

    Chunk Data(塊數據): 用戶層面上真正想要發送的與協議無關的數據,長度在(0,chunkSize]之間, chunk size默認為128字節。

    RTMP 消息分塊注意事項

    ? Chunk Size:

    RTMP是按照chunk size進行分塊,chunk size 指的是 chunk的payload部分的大小,不包括chunk basic header 和 chunk message header長度。客戶端和服務器端各自維護了兩個chunk size, 分別是自身分塊的chunk size 和 對端 的chunk size, 默認的這兩個chunk size都是128字節。通過向對端發送set chunk size 消息可以告知對方更改了 chunk size的大小。

    ? Chunk Type:

    RTMP消息分成的Chunk有4種類型,可以通過 chunk basic header的高兩位(fmt)指定,一般在拆包的時候會把一個RTMP消息拆成以格式0開始的chunk,之后的包拆成格式3 類型的chunk,我查看了有不少代碼也是這樣實現的,這樣也是最簡單的實現。

    如果第二個message和第一個message的message stream ID 相同,并且第二個message的長度也大于了chunk size,那么該如何拆包?當時查了很多資料,都沒有介紹。后來看了一些源碼,如 SRS,FFMPEG中的實現,發現第二個message可以拆成Type_1類型一個chunk, message剩余的部分拆成Type_3類型的chunk。FFMPEG中就是這么做的。

    3.2 RTMP 交互消息

    推流RTMP消息交互流程:

    • pic_2.png

    關于推流的過程,RTMP的協議文檔上給了上圖示例,說一下推流注意事項:

    3.2.1 Connect 消息

    RTMP 命令消息格式:

    +----------------+---------+---------------------------------------+| Field Name | Type | Description |+--------------- +---------+---------------------------------------+| Command Name | String | Name of the command. Set to "connect".|+----------------+---------+---------------------------------------+| Transaction ID | Number | Always set to 1. |+----------------+---------+---------------------------------------+| Command Object | Object | Command information object which has || | | the name-value pairs. |+----------------+---------+---------------------------------------+| Optional User | Object | Any optional information || Arguments | | |+----------------+---------+---------------------------------------+

    RTMP握手之后先發送一個connect命令消息,命令里面包含什么東西,協議中沒有具體規定,實際通信中要攜帶 rtmp url 中的 appName 字段,并且指定一些編解碼的信息,并以AMF格式發送, 下面是用wireshake抓取connect命令需要包含的參數信息:

    • pic_3.png

    這些信息協議中并沒有特別詳細說明, 在librtmp,srs-librtmp這些源碼中,以及用wireshark 抓包的時候可以看到。

    服務器返回的是一個_result命令類型消息,這個消息的payload length一般不會大于128字節,但是在最新的nginx-rtmp中返回的消息長度會大于128字節。

    消息的transactionID是用來標識command類型的消息的,服務器返回的_result消息可以通過transactionID來區分是對哪個命令的回應,connect 命令發完之后還要發送其他命令消息,要保證他們的transactionID不相同。

    發送完connect命令之后一般會發一個 set chunk size消息來設置chunk size的大小,也可以不發。

    Window Acknowledgement Size 是設置接收端消息窗口大小,一般是2500000字節,即告訴對端在收到設置的窗口大小長度的數據之后要返回一個ACK消息。在實際做推流的時候推流端要接收很少的服務器數據,遠遠到達不了窗口大小,所以這個消息可以不發。而對于服務器返回的ACK消息一般也不做處理,默認服務器都已經收到了所有消息了。

    之后要等待服務器對于connect消息的回應的,一般是把服務器返回的chunk都讀完,組包成完整的RTMP消息,沒有錯誤就可以進行下一步了。

    3.2.2 Create Stream 消息

    創建完RTMP連接之后就可以創建RTMP流,客戶端要想服務器發送一個releaseStream命令消息,之后是FCPublish命令消息,在之后是createStream命令消息。

    當發送完createStream消息之后,解析服務器返回的消息會得到一個stream ID。

    • pic_4.png

    這個ID也就是以后和服務器通信的 message stream ID, 一般返回的是1,不固定。

    3.2.3 Publish Stream

    推流準備工作的最后一步是Publish Stream,即向服務器發一個publish命令消息,消息中會帶有流名稱字段,即rtmp url中的 streamName,這個命令的message stream ID 就是上面 create stream 之后服務器返回的stream ID,發完這個命令一般不用等待服務器返回的回應,直接發送音視頻類型的RTMP數據包即可。有些rtmp庫還會發setMetaData消息,這個消息可以發也可以不發,里面包含了一些音視頻meta data的信息,如視頻的分辨率等等。

    整個推流過程rtmp 消息抓包

    • rtmp_pulish_message.png

    4. 推送音視頻

    當以上工作都完成的時候,就可以發送音視頻了。音視頻RTMP消息的Payload(消息體)中都放的是按照FLV-TAG格式封的音視頻包,具體可以參照FLV封裝的協議文檔。格式必須封裝正確,否則會造成播放端不能正常拿到音視頻數據,無法播放音視頻。

    5. 關于RTMP的時間戳

    RTMP的時間戳單位是毫秒ms,在發送音視頻之前一直為零,發送音視頻消息包后時候必須保證時間戳是單調遞增的,時間戳必須打準確,否則播放端可能出現音視頻不同步的情況。Srs-librtmp的源碼中,如果推的是視頻文件的話,發現他們是用H264的dts作為時間戳的。實時音視頻傳輸的時候是先獲取了下某一時刻系統時間作為基準,然后每次相機采集到的視頻包,與起始的基準時間相減,得到時間戳,這樣可以保證時間戳的正確性。

    6. 關于Chunk Stream ID

    RTMP 的Chunk Steam ID是用來區分某一個chunk是屬于哪一個message的 ,0和1是保留的。每次在發送一個不同類型的RTMP消息時都要有不用的chunk stream ID, 如上一個Message 是command類型的,之后要發送視頻類型的消息,視頻消息的chunk stream ID 要保證和上面 command類型的消息不同。每一種消息類型的起始chunk 的類型必須是 Type_0 類型的,表明新的消息的起始。

    總結:

    RTMP協議是個比較啰嗦的協議,實現起來也比較復雜,但通信過程過程相對簡單。在直播的實際工程應用中,協議上很多地方都沒有詳細說明,注意了以上提到幾點,基本能夠保證RTMP音視頻的通信正常。以上就是對RTMP協議的簡介和一些注意事項,希望能幫到有需要的朋友,另外本文難免有錯誤或說的不夠詳細的地方,歡迎指正,一起交流探討。


    本篇文章2017年版本

    前一段時間寫過一篇文章: iOS直播視頻數據采集、硬編碼保存h264文件,比較詳細的記錄了在做iOS端進行視頻數據采集和編碼的過程,下一步要做的就是RTMP協議推流。因為在公司將RTMP協議用Java 和 Swift 分別實現了一遍,所以對這塊比較了解,中間遇到了不少坑,記錄下來也怕自己忘掉。
    RTMP協議是 Adobe 公司開發的一個基于TCP的應用層協議,Adobe 公司也公布了關于RTMP的規范,但是這個協議規范介紹的有些地方非常模糊,很多東西和實際應用是有差別的。網上也有不少關于這個協議的介紹,但都不是太詳細。我遇到的比較好的參考資料就是這篇:帶你吃透RTMP, 這篇文章只是在理論上對RTMP進行了比較詳細的解釋,很多東西還是和實際應用有出入。我這篇文章只是把遇到的一些坑記錄下來,并不是詳解RTMP消息的。
    另外懂RTMP消息拆包分包,而不真正的寫寫的話是很難把RTMP協議弄得的很清楚,關于RTMP協議的實現也是比較麻煩的事,懂和做事兩回事。
    另外用wireshark 抓一下包的話可以非常直觀的看到RTMP通信的過程,對理解RTMP非常有幫助,在調試代碼的時候也大量借助wireshark排錯,是一個非常有用的工具。

    1. RTMP 握手

    RTMP 握手分為簡單握手和復雜握手,現在Adobe公司使用RTMP協議的產品應該用的都是復雜握手,這里不介紹,只說簡單握手。 按照網上的說法RTMP握手的過程如下

  • 握手開始于客戶端發送C0、C1塊。服務器收到C0或C1后發送S0和S1。
  • 當客戶端收齊S0和S1后,開始發送C2。當服務器收齊C0和C1后,開始發送S2。
  • 當客戶端和服務器分別收到S2和C2后,握手完成。
  • 在實際工程應用中,一般是客戶端先將C0, C1塊同時發出,服務器在收到C1 之后同時將S0, S1, S2發給客戶端。S2的內容就是收到的C1塊的內容。之后客戶端收到S1塊,并原樣返回給服務器,簡單握手完成。按照RTMP協議個要求,客戶端需要校驗C1塊的內容和S2塊的內容是否相同,相同的話才徹底完成握手過程,實際編寫程序用一般都不去做校驗。
    RTMP握手的這個過程就是完成了兩件事:1. 校驗客戶端和服務器端RTMP協議版本號,2. 是發了一堆數據,猜想應該是測試一下網絡狀況,看看有沒有傳錯或者不能傳的情況。RTMP握手是整個RTMP協議中最容易實現的一步,接下來才是大頭。

    2. RTMP 分塊

    創建RTMP連接算是比較難的地方,開始涉及消息分塊(chunking)和 AFM(也是Adobe家的東西)格式數據的一些東西,在上面提到的文章中也有介紹為什要進行RTMP分塊。

    Chunk Size

    RTMP是按照chunk size進行分塊,chunk size指的是 chunk的payload部分的大小,不包括chunk basic header 和 chunk message header,即chunk的body的大小。客戶端和服務器端各自維護了兩個chunk size, 分別是自身分塊的chunk size 和 對端 的chunk size, 默認的這兩個chunk size都是128字節。通過向對端發送set chunk size 消息告知對方更改了 chunk size的大小,即告訴對端:我接下來要以xxx個字節拆分RTMP消息,你在接收到消息的時候就按照新的chunk size 來組包。
    在實際寫代碼的時候一般會把chunk size設置的很大,有的會設置為4096,FFMPEG推流的時候設置的是 60*1000,這樣設置的好處是避免了頻繁的拆包組包,占用過多的CPU。設置太大的話也不好,一個很大的包如果發錯了,或者丟失了,播放端就會出現長時間的花屏或者黑屏等現象。

    Chunk Type

    RTMP 分成的Chunk有4中類型,可以通過 chunk basic header的 高兩位指定,一般在拆包的時候會把一個RTMP消息拆成以 Type_0 類型開始的chunk,之后的包拆成 Type_3 類型的chunk,我查看了有不少代碼也是這樣實現的,這樣也是最簡單的實現。
    RTMP 中關于Message 分chunk只舉了兩個例子,這兩個例子不是很具有代表性。假如第二個message和第一個message的message stream ID 相同,并且第二個message的長度也大于了chunk size,那么該如何拆包?當時查了很多資料,都沒有介紹。后來看了一些源碼,發現第二個message可以拆成Type_1類型一個chunk, message剩余的部分拆成Type_3類型的chunk。FFMPEG中好像就是這么做的。

    3. RTMP 消息

    關于推流的過程,RTMP的協議文檔上給了一個示例,而真實的RTMP通信過程和它有較大的差異,只說推流,RTMP播放端我沒有做過。

    Connect消息

    握手之后先發送一個connect 命令消息,命令里面包含什么東西,協議中沒有說,真實通信中要指定一些編解碼的信息,這些信息是以AMF格式發送的, 下面是用swift 寫的connect命令包含的參數信息:

    transactionID += 1 // 0x01let command:RTMPCommandMessage = RTMPCommandMessage(commandName: "connect", transactionId: transactionID, messageStreamId: 0x00)let objects:Amf0Object = Amf0Object()objects.setProperties("app", value: rtmpSocket.appName)objects.setProperties("flashVer",value: "FMLE/3.0 (compatible; FMSc/1.0)")objects.setProperties("swfUrl", value:"")objects.setProperties("tcUrl", value: "rtmp://" + rtmpSocket.hostname + "/" + rtmpSocket.appName)objects.setProperties("fpad", value: false)objects.setProperties("capabilities", value:239)objects.setProperties("audioCodecs", value:3575)objects.setProperties("videoCodecs", value:252)objects.setProperties("videoFunction",value: 1)objects.setProperties("pageUrl",value: "")objects.setProperties("objectEncoding",value: 0)

    這些信息具體什么意思我也不太明白,協議中也沒有,都是我在看librtmp,srs-librtmp這些源碼,以及用wireshark 抓包的時候看到的。其中參數少一兩個貌似也沒問題,但是audioCodecs和videoCodecs這兩個指定音視頻編碼信息的不能少。
    服務器返回的是一個_result命令類型消息,這個消息的payload length一般不會大于128字節,但是在最新的nginx-rtmp中返回的消息長度會大于128字節,所以一定要做好收包,組包的工作。
    關于消息的transactionID是用來標識command類型的消息的,服務器返回的_result消息可以通過 transactionID來區分是對哪個命令的回應,connect 命令發完之后還要發送其他命令消息,要保證他們的transactionID不相同。
    發送完connect命令之后一般會發一個 set chunk size消息來設置chunk size 的大小,也可以不發。
    Window Acknowledgement Size 是設置接收端消息窗口大小,一般是2500000字節,即告訴客戶端你在收到我設置的窗口大小的這么多數據之后給我返回一個ACK消息,告訴我你收到了這么多消息。在實際做推流的時候推流端要接收很少的服務器數據,遠遠到達不了窗口大小,所以基本不用考慮這點。而對于服務器返回的ACK消息一般也不做處理,我們默認服務器都已經收到了這么多消息。
    之后要等待服務器對于connect的回應的,一般是把服務器返回的chunk都讀完組成完整的RTMP消息,沒有錯誤就可以進行下一步了。

    Create Stream 消息

    創建完RTMP連接之后就可以創建RTMP流,客戶端要想服務器發送一個releaseStream命令消息,之后是FCPublish命令消息,在之后是createStream命令消息。當發送完createStream消息之后,解析服務器返回的消息會得到一個stream ID, 這個ID也就是以后和服務器通信的 message stream ID, 一般返回的是1,不固定。

    Publish Stream

    推流準備工作的最后一步是 Publish Stream,即向服務器發一個publish命令,這個命令的message stream ID 就是上面 create stream 之后服務器返回的stream ID,發完這個命令一般不用等待服務器返回的回應,直接下一步發送音視頻數據。有些rtmp庫 還會發setMetaData消息,這個消息可以發也可以不發,里面包含了一些音視頻編碼的信息。

    4. 發布音視頻

    當以上工作都完成的時候,就可以發送音視頻了。音視頻RTMP消息的Payload中都放的是按照FLV-TAG格式封的音視頻包,具體可以參照FLV協議文檔。

    5. 關于RTMP的時間戳

    RTMP的時間戳在發送音視頻之前都為零,開始發送音視頻消息的時候只要保證時間戳是單增的基本就可以正常播放音視頻。我讀Srs-librtmp的源碼,發現他們是用h264的dts作為時間戳的。我在用java寫的時候是先獲取了下當前系統時間,然后每次發送消息的時候都與這個起始時間相減,得到時間戳。

    6. 關于Chunk Stream ID

    RTMP 的Chunk Steam ID是用來區分某一個chunk是屬于哪一個message的 ,0和1是保留的。每次在發送一個不同類型的RTMP消息時都要有不用的chunk stream ID, 如上一個Message 是command類型的,之后要發送視頻類型的消息,視頻消息的chunk stream ID 要保證和上面 command類型的消息不同。每一種消息類型的起始chunk 的類型必須是 Type_0 類型的,表明我是一個新的消息的起始。



    作者:devzhaoyou
    鏈接:https://www.jianshu.com/p/00aceabce944
    來源:簡書
    簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

    總結

    以上是生活随笔為你收集整理的直播推流实现RTMP协议的一些注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    色成人亚洲 | 成人va视频| 国产精品欧美久久 | 国产又黄又爽又猛视频日本 | 亚洲日本欧美 | 一区二区视 | 日韩在线免费电影 | 国产精品大片免费观看 | 国产福利在线免费 | 久久曰视频 | 免费在线观看的av网站 | 99热这里只有精品8 久久综合毛片 | 99热最新地址 | 久久久亚洲国产精品麻豆综合天堂 | 久久小视频| 日韩在线播放视频 | 国产精品久久影院 | 一区 在线观看 | 亚洲专区欧美 | 亚洲人成综合 | 久久成人毛片 | 亚洲撸撸 | 天天插综合 | 国产高清免费在线观看 | 国产乱对白刺激视频在线观看女王 | 久久久亚洲电影 | 久久草在线视频国产 | 91九色蝌蚪国产 | 久久精品视频在线播放 | 久久精品国产免费看久久精品 | 国产麻豆精品传媒av国产下载 | 免费观看成人av | 国产精品99在线播放 | 中文久草| 亚洲手机天堂 | 欧美性性网 | 四虎影视成人精品国库在线观看 | 国产精品自产拍在线观看蜜 | 亚州av免费 | 97超碰人人澡 | 欧美 日韩 视频 | 最新日韩电影 | 久久性生活片 | 久久久久9999亚洲精品 | 日韩精品免费在线播放 | 人人射人人澡 | 久草热视频 | 亚洲精品久久久久中文字幕二区 | 一区二区av| 在线观看网站你懂的 | 97色综合 | 日韩国产欧美视频 | 99c视频高清免费观看 | 亚洲最大成人免费网站 | 狠狠躁夜夜躁人人爽视频 | 亚洲精品动漫成人3d无尽在线 | 操久久网 | 亚洲麻豆精品 | 在线高清| 国产高清视频色在线www | 免费精品视频在线 | 欧美国产日韩在线视频 | 人人添人人澡 | 欧美日韩国产伦理 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 国产在线黄 | 国语自产偷拍精品视频偷 | 久久久久国产视频 | 国产激情电影综合在线看 | av+在线播放在线播放 | 九九爱免费视频 | 99精品国产一区二区三区不卡 | 日韩专区av | 久久网址 | 最新亚洲视频 | 99国产免费网址 | 91在线看网站 | 免费观看一级视频 | 99色资源 | 91自拍91| 国产在线精品福利 | 日韩区欧美久久久无人区 | 久久黄色免费观看 | 国产精品99久久久精品免费观看 | 在线成人性视频 | 成片免费观看视频999 | av黄色免费在线观看 | 美女在线免费视频 | 一区二区在线电影 | 国产成人精品福利 | 国产精品免费人成网站 | 亚洲综合五月 | 久久综合免费视频影院 | 欧美日韩破处 | 久久久精品网站 | 国产又黄又爽无遮挡 | 免费高清在线观看成人 | 91精品999| 成人精品国产免费网站 | 麻豆成人网 | 国产精品亚洲综合久久 | 97超碰资源 | 99久久99视频只有精品 | 美国三级黄色大片 | 99精品欧美一区二区蜜桃免费 | 亚洲精品字幕在线观看 | 免费在线观看黄网站 | 久久久久黄色 | 激情综合网五月激情 | 五月天综合网站 | 精品久久久久久亚洲 | 精品美女久久久久久免费 | 天天曰天天干 | 天天操天天干天天摸 | 九九欧美视频 | 天天狠狠 | 免费av成人在线 | 久久免费看a级毛毛片 | 五月婷婷黄色 | 国产精品久久久久久影院 | 色婷婷成人网 | 午夜av电影院 | 99热这里精品 | 精品亚洲一区二区 | 免费大片黄在线 | 狠狠狠色丁香婷婷综合久久五月 | 精品亚洲视频在线观看 | 免费在线观看视频一区 | av一级在线 | 亚洲一区天堂 | 国产破处在线视频 | 欧美激情视频在线观看免费 | 在线日韩中文 | 一区二区三区免费在线 | 一区二区三区高清 | 国产啊v在线观看 | 97视频免费在线看 | 99热精品久久 | 99久久电影 | 国内久久久 | 亚洲影音先锋 | 国产精品www | 日本女人的性生活视频 | 国产一区二区久久 | 亚洲第五色综合网 | 国产剧情一区二区 | 国产精品第一页在线观看 | 国产视频 亚洲视频 | 日韩欧美在线免费观看 | 九九免费精品 | 国产小视频免费观看 | 五月综合色 | 日韩av伦理片| 永久免费的啪啪网站免费观看浪潮 | 色婷婷视频网 | 国产系列 在线观看 | 日韩在线视频免费看 | 国产只有精品 | 一区二区三区免费看 | 色噜噜狠狠狠狠色综合久不 | 国内精品久久久久久久久 | 黄色录像av | 伊人六月 | 免费久久99精品国产婷婷六月 | 97精品国自产拍在线观看 | 国产精品高 | 欧美成a人片在线观看久 | 国产视频久久久久 | 99久久精品国产系列 | 93久久精品日日躁夜夜躁欧美 | 精品一区二区久久久久久久网站 | 国产精品都在这里 | 日韩一级电影在线观看 | 夜夜躁日日躁狠狠久久88av | 99久久爱 | 爱av在线网 | 久草在线免费播放 | 人人爽人人澡人人添人人人人 | 天天插日日操 | 丝袜+亚洲+另类+欧美+变态 | 天天操天天操天天操天天操 | 97在线观看免费观看 | 久99久精品 | 久久久国产精品一区二区中文 | 91免费版成人 | 亚洲狠狠 | 久久久久国产精品免费 | 婷婷丁香在线视频 | 色婷婷九月| 久久成人人人人精品欧 | 天天操天天弄 | 精品亚洲欧美无人区乱码 | 国产日产精品久久久久快鸭 | 天天操天天色天天射 | 亚洲美女在线国产 | 在线导航av | 午夜精品一区二区三区在线 | 欧美日韩p片 | 又污又黄网站 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲精品美女久久17c | 狠狠操狠狠插 | 国产精品岛国久久久久久久久红粉 | av中文字幕网址 | 中文字幕在线观看网站 | 亚洲成人高清在线 | 日韩二区三区在线 | 久久高清国产视频 | 久久久wwww| 国产日韩在线一区 | 欧美激情在线网站 | 69精品在线观看 | 人人dvd | 99热这里只有精品1 av中文字幕日韩 | 91一区二区在线 | 欧美日韩在线看 | 精品在线观看国产 | 三三级黄色片之日韩 | 狠狠的干狠狠的操 | 在线www色| 久久免费在线 | 精品99免费 | 日韩1级片 | 日韩精品第1页 | 免费观看的av网站 | 91在线精品观看 | 91av原创 | www黄色大片 | 日日干天天操 | 在线观看成人国产 | 波多野结衣在线观看一区 | 综合色中文 | 日韩一区二区三区免费电影 | 日韩高清激情 | 黄网站免费看 | 伊人天堂av | 亚洲在线成人精品 | 九九九九免费视频 | 欧美激情综合色 | 国产精品国产三级国产aⅴ9色 | 国产 亚洲 欧美 在线 | 国产网红在线观看 | 亚洲国产中文字幕在线观看 | 国产一区二区在线观看视频 | 日韩av片无码一区二区不卡电影 | 国产经典 欧美精品 | av在线免费在线观看 | 九九九在线 | 97在线观看免费高清完整版在线观看 | 伊人伊成久久人综合网小说 | 91精品国产欧美一区二区 | 在线观看资源 | 亚洲一区二区三区四区在线视频 | 色视频在线免费 | 91成人破解版 | 天天视频色| 夜又临在线观看 | 高清av在线 | 天天操天天操天天操天天操天天操天天操 | 日韩视频一区二区三区 | 日韩免费在线观看视频 | 欧美日韩一区二区三区视频 | 久久欧美精品 | 国产又粗又猛又黄又爽 | 人操人 | 免费看国产a | 成人黄色在线播放 | 日韩欧美亚洲 | 亚洲国产精品成人精品 | 久久综合狠狠综合久久狠狠色综合 | 国产精品a久久久久 | 国产无套视频 | 国产又粗又猛又黄视频 | 婷婷色视频 | 午夜精品婷婷 | 黄色在线观看免费 | 人人干干人人 | 91九色在线视频观看 | 国内丰满少妇猛烈精品播 | 亚洲精品自在在线观看 | 精品免费一区二区三区 | 国产亚洲免费的视频看 | 国产99精品| 日本乱视频 | 精品字幕| 99热精品在线 | 欧美网站黄色 | 中文字幕av全部资源www中文字幕在线观看 | 国产精品久久久久久久7电影 | 玖玖爱免费视频 | av综合av | 日韩中文字幕亚洲一区二区va在线 | 亚洲精品在线免费看 | 日产中文字幕 | 国产一级电影在线 | 2000xxx影视| 久久精品爱爱视频 | 91免费在线播放 | av大片网址| 精品福利在线 | 久久成人国产精品入口 | 久久久精品网站 | 国产在线观看你懂得 | 在线免费中文字幕 | 欧美日韩一区二区久久 | 久久久久久久久久久久电影 | 国产精品网在线观看 | 成 人 黄 色 视频 免费观看 | 91桃花视频 | 久久人人97超碰精品888 | 久久国产影视 | 97超碰人人澡人人 | 天天操天天操天天操天天操天天操天天操 | 激情图片区| 色综合久久综合网 | 最新国产中文字幕 | av在线免费播放网站 | 亚洲人av免费网站 | 精品一二三四在线 | 天天激情在线 | 国产a视频免费观看 | 日日夜夜天天久久 | 成人黄色毛片视频 | 在线www色| 中文字幕在线播出 | 91av在线免费观看 | 亚洲国产欧美在线人成大黄瓜 | 在线有码中文 | 国产一及片 | 五月激情婷婷丁香 | 天堂av在线中文在线 | 精品国内 | 伊人久久五月天 | 久久久久成 | 日韩视频一区二区三区 | 正在播放亚洲精品 | 蜜桃视频精品 | 久草视频在 | 一区二区 久久 | 免费黄av| 一本一道久久a久久综合蜜桃 | 激情综合色综合久久综合 | 国产美女精品视频 | 久久综合九色综合欧美就去吻 | 久久国产系列 | 欧美精品久久天天躁 | 日批在线看 | 伊人色综合久久天天 | 日韩高清一二区 | 国产在线成人 | 国产视频一区在线免费观看 | 992tv在线 | 亚洲精品一区二区精华 | 欧美国产精品久久久久久免费 | 亚洲精品小视频 | 国产在线美女 | 91麻豆网站| 亚洲国产片色 | 亚洲精品一区二区三区高潮 | 五月天天av| 久久久国产成人 | 97色免费视频 | 亚洲美女精品视频 | 日韩大片免费在线观看 | 99色人| 亚洲成av人片一区二区梦乃 | 黄色毛片在线 | 久久国产免费 | 免费在线成人av | 日韩欧美视频一区二区三区 | 国产清纯在线 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 日韩免费观看av | 国产精品18久久久久久首页狼 | 97电影网手机版 | av片在线观看免费 | 人人插人人舔 | 婷婷久操| 特级毛片在线 | 亚洲国产电影在线观看 | 国产精品免费大片视频 | 欧美日韩在线精品一区二区 | 91av视频在线观看免费 | 日韩欧美在线第一页 | 99色视频 | 四虎小视频 | 天天天天天天天天操 | 欧美a级在线播放 | 婷婷丁香花 | 麻花豆传媒mv在线观看 | 日日爱视频 | 美女网站视频免费都是黄 | 麻花豆传媒一二三产区 | 久草视频免费看 | 成人午夜电影在线播放 | 亚洲成人资源 | 久久久午夜影院 | 中国一级片视频 | 日韩四虎 | 久久综合九色综合欧美就去吻 | 久草网站在线观看 | 黄污视频大全 | 中文字幕欧美三区 | 91精品国产自产在线观看永久 | 国产精品午夜在线 | 99视频国产精品免费观看 | 久久精品在线免费观看 | 日韩精品久久久久久久电影竹菊 | 国产一级淫片在线观看 | 国产日韩精品一区二区三区在线 | 黄色免费看片网站 | 热九九精品 | 婷婷成人在线 | 91av电影网 | 日韩欧美一区视频 | 视频在线一区二区三区 | 国产一级片久久 | 手机在线黄色网址 | 国产成人精品一区在线 | 日韩欧美国产激情在线播放 | 最近中文国产在线视频 | 国产精品久久毛片 | 狠狠色丁香九九婷婷综合五月 | 国产黄色片免费看 | 99理论片 | 狠狠色狠狠色合久久伊人 | 亚洲精品高清在线观看 | 在线91色| 天天草夜夜 | 免费在线色 | 国产手机免费视频 | 成人a级大片| 日日夜夜人人天天 | 久久96| 久久久午夜精品福利内容 | 国产一区二区免费 | 久艹视频在线观看 | 美女免费视频黄 | 中文字幕九九 | 奇人奇案qvod | 日本特黄一级片 | 在线观看mv的中文字幕网站 | 日本aa在线| 一区二区视频在线看 | 国产99爱 | 欧美激情视频一区二区三区免费 | 天天干天天天 | 国产精品久久久久久久久久了 | 精品美女久久久久 | 亚洲成av人片在线观看香蕉 | 狠狠网 | 久久婷婷精品视频 | 国产精品九九九 | 久久久久久久久影院 | 久在线观看视频 | 久精品视频在线 | 亚洲激情免费 | 六月婷婷网 | 夜夜躁狠狠躁 | 精品免费观看视频 | 国产精品99在线播放 | 在线观看网站黄 | 久久久久久美女 | 91丨九色丨蝌蚪丨老版 | 欧美一级专区免费大片 | 国产不卡在线播放 | 制服丝袜欧美 | 国产精品一区二区美女视频免费看 | 久久久久久综合网天天 | 五月天亚洲综合小说网 | 久久精品国产一区 | 美女国产 | 波多野结衣精品在线 | 婷婷丁香花五月天 | 日韩免费视频观看 | 国产99久久九九精品免费 | 久久不见久久见免费影院 | 国产a国产| 久久久久久久久久免费视频 | 丝袜制服天堂 | 国产精品 国产精品 | 在线观看91视频 | www.com.黄| 狠狠色伊人亚洲综合网站色 | 日韩在线视频二区 | 黄色在线免费观看网址 | 狠狠色综合网站久久久久久久 | 五月婷婷在线视频观看 | 日韩免费看视频 | 欧美日韩三级 | www.久久久精品 | 又色又爽又黄 | 香蕉视频色 | 美女视频永久黄网站免费观看国产 | 免费观看日韩 | 亚洲午夜久久久久久久久电影网 | 久久亚洲综合色 | 中文字幕精 | 福利视频第一页 | 日本大尺码专区mv | 欧美在线不卡一区 | 一区二区三区免费在线观看视频 | 在线 国产 亚洲 欧美 | av字幕在线 | 成人国产精品久久久久久亚洲 | 日本特黄特色aaa大片免费 | 欧美做受69 | 日韩精品久久一区二区三区 | 999电影免费在线观看 | 最新成人在线 | 中文字幕乱码一区二区 | 亚洲精品午夜国产va久久成人 | 午夜国产一区二区 | 96视频免费在线观看 | 亚洲视频久久久 | 久久久久免费精品视频 | 青青草国产在线 | 91精品网站在线观看 | 97视频免费| 亚洲h在线播放在线观看h | 综合激情婷婷 | 亚洲精品资源在线观看 | 亚洲精品欧洲精品 | 国产一区视频免费在线观看 | 91精品区| 久久福利电影 | 国产又黄又硬又爽 | av日韩不卡| 黄色在线看网站 | 亚洲婷婷伊人 | 四虎成人精品永久免费av九九 | 黄色大片入口 | 天天干人人 | 中文在线√天堂 | 久久国产精品视频免费看 | 91九色视频导航 | 四虎在线视频免费观看 | 成人av电影在线观看 | 久久精品黄色 | 九九视频在线播放 | 久久爱资源网 | 亚洲精品美女在线观看 | 国产九九精品视频 | 伊人网av | 久久毛片视频 | 欧美天天射 | 欧美视频国产视频 | 国产黄色片久久 | 国产女做a爱免费视频 | 最近日本中文字幕a | 婷婷5月激情5月 | 最新日韩在线观看 | 国产高清不卡av | 国内精品视频在线 | 亚洲黄网站 | 欧美日韩在线观看一区二区 | www.精选视频.com | 亚洲国产美女久久久久 | 91av视频网站| 亚洲午夜精 | 国产精品网址在线观看 | 欧美午夜精品久久久久 | 人人干人人搞 | 亚洲最大色| 亚洲免费观看在线视频 | 99精品视频免费在线观看 | 国产成人一区二区三区影院在线 | 97在线视 | 欧美亚洲xxx | 久久免费视频7 | 男女免费av | 天天·日日日干 | 亚洲精选国产 | 国产视频一区在线 | 日韩在线在线 | 久久久久久久久久免费 | 色欧美视频 | 欧美日韩高清在线一区 | 丝袜美腿在线视频 | 在线看的av网站 | 国产成人免费观看久久久 | 美女视频黄免费的久久 | 日韩v在线91成人自拍 | 亚洲精品国产精品国产 | 91久久国产自产拍夜夜嗨 | 日韩av影片在线观看 | 国产成人精品午夜在线播放 | 有码中文字幕在线观看 | 中文字幕人成乱码在线观看 | 伊人婷婷激情 | 又黄又爽又无遮挡免费的网站 | 国产精品91一区 | 国产免费av一区二区三区 | 午夜在线资源 | 伊人热| 黄色特级片 | 在线免费观看黄色大片 | 蜜桃麻豆www久久囤产精品 | 一级片免费观看视频 | 五月婷婷天堂 | 久热免费在线 | 日韩av一区二区在线影视 | 九九久久国产精品 | 欧美日韩在线播放 | 色网免费观看 | 麻豆久久久久 | 久久国产精品99久久人人澡 | 最近最新中文字幕视频 | 手机在线观看国产精品 | 91精品在线免费视频 | 一区二区三区精品在线视频 | 免费观看av网站 | 欧美性大战久久久久 | 亚洲精品综合欧美二区变态 | 亚洲成av人片 | 精品无人国产偷自产在线 | 久久精精品视频 | 麻豆免费在线播放 | 色永久免费视频 | 在线中文字幕一区二区 | 国产99久久久精品 | www五月天com | www国产亚洲精品久久网站 | av片一区| 中文免费| 三级黄色理论片 | 不卡av电影在线观看 | 欧美激情另类文学 | 午夜久久福利 | 13日本xxxxxⅹxxx20 | 久久99精品国产一区二区三区 | 国产在线91精品 | 精品久久久久免费极品大片 | 国产精品久久99精品毛片三a | 亚洲精品在线资源 | 免费91麻豆精品国产自产在线观看 | 成人av影视 | 国产精品久久久久9999吃药 | 欧美一区在线观看视频 | 国产成人不卡 | 69视频永久免费观看 | 日本爽妇网 | 日本在线视频一区二区三区 | 96视频在线 | 亚洲天堂激情 | 激情综合网在线观看 | 四川妇女搡bbbb搡bbbb搡 | 久久视频这里有久久精品视频11 | 免费成人黄色片 | 中文字幕免费观看全部电影 | 91九色视频在线 | 国内丰满少妇猛烈精品播放 | 国产午夜麻豆影院在线观看 | 成年免费在线视频 | 99热这里只有精品久久 | 中文字幕资源网 国产 | 99久久国产免费免费 | 久久成人麻豆午夜电影 | 亚洲一区日韩 | 最近字幕在线观看第一季 | 91在线播放视频 | 久久激情视频网 | 国产最新福利 | 国产美女网站在线观看 | 精品国产色 | 深爱激情五月婷婷 | 午夜精品久久久久久久久久久久久久 | 激情黄色一级片 | 久久情侣偷拍 | 成人久久久精品国产乱码一区二区 | 亚洲第一香蕉视频 | 蜜臀av免费一区二区三区 | 午夜视频不卡 | 国产精品久久久久影视 | 丁香婷婷综合色啪 | 在线观看蜜桃视频 | 国产剧情亚洲 | 2024国产精品视频 | 中国精品少妇 | 99在线播放 | 欧美激情视频一二三区 | 欧美精品v国产精品 | 国产视频2区 | 久久免费电影网 | 日韩免费视频一区二区 | 精品美女久久久久久免费 | 999久久久欧美日韩黑人 | 精品在线观看一区二区三区 | 久久综合之合合综合久久 | 69精品在线 | 日韩av高潮 | 99久久精品国产亚洲 | 一区二区三区高清不卡 | 久久久久久影视 | 久久字幕精品一区 | 在线综合 亚洲 欧美在线视频 | 日本精品久久久久久 | 狠狠狠狠干| 91成熟丰满女人少妇 | 中文字幕一二三区 | 一级黄色免费网站 | 日女人免费视频 | 免费a级黄色毛片 | 在线一二区 | 亚洲在线视频播放 | www.91国产| 精品久久久久免费极品大片 | 天天拍天天爽 | 日韩精品一区二区免费视频 | 日韩1级片 | 波多野结衣久久资源 | 亚洲天堂自拍视频 | 亚洲精品国产精品久久99热 | 九九精品无码 | 日本黄色a级大片 | 四虎在线免费观看 | 一级片色播影院 | 久草免费在线 | 超碰人人草人人 | 久久免费国产 | 久久精品高清视频 | 99久久婷婷 | 精品久久久久久久久亚洲 | 国产美女网站在线观看 | 激情视频免费在线 | 亚洲黄色av网址 | 中文字幕 影院 | 亚洲一级片免费观看 | 91看片在线观看 | 亚洲九九九在线观看 | 久久精品一区二区三区中文字幕 | 久久99精品国产99久久6尤 | 婷婷久久精品 | 国产日韩精品一区二区 | 在线观看日本高清mv视频 | 午夜久久精品 | 99资源网 | 亚洲三级国产 | 91视频久久 | 99热在线看 | 综合网久久 | 国产日韩欧美在线观看视频 | 69性欧美| 中文字幕超清在线免费 | 丁香六月中文字幕 | 在线免费观看国产精品 | 日韩久久久久久久久久 | 91av视频| 天天天天射 | 久久久久国 | 国产成人三级三级三级97 | 18pao国产成视频永久免费 | 久久免费精品国产 | 日b黄色片| 91亚洲视频在线观看 | 欧美日韩一区二区三区免费视频 | 日本黄色大片免费 | 免费看特级毛片 | 中文字幕一区二区三区四区在线视频 | 五月天国产精品 | 91成人在线网站 | 国产精品精品 | 国产一级在线免费观看 | 一二三久久久 | 99一区二区三区 | 91丨九色丨蝌蚪丰满 | 91精选在线 | 久久国产热 | 天天射夜夜爽 | 黄色1级大片 | 啪啪免费观看网站 | 国产成人精品综合久久久久99 | 五月天久久精品 | 91精品办公室少妇高潮对白 | 欧亚日韩精品一区二区在线 | 色偷偷88888欧美精品久久 | 国内精自线一二区永久 | 日韩精品视频免费专区在线播放 | 欧美激情综合色综合啪啪五月 | www操操操 | 黄色成人av在线 | 成人全视频免费观看在线看 | 日韩毛片在线一区二区毛片 | 国产视频精品免费播放 | 91激情在线视频 | 人人干人人模 | 国产精品a久久 | 在线国产片| 日韩理论片中文字幕 | 黄色精品久久 | 中文字幕在线观看91 | 成年人视频在线免费播放 | a视频免费 | 婷婷色5月 | 视频在线观看一区 | 中文字幕 在线看 | 久久人人精品 | 精品国产视频一区 | 免费看黄色小说的网站 | 综合激情伊人 | 午夜国产福利在线观看 | 黄色三级免费网址 | 黄色大片免费网站 | 91精品福利在线 | 黄色在线免费观看网站 | 四虎国产精 | 婷婷久久网 | 97精品在线| 911香蕉视频 | www黄色com| 欧美久久久影院 | 黄色毛片一级 | 亚洲欧美日韩精品久久奇米一区 | 日韩av资源在线观看 | 91精选| 天天射天天干天天 | 久久美女电影 | 亚洲黄色av网址 | 亚洲一区日韩精品 | 99精品成人 | 国产精品18久久久久久久久 | 99精品视频在线看 | 亚洲国产日本 | 超碰97人 | 久久a久久 | 成人久久18免费网站麻豆 | 日韩特级毛片 | 欧美一级性生活 | 亚洲成人高清在线 | 99精品久久99久久久久 | 欧美伦理一区二区三区 | 欧美日韩在线电影 | 国产999免费视频 | 国产黄免费在线观看 | 8x成人免费视频 | 久久午夜精品影院一区 | 日韩一区二区三区高清免费看看 | 成人在线视频网 | 在线有码中文 | a级国产乱理伦片在线观看 亚洲3级 | 日韩精品免费一区二区三区 | 91网在线观看 | 日韩视频一区二区 | 欧美日韩在线免费观看 | 国产精品乱看 | 久草网免费 | 日韩欧美精品在线 | 国产精品自产拍在线观看桃花 | 91香蕉视频在线 | 免费久久久 | 亚洲精品免费在线播放 | 免费在线国产黄色 | 日韩精品免费在线观看 | 欧美一级片在线免费观看 | 激情久久小说 | 国产日韩视频在线播放 | 国产精品综合在线观看 | 久草在线一免费新视频 | 激情五月在线视频 | 国精产品一二三线999 | 欧美午夜精品久久久久 | av导航福利 | 免费试看一区 | 婷婷色资源 | 国产91精品高清一区二区三区 | 国产资源网站 | 欧美日韩另类在线观看 | 中文字幕日韩一区二区三区不卡 | 99视频导航 | 国产理论一区二区三区 | 天天色官网 | 久久久久久高潮国产精品视 | 免费在线观看成人 | 久久久久久久久久久影视 | 一区二区三区免费看 | 午夜色场 | 久久蜜臀一区二区三区av | 成人av网站在线观看 | 国产精品3 | 亚洲一二区精品 | 亚洲天堂在线观看完整版 | 麻豆一区二区 | 日日夜夜噜噜噜 | 日日夜夜精品免费 | 久久精品在线免费观看 | 91在线免费观看网站 | 欧美 日韩 性 | 国产一区二区免费在线观看 | 久久亚洲免费视频 | 日韩精品电影在线播放 | 91精品影视| 亚洲人在线视频 | 成人av片免费看 | 狠狠干综合 | 超碰人在线 | 97碰碰视频 | 免费成人在线观看视频 | 国产视频久 | 日韩精品一区二区在线观看视频 | 黄色精品免费 | 欧美成人h版电影 | 精品99免费 | 福利视频一二区 | 亚洲天堂网在线视频观看 | 2019中文 | 欧美激情第28页 | 狠狠操电影网 | 超碰在线94 | 91在线看 | 精品视频 | 国产资源网站 | 五月天激情电影 | 婷婷丁香六月 | 91av在线免费播放 | av中文字幕在线电影 | 亚洲黄色片在线 | 免费精品视频 | 最新av免费在线观看 | 色婷婷九月 | 国产精品一区二区免费在线观看 | 久久精品—区二区三区 | 亚洲综合欧美日韩狠狠色 | 日本大片免费观看在线 | 久久天天躁狠狠躁亚洲综合公司 | 色噜噜日韩精品一区二区三区视频 | 黄色三级免费片 | 国产美女视频 | 国产一区二区三区午夜 | 最近中文字幕高清字幕在线视频 | 免费在线观看av的网站 | 欧美成年黄网站色视频 | 精品亚洲二区 | 五月天婷婷丁香花 | 99久久久国产精品美女 | 成人免费av电影 | 久久精品香蕉 | 成年人免费看片 | 伊人婷婷激情 | 日韩精品一区二区三区在线视频 | 久久国内精品99久久6app | 欧美色综合天天久久综合精品 | 99久久激情 | 国产一区二区在线免费播放 | 2022久久国产露脸精品国产 | 日韩欧三级 | 中文电影网 | 最新成人在线 | 91热视频在线观看 | 国产精品免费在线视频 | 久久久久久久久久久福利 | 亚洲六月丁香色婷婷综合久久 | 日韩精品一区电影 | 欧美精品一区二区三区四区在线 | 国产精品久久久久久久久久久免费 | 免费观看一区二区三区视频 | 国产一区高清在线 | 亚洲天天摸日日摸天天欢 | 欧美性久久久久久 | 99色婷婷 | 国产一区二区视频在线播放 | 午夜av大片| 日韩欧美精品在线观看 | 久久精品精品电影网 | 亚州国产精品 | 99在线免费视频观看 | 奇米影视8888| 国产精品99久久久久久久久 | 亚洲伊人av | 欧美日韩视频在线一区 | 91福利在线导航 | 在线国产一区二区 | 日韩av一区二区三区在线观看 | 97超碰人人澡 | 国产一区二区三区网站 | 亚洲成av人片一区二区梦乃 | 国产香蕉97碰碰久久人人 | 久久黄色网址 | 1024手机基地在线观看 | 最新日韩精品 | 日韩免费观看一区二区 | 精品久久中文 | 天天综合网在线观看 | 热热热热热色 | 欧美一区影院 | 国产一区二区三区在线免费观看 | 在线看成人片 | 一区二区三区精品久久久 | 激情欧美日韩一区二区 | 伊人天堂av | 国产精品毛片一区 | 午夜.dj高清免费观看视频 | 天天天在线综合网 | 色综久久 | 久久激情小视频 | 91精品国产自产91精品 | 人人爽人人爽人人片av | 国产成人精品久久 | 色停停五月天 |