{"id":407,"date":"2021-08-19T23:30:35","date_gmt":"2021-08-19T15:30:35","guid":{"rendered":"https:\/\/blog.cauchyschwarz.com\/?p=407"},"modified":"2021-08-20T00:04:41","modified_gmt":"2021-08-19T16:04:41","slug":"rtmp","status":"publish","type":"post","link":"https:\/\/blog.cauchyschwarz.com\/?p=407","title":{"rendered":"RTMP"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 ez-toc-wrap-right counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a32580ab882c\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a32580ab882c\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#RTMP_specification\" >RTMP specification<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#introduction\" >introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#RTMP_Chunk_Stream\" >RTMP Chunk Stream<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Message_Format\" >Message Format<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Handshake\" >Handshake<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Chunking\" >Chunking<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#chunk_format\" >chunk format<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Basic_Header%E7%9A%84%E7%BC%96%E7%A0%81\" >Basic Header\u7684\u7f16\u7801<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Chunk_Message_Header%E7%9A%84%E7%BC%96%E7%A0%81\" >Chunk Message Header\u7684\u7f16\u7801<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Extended_Timestamp\" >Extended Timestamp<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#Protocol_Control_Messages\" >Protocol Control Messages<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#1_Set_Chunk_Size1\" >1. Set Chunk Size(1)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#2_Abort_Message2\" >2. Abort Message(2)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#3_Acknowledgement3\" >3. Acknowledgement(3)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#4_Window_Acknowledgement_Size_5\" >4. Window Acknowledgement Size (5)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#5_Set_Peer_Bandwidth6\" >5. Set Peer Bandwidth(6)<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#6_RTMP_Message_Formats\" >6. RTMP Message Formats<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#61_RTMP_Message_Format\" >6.1 RTMP Message Format<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#62_User_Control_Messages4\" >6.2 User Control Messages(4)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/blog.cauchyschwarz.com\/?p=407\/#7_RTMP_Command_Messages\" >7. RTMP Command Messages<\/a><\/li><\/ul><\/nav><\/div>\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"RTMP_specification\"><\/span>RTMP specification<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/wwwimages2.adobe.com\/content\/dam\/acom\/en\/devnet\/rtmp\/pdf\/rtmp_specification_1.0.pdf\">https:\/\/wwwimages2.adobe.com\/content\/dam\/acom\/en\/devnet\/rtmp\/pdf\/rtmp_specification_1.0.pdf<\/a><\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/blog.cauchyschwarz.com\/wp-content\/uploads\/2021\/08\/rtmp_specification_1.0.pdf\">rtmp_specification_1.0<\/a><a href=\"https:\/\/blog.cauchyschwarz.com\/wp-content\/uploads\/2021\/08\/rtmp_specification_1.0.pdf\" class=\"wp-block-file__button\" download>\u4e0b\u8f7d<\/a><\/div>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"introduction\"><\/span>introduction<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">RTMP(Real Time Messaging Protocol)\u57fa\u4e8e\u53ef\u9760\u4f20\u8f93(\u5982TCP)\u63d0\u4f9b\u670d\u7528\u7684\u4f20\u8f93\u901a\u9053\uff0c\u5e76\u4e14\u4e3a\u4f20\u8f93\u7684\u6570\u636e(chunk)\u63d0\u4f9btimestamp\uff0c\u4ee5\u53ca\u6240\u6709\u4f20\u8f93\u7684chunk\u6309timestamp\u6709\u5e8f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Action Message Format (AMF)<\/strong>: A compact binary format that is used to serialize ActionScript object graphs. AMF has two versions: AMF0 and AMF3.<br>\u5b57\u8282\u5e8f\uff1a\u4f7f\u7528big endian\u3002<br>\u5bf9\u9f50\uff1abyte-aligned\uff0c\u5373\u4e00\u4e2a16\u4f4d\u7684\u6570\u5b57\u53ef\u80fd\u8d77\u59cb\u5730\u5740\u4e3a\u5947\u6570\u3002<br>timestamp\uff1a\u4f7f\u752832\u4f4d\u6574\u6570\u6beb\u79d2\u7ea7\u65f6\u95f4\u6233\uff0c\u901a\u4fe1\u53cc\u65b9\u9700\u8981\u4f7f\u7528\u76f8\u540c\u7684\u8d77\u59cb\u65f6\u95f4(\u540c\u4e00\u4e2aepoch)\u3002\u5e76\u4e14\u4f7f\u7528RTMP\u534f\u8bae\u7684\u7a0b\u5e8f\u9700\u8981\u80fd\u591f\u5904\u7406\u65f6\u95f4\u6233\u7684wraparound\u3002<br>RTMP Chunk Stream\uff1a\u7c7b\u4f3cQUIC\u91cc\u7684QuicStream\uff0c\u6bcf\u4e2aChunk\u90fd\u643a\u5e26\u4e86timestamp\u548c\u6807\u8bb0\u4e86payload\u7c7b\u578b\u3002RTMP Chunk Stream\u53ef\u4ee5\u9009\u7528\u4efb\u610f\u652f\u6301\u6d41\u5f0f\u4f20\u8f93\u7684\u534f\u8bae\u8fdb\u884c\u4f20\u8f93\uff0c\u5982\u679c\u662f\u9009\u7528TCP\u8fd9\u79cd\u53ef\u9760\u4f20\u8f93\u901a\u9053\u7684\u8bdd\uff0cRTMP Chunk Stream\u53ef\u4ee5\u4fdd\u8bc1\u6240\u6709\u7684Rtmp Chunk\u6309timestamp\u53ef\u9760\u6709\u5e8f\u5230\u8fbe\u3002RTMP Chunk Stream\u4e0d\u63d0\u4f9b\u4f18\u5148\u7ea7\u63a7\u5236\uff0c\u9700\u8981\u5e94\u7528\u81ea\u5df1\u5b9e\u73b0\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"RTMP_Chunk_Stream\"><\/span>RTMP Chunk Stream<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Message_Format\"><\/span>Message Format<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Message Format\uff1aMessage\u53ef\u4ee5\u88ab\u62c6\u5206\u6210Chunk\u8fdb\u884c\u4f20\u8f93\uff0cMessage\u9700\u8981\u5177\u6709\u4ee5\u4e0b\u4fe1\u606f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>timestamp, 4\u5b57\u8282\u7684\u65f6\u95f4\u6233\uff1b<\/li><li>length, payload\u7684\u957f\u5ea6\uff0c3\u5b57\u8282\uff0c\u5305\u542b\u5728length\u91cc\uff1b<\/li><li>type id\uff0c1\u5b57\u8282\uff0c\u8868\u793a\u6d88\u606f\u7c7b\u578b\uff1b<\/li><li>Message Stream ID\uff0c4\u5b57\u8282\uff0c\u4fdd\u5b58\u5728chunk header\u4e2d,little endian\uff1b<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Handshake\"><\/span>Handshake<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">client\u9700\u8981\u53d1\u9001c0,c1,c2\u51713\u4e2a\u5305\uff0cserver\u9700\u8981\u53d1\u9001s0,s1,s2\u51713\u4e2a\u5305\uff0c\u65f6\u5e8f\u8981\u6c42\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> The client MUST wait until S1 has been received before sending C2.\n The client MUST wait until S2 has been received before sending any\n other data.\n The server MUST wait until C0 has been received before sending S0 and\n S1, and MAY wait until after C1 as well. The server MUST wait until\n C1 has been received before sending S2. The server MUST wait until\n C2 has been received before sending any other data.<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>c0\u548cs0\uff1a\u53ea\u67091\u4e2a\u5b57\u8282\uff0c\u7528\u4e8eclient\u548cserver\u4e4b\u95f4\u8fdb\u884cRTMP\u7248\u672c\u7684\u534f\u5546\u3002\u6309\u7167\u6b64specification\u63cf\u8ff0\uff0c\u73b0\u5728\u53ea\u67093\u53ef\u7528\uff0c0-2\u5df2\u7ecfobsolete\u3002<\/li><li>c1\u548cs1\uff1a\u5404\u67091536\u5b57\u8282\uff0c\u5305\u542b4\u5b57\u8282\u65f6\u95f4\u6233+4\u5b57\u82820+1528\u5b57\u8282\u968f\u673a\u6570\u636e\uff0c\u968f\u673a\u6570\u7528\u6765\u533a\u5206\u4e0d\u540c\u7684\u63e1\u624b\u8fc7\u7a0b\u3002\u65f6\u95f4\u6233\u4e3aepoch\u3002<\/li><li>c2\u548cs2\uff1a\u5404\u67091536\u5b57\u8282\uff0c\u5206\u522b\u5305\u542b4\u5b57\u8282time+4\u5b57\u8282time2+1528\u5b57\u8282\u968f\u673a\u6570\u636e\u3002time\u662f\u4e4b\u524d\u6536\u5230\u7684c1\u6216\u8005s1\u5305\u91cc\u7684time\uff0ctim2\u662f\u81ea\u5df1\u7684\u6536\u5230c1\u6216\u8005s1\u7684\u65f6\u95f4\u6233\uff0c\u5373\u8fd9\u4e24\u4e2a\u5b57\u6bb5\u7528\u4e8e\u534f\u5546\u5404\u81ea\u7684epoch\u30021528\u5b57\u8282\u968f\u673a\u6570\u636e\u662f\u4e4b\u524d\u6536\u5230\u7684c1\u548cs1\u91cc\u7684\u968f\u673a\u6570\u636e\uff0c\u7528\u4e8e\u533a\u5206\u4e0d\u540c\u7684\u63e1\u624b\u8fc7\u7a0b\u3002\u6574\u4e2ac2\u548cs2\u5c31\u76f8\u5f53\u4e8e\u662fc1\u548cs1\u7684response\/echo\u3002<br>\u7406\u89e3\u4e86\u8fd96\u4e2a\u5305\u7684\u5185\u5bb9\u4e5f\u5c31\u81ea\u7136\u7406\u89e3\u4e86\u8fd96\u4e2a\u5305\u7684\u53d1\u9001\u987a\u5e8f\uff0c\u4e0d\u9700\u8981\u53bb\u6b7b\u8bb0\u786c\u80cc\u4e0a\u9762\u5199\u7684\u53d1\u9001\u8fd96\u4e2a\u5305\u7684\u65f6\u5e8f\u8981\u6c42\u4e86\u3002<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Chunking\"><\/span>Chunking<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e2aRTMP\u8fde\u63a5\u91cc\u5305\u542b\u4e86\u591a\u4e2achunk stream\uff0c\u6bcf\u4e2achunk\u90fd\u5305\u542b\u4e86\u6240\u5c5echunk stream\u7684ID\u3002chunk\u5728\u4f20\u8f93\u7684\u65f6\u5019\u5fc5\u987b\u6709\u5e8f\u5230\u8fbe\u3002<br>chunk\u7684\u5927\u5c0f\u53ef\u7528\u914d\u7f6e\uff0c\u53ef\u4ee5\u901a\u8fc7Set Chunk Size control message\u6765\u914d\u7f6e\uff0cserver\u548cclient\u7684chunk size\u72ec\u7acb\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"chunk_format\"><\/span>chunk format<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">chunk\u5206header(Basic Header + Message Header + Extended Timestamp)\u548cdata\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Basic Header(1\u52303\u5b57\u8282)\uff1a\u5305\u542b\u4e86chunk stream ID\u548cchunk type\u3002chunk type\u51b3\u5b9a\u4e86\u91cc\u9762\u7f16\u7801\u7684message header\u7684\u683c\u5f0f\u3002Basic Header\u7684\u957f\u5ea6\u5219\u7531chunk stream ID(chunk stream ID\u7684\u957f\u5ea6\u662f\u4e0d\u56fa\u5b9a\u7684)\u51b3\u5b9a\u3002<\/li><li>Message Header(0,3,7,\u6216\u800511\u5b57\u8282)\uff1a\u5305\u542b\u4e86\u6240\u7f16\u7801\u7684message\u7684\u4fe1\u606f(\u662f\u90e8\u5206\u8fd8\u662f\u6574\u4e2amessage)\uff0c\u957f\u5ea6\u7531chunk header\u51b3\u5b9a\u3002<\/li><li>Extended Timestamp(0\u6216\u80054\u5b57\u8282)\u3002<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Basic_Header%E7%9A%84%E7%BC%96%E7%A0%81\"><\/span>Basic Header\u7684\u7f16\u7801<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Basic Header\u7684\u7b2c\u4e00\u4e2a\u5b57\u8282\u9ad82\u4f4d\u4e3afmt\uff0c\u5728\u89e3\u6790\/\u7f16\u7801Message Header\u65f6\u9700\u8981\u7528\u5230\u3002<br>\u4f4e6\u4f4d\u6682\u4e14\u79f0\u4e4b\u4e3acs id\uff0c<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u5982\u679ccs id\u4e3a0\uff0c\u5219\u7b2c\u4e00\u4e2a\u5b57\u8282\u540e\u9762\u8fd8\u67091\u4e2a\u5b57\u8282\uff0c\u540e\u9762\u7684\u5b57\u8282\u4fdd\u5b58Chunk Stream ID &#8211; 64\u3002<\/li><li>\u5982\u679ccs id\u4e3a1\uff0c\u5219\u7b2c\u4e00\u4e2a\u5b57\u8282\u540e\u9762\u8fd8\u67092\u4e2a\u5b57\u8282\uff0c\u4fdd\u5b58Chunk Stream ID &#8211; 64\u3002\u5177\u4f53\u8ba1\u7b97Chunk Stream ID\u65b9\u5f0f\u4e3a\u7b2c\u4e09\u4e2a\u5b57\u8282*256+\u7b2c\u4e8c\u4e2a\u5b57\u8282+64\u3002<\/li><li>\u5982\u679ccs id\u4e3a2-63\uff0c\u5219Basic Header\u603b\u5171\u53ea\u67091\u4e2a\u5b57\u8282\uff0cChunk Stream ID\u4e3acs id\u3002<br>Chunk Stream ID\u4fdd\u7559\uff0c\u7528\u4e8e\u4f20\u8f93rtmp\u7684\u63a7\u5236\u6d88\u606f\u548c\u547d\u4ee4\u3002RTMP\u652f\u63013-65599\u768465597\u4e2a\u5e94\u7528\u5c42\u53ef\u7528\u7684Chunk Stream ID\u3002<br>Chunk Stream ID\u53ef\u4ee5\u75282\u5b57\u8282\u4e5f\u53ef\u4ee5\u75283\u5b57\u8282\u7684Basic Header\uff0c\u4f46\u662f\u6309\u7167\u4f7f\u7528\u6700\u5c11\u5b57\u8282\u6570\u7684\u539f\u5219\uff0c\u6700\u597d\u8fd8\u662f\u75282\u5b57\u8282\u3002<br>Chunk Stream ID\u6ca1\u6709\u7528\u4e0a0\u548c1\u4fdd\u7559\u3002<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Chunk_Message_Header%E7%9A%84%E7%BC%96%E7%A0%81\"><\/span>Chunk Message Header\u7684\u7f16\u7801<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6839\u636eBasic Header\u4e2d\u7684fmt\uff0cChunk message header\u76f8\u5e94\u5730\u5206\u62104\u79cd\u7c7b\u578b\u3002<br><strong>Type 0<\/strong>\uff1achunk message header\u670911\u5b57\u8282\u957f\uff0c\u5728chunk stream\u5f00\u59cb\u7684\u65f6\u5019\u6216\u8005chunk stream\u91cc\u7684timestamp\u60f3\u8981\u56de\u9000\u7684\u65f6\u5019(\u56e0\u4e3aseek\u64cd\u4f5c\u5bfc\u81f4\u7684\u56de\u9000)\uff0c\u5fc5\u987b\u8981\u4f7f\u7528\u8fd9\u79cd\u7c7b\u578b\u7684chunk message header\u3002<br><strong>Type 1<\/strong>\uff1a7\u5b57\u8282\u957f\uff0c\u4e0d\u5305\u542bmessage stream id\uff0cmessage stream ID\u4f7f\u7528\u524d\u4e00\u4e2achunk\u7684message stream id\u3002<br><strong>Type 2<\/strong>\uff1a3\u5b57\u8282\u957f\uff0cmessage stream ID\u548cmessage length\u90fd\u4f7f\u7528\u524d\u4e00\u4e2achunk\u7684message stream ID\u548cmessage length\u3002\u53ea\u5305\u542btimestamp delta\uff0c\u4e00\u822c\u7528\u4e8e\u4f20\u8f93\u56fa\u5b9a\u6d88\u606f\u957f\u5ea6\u7684\u97f3\u9891\u3002<br><strong>Type 3<\/strong>\uff1a0\u5b57\u8282\uff0cmessage stream ID\uff0cmessage length\u548ctimestamp delta\u90fd\u7528\u540c\u4e00\u4e2achunk stream\u91cc\u524d\u4e00\u4e2achunk\u7684\u3002\u628a\u4e00\u4e2amessage\u62c6\u5206\u6210\u591a\u4e2achunk\u8fdb\u884c\u4f20\u8f93\u65f6\uff0c\u53ef\u7528\u4f7f\u7528\u8fd9\u79cd\u7c7b\u578b\u7684Message Header(\u9664\u4e86\u7b2c\u4e00\u4e2aChunk)\u3002\u5982\u679c\u5728Type 0\u7c7b\u578b\u7684Chunk\u540e\u9762\u8ddf\u4e86\u4e00\u4e2aType 3\u7c7b\u578b\u7684chunk\uff0c\u90a3\u4e48\u8fd9\u4e2aType 3 chunk\u7684timestamp delta\u4f7f\u7528Type 0\u7c7b\u578b\u90a3\u4e2achunk\u7684timestamp\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Message Header\u4e2d\u901a\u7528\u7684\u5b57\u6bb5\uff1a<br><strong>timestamp delta<\/strong>(3\u5b57\u8282): \u5bf9\u4e8etype 1\u548ctype 2\u7c7b\u578b\uff0c\u8868\u793a\u548c\u524d\u4e00\u4e2achunk\u7684timestamp\u7684\u5dee\uff0c\u5982\u679c\u503c\u5927\u4e8e\u7b49\u4e8e\u4e860xffffff\uff0c\u5219\u9700\u8981\u542f\u7528Extended Timestamp\u5b57\u6bb5\uff0c\u5e76\u4e14timestamp delta\u8bbe\u7f6e\u4e3a0xffffff\u3002<br><strong>message length<\/strong>(3\u5b57\u8282)\uff1a\u5bf9\u4e8etype 0\u548ctype 1\uff0c\u8868\u793a\u53d1\u9001\u7684message\u7684\u957f\u5ea6\u3002<br><strong>message type id<\/strong>(1\u5b57\u8282)\uff1amessage \u7c7b\u578b\u3002<br><strong>message stream id<\/strong>(4\u5b57\u8282, little endian)\uff1a\u4e00\u822c\u4e00\u4e2achunk stream\u91cc\u53ea\u4f20\u8f93\u540c\u4e00\u4e2amessage stream\uff0c\u5982\u679c\u8981\u5728\u4e00\u4e2achunk stream\u91ccmultiplex\u591a\u4e2amessage stream\u7684\u8bdd\uff0c\u524d\u9762\u8bb2\u7684\u538b\u7f29header\u7684\u7f16\u7801\u65b9\u5f0f\u5c31\u4e0d\u5bb9\u6613\u8d77\u6548\u679c(\u56e0\u4e3a\u4e0d\u80fd\u7701\u7565message stream id\u4e86\uff0c\u5404\u4e2amessage stream\u4f20\u8f93\u7684chunk\u5927\u5c0f\u4e5f\u53ef\u80fd\u4e0d\u4e00\u6837)\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Extended_Timestamp\"><\/span>Extended Timestamp<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728Chunk Message Header\u4e2d\u7684timestamp\u6216\u8005timestamp delta\u4e3a0xffffff\u65f6\uff0c\u4f1a\u5b58\u5728Extended Timestamp(4\u5b57\u8282)\u4fdd\u5b58\u5b8c\u6574\u7684\u65f6\u95f4\u6233\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Protocol_Control_Messages\"><\/span>Protocol Control Messages<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RTMP Chunk Stream Protocol\u75281,2,3,5,6\u8fd9\u51e0\u4e2amessage type\u6765\u8868\u793aprotocol control message\u3002\u4f20\u9001Protocol Control Messages\u65f6\uff0cmessage stream ID\u5fc5\u987b\u4e3a0\uff0c\u800cchunk stream ID\u5fc5\u987b\u4e3a2\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Set_Chunk_Size1\"><\/span>1. Set Chunk Size(1)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">chunk size\u9ed8\u8ba4128\u5b57\u8282\uff0c\u4f46\u662fserver\u6216\u8005client\u53ef\u7528\u901a\u8fc7\u53d1Set Chunk Size\u6d88\u606f\u4fee\u6539\u8bbe\u7f6e(\u4e0d\u80fd\u4f4e\u4e8e128\u5b57\u8282)\u3002Set Chunk Size\u6d88\u606f\u7684Payload\u4e3a\u4e00\u4e2a4\u5b57\u8282int\uff0c\u8fd9\u4e2a4\u5b57\u8282int\u7684\u6700\u9ad8\u4f4d\u5fc5\u987b\u4e3a0\u3002\u7531\u4e8eMessage length\u53ea\u75283\u4e2a\u5b57\u8282\u4fdd\u5b58\uff0c\u6240\u4ee5\u5b9e\u9645\u4e0a\u8fd9\u4e2aSet Chunk Size\u6700\u591a\u628amax chunk size\u8bbe\u7f6e\u62100xffffff\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Abort_Message2\"><\/span>2. Abort Message(2)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u544a\u8bc9\u5bf9\u7aef\u4e0d\u8981\u518d\u7b49\u5f53\u524d\u8fd9\u4e2amessage\u4e86\uff0c\u76f4\u63a5\u4e22\u5f03\u6389\u5f53\u524d\u8fd9\u4e2amessage\u3002payload\u4e3achunk stream ID\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Acknowledgement3\"><\/span>3. Acknowledgement(3)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u6bcf\u6536\u6ee1window size\u5b57\u8282\u540e\uff0c\u63a5\u6536\u7aef\u5fc5\u987b\u8981\u7ed9\u53d1\u9001\u7aef\u53d1\u9001\u4e00\u4e2aAcknowledgement\u6d88\u606f\uff0c\u544a\u8bc9\u5bf9\u7aef\u81ea\u5df1\u603b\u5171\u6536\u4e86\u591a\u5c11\u5b57\u8282\u3002Payload\u4e3a\u76ee\u524d\u6240\u6536\u5b57\u8282\u6570(4\u5b57\u8282)\u3002<br>\u53d1\u9001\u7aef\u53ef\u7528\u5728\u6536\u5230Acknowledgement\u6d88\u606f\u4e4b\u524d\u6700\u591a\u53d1\u9001window size\u5b57\u8282\u7684\u6570\u636e\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Window_Acknowledgement_Size_5\"><\/span>4. Window Acknowledgement Size (5)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u544a\u8bc9\u5bf9\u7aef\u81ea\u5df1\u91c7\u7528\u7684window size\uff0cpayload\u4e3a4\u5b57\u8282window size\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_Set_Peer_Bandwidth6\"><\/span>5. Set Peer Bandwidth(6)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Payload\u4e3a4\u5b57\u8282\u7684Acknowledge Window Size\u52a01\u4e2a\u5b57\u8282\u7684Limit Type\u3002<br>\u6ca1\u770b\u51fa\u4e0eWindow Acknowledgement Size\u6d88\u606f\u7684\u533a\u522b\u5728\u54ea\u91cc\uff1f<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_RTMP_Message_Formats\"><\/span>6. RTMP Message Formats<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">RTMP Message\u662f\u4f4d\u4e8eRTMP Chunk Stream\u4e0a\u5c42\u7684\u534f\u8bae\uff0cRTMP Message\u4e0d\u4e00\u5b9a\u975e\u5f97\u7528RTMP Chunk Stream\u4f20\u8f93\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"61_RTMP_Message_Format\"><\/span>6.1 RTMP Message Format<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RTMP Message\u5305\u62echeader\u548cpayload\u4e24\u90e8\u5206\u3002<br>RTMP Message Header\u7684\u6784\u6210\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  0                   1                   2                   3\n  0 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\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | Message Type  | Payload length                                |\n | (1 byte)      | (3 bytes)                                     |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | Timestamp                                                     |\n | (4 bytes)                                                     |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | Stream ID                                     |\n | (3 bytes)                                     |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n Message Header<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Message Type: 1-6\u8fd96\u4e2a\u7c7b\u578b\u88ab\u4fdd\u7559\u7528\u4e8eprotocol control message\u3002<\/li><li>Length\uff1abig endian\u3002<\/li><li>Timestamp\uff1abig endian\u3002<\/li><li>Message Stream ID\uff1abig endian\u3002<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">payload\uff1a\u5b9e\u9645\u8981\u4f20\u8f93\u7684\u6570\u636e\uff0c\u6ca1\u5565\u597d\u8bf4\u7684\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"62_User_Control_Messages4\"><\/span>6.2 User Control Messages(4)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RTMP\u7528message type ID 4\u6765\u8868\u793aUser Control messages\uff0c1,2,3,5,6\u5219\u88abRTMP Chunk Stream Protocol\u5360\u7528\uff0c\u7528\u4e8e\u4f20RTMP Chunk Stream Protocol\u7684\u63a7\u5236\u6d88\u606f\u3002<br>User Control messages\u5e94\u8be5\u7528ID\u4e3a2\u7684RTMP Chunk Stream\u4e2d\u7684message stream ID\u4e3a0\u7684message stream\u53d1\u9001\u3002User Control messages\u5230\u8fbe\u5373\u751f\u6548\uff0c\u5ffd\u7565\u5176\u643a\u5e26\u7684\u65f6\u95f4\u6233\u3002<br>User Control messages\u7684payload\u7ec4\u6210\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> +------------------------------+-------------------------\n | Event Type (16 bits)         | Event Data\n +------------------------------+-------------------------\n Payload for the \u2018User Control\u2019 protocol message<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_RTMP_Command_Messages\"><\/span>7. RTMP Command Messages<span class=\"ez-toc-section-end\"><\/span><\/h1>\n","protected":false},"excerpt":{"rendered":"<p>RTMP specification https:\/\/wwwimages2.adobe.com\/content\/dam\/acom\/en\/devnet\/rtmp\/pdf\/rtmp_specificati&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[47,28,22],"class_list":["post-407","post","type-post","status-publish","format-standard","hentry","category-10","tag-rtmp","tag-28","tag-22"],"_links":{"self":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=407"}],"version-history":[{"count":2,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/407\/revisions"}],"predecessor-version":[{"id":414,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=\/wp\/v2\/posts\/407\/revisions\/414"}],"wp:attachment":[{"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.cauchyschwarz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}