RTMP的create stream協議

作者原創,轉載請聯系作者

如上文所說,建立了NetConnection,就可以建立NetStream了。在ngx_rtmp是如何實現的呢?

CMD模塊回調注冊

nginx在初始化啟動的時候調用ngx_rtmp_cmd_module模塊ngx_rtmp_cmd_postconfiguration()中進行回調注冊,具體回調如下:

static ngx_rtmp_amf_handler_t ngx_rtmp_cmd_map[] = {
   { ngx_string("connect"),            ngx_rtmp_cmd_connect_init        },
   { ngx_string("createStream"),       ngx_rtmp_cmd_create_stream_init  },
   { ngx_string("closeStream"),        ngx_rtmp_cmd_close_stream_init   },
   { ngx_string("deleteStream"),       ngx_rtmp_cmd_delete_stream_init  },
   { ngx_string("publish"),            ngx_rtmp_cmd_publish_init        },
   { ngx_string("play"),               ngx_rtmp_cmd_play_init           },
   { ngx_string("play2"),              ngx_rtmp_cmd_play2_init          },
   { ngx_string("seek"),               ngx_rtmp_cmd_seek_init           },
   { ngx_string("pause"),              ngx_rtmp_cmd_pause_init          },
   { ngx_string("pauseraw"),           ngx_rtmp_cmd_pause_init          },
};

create stream流程

createStream大體流程如下:

  • 如本人的前文《RTMP的connection協議》中所講,客戶端收到客戶端回復的"connect"回應消息后,給服務器發送createstream消息
  • 服務端通過ngx_rtmp_recv收到消息后進行組包、頭解析后調用ngx_rtmp_receive_message
  • ngx_rtmp_receive_message根據上一步解析出來的消息頭帶的type定位到回調函數ngx_rtmp_cmd_create_stream_init
    而ngx_rtmp_cmd_create_stream_init主要做的工作如下:
  • 具體回調是就是從緩沖區中讀取數據ngx_rtmp_receive_amf()
    -調用ngx_rtmp_cmd_create_stream()
  • ngx_rtmp_cmd_create_stream()功能相對簡單,就是回復消息給客戶端,amf消息如下:
    static ngx_rtmp_amf_elt_t out_elts[] = {
    { NGX_RTMP_AMF_STRING,
    ngx_null_string,
    "_result", 0 },
    { NGX_RTMP_AMF_NUMBER,
    ngx_null_string,
    &trans, 0 },
    { NGX_RTMP_AMF_NULL,
    ngx_null_string,
    NULL, 0 },
    { NGX_RTMP_AMF_NUMBER,
    ngx_null_string,
    &stream, sizeof(stream) },
    };

Stream狀態

對于創建的stream,存在各個狀態,用于服務端和客戶端進行應對,具體如下,如何應對后文在詳講。

  • "NetStream.Play.Reset" --- 播放列表重置
  • "NetStream.Play.Start" --- 播放開始
  • "NetStream.Buffer.Empty" --- 視頻正在緩沖
  • "NetStream.Buffer.Full" --- 緩沖區已填滿
  • "NetStream.Play.StreamNotFound" --- 找不到此視頻
  • "NetStream.Play.Stop" --- 視頻播放完成
  • "NetStream.Pause.Notify" --- 流已暫停
  • "NetStream.Unpause.Notify" --- 流已恢復
  • "NetStream.Seek.Failed" --- 搜尋失敗
  • "NetStream.SeekStart.Notify" --- 搜尋開始
  • "NetStream.Seek.Notify" --- 正在搜尋
  • "NetStream.Seek.Complete" --- 搜尋完畢
  • "NetStream.Publish.Start" --- 發布開始
  • "NetStream.Unpublish.Success" --- 停止發布
  • "NetStream.Record.Start" --- 開始錄制
  • "NetStream.Record.Stop" --- 停止錄制
  • "NetStream.Publish.BadName" --- 警告!試圖發布已經被他人發布的流
  • "NetStream.Play.PublishNotify" --- 發布開始,信息已經發送到所有訂閱者
  • "NetStream.Play.UnpublishNotify" --- 發布停止,信息已經發送到所有訂閱者
  • "NetStream.Play.InsufficientBW" --- 警告!客戶端沒有足夠的帶寬,無法以正常速度播放數據"
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 作者原創,轉載請聯系作者經過建立Netconnection和CreateStream之后,客戶端就可以進行相應的流...
    Alfie20閱讀 3,393評論 0 1
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • 作者原創,轉載請聯系作者 RTMP簡介 Real Time Messaging Protocol(實時消息傳送協議...
    Alfie20閱讀 1,399評論 0 4
  • 作者原創,轉載請聯系作者publisher通過Publish進行推送流之后,客戶端可以發起Play操作,本文描述客...
    Alfie20閱讀 1,025評論 2 0
  • 作者原創,轉載請聯系作者 作者將以系列文章進行解析Nginx-Rtmp模塊代碼,地址為nginx-rtmp-mod...
    Alfie20閱讀 1,296評論 0 2