作者原創,轉載請聯系作者
如上文所說,建立了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" --- 警告!客戶端沒有足夠的帶寬,無法以正常速度播放數據"