RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨
好多開發者認為,無論是RTSP/RTMP推送端還是RTSP/RTMP播放端,涉及到錄像,只要2個接口足矣:開始錄像、停止錄像。
實際場景下,一個好的錄像模塊,2個接口遠遠不夠, 本文以大牛直播SDK(Github)RTSP/RTMP推送和RTSP/RTMP播放端擴展錄像模塊為例,介紹下一個好的錄像模塊,需要具備哪些基本功能屬性。
Android、iOS平臺不再贅述,本文以Windows平臺C#接口為例,先說推送端:
1. 設置錄像目錄
錄像目錄不必多解釋,為了便于錄像文件管理,設置指定的錄像目錄是基礎操作。
/** 設置本地錄像目錄, 必須是英文目錄,否則會失*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_SetRecorderDirectory(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] String dir, IntPtr pReserve);2.?設置單個錄像文件最大大小
之所以設置單個錄像文件大小,有兩個出發點:第一,控制單個文件大小范圍,不至于因單個文件過大,中途異常退出或文件過大導致寫入失敗;第二,達到設定文件大小size后,自動切割生成下個錄像文件,便于文件管理。
/** 設置單個錄像文件最大大小, 當超過這個值的時候,將切割成第二個文件* * size: 單位是KB(1024Byte), 當前范圍是 [5MB-1G], 超出將被設置到范圍內*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_SetRecorderFileMaxSize(IntPtr handle, UInt32 size);3.?設置錄像文件名生成規則
設置文件名生成規則,主要是為了不至于每個文件都需要開發者單獨指定名稱,開發者只要制定錄制規則,比如文件名前綴、是否加日期、是否加時間等屬性,自動生成文件名。
/** 設置錄像文件名生成規則*/[DllImport(@"SmartPublisherSDK.dll", EntryPoint = "NT_PB_SetRecorderFileNameRuler", CallingConvention = CallingConvention.StdCall)]public static extern UInt32 NT_PB_SetRecorderFileNameRuler(IntPtr handle, ref NT_PB_RecorderFileNameRuler ruler); /*如果三項都是0的話,將不能啟動錄像*/[StructLayoutAttribute(LayoutKind.Sequential)]public struct NT_PB_RecorderFileNameRuler{public UInt32 type_; // 這個值目前默認是0,將來擴展用[MarshalAs(UnmanagedType.LPStr)]public String file_name_prefix_; // 設置一個錄像文件名前綴, 例如:daniulivepublic Int32 append_date_; // 如果是1的話,將在文件名上加日期, 例如:daniulive-2017-01-17public Int32 append_time_; // 如果是1的話,將增加時間,例如:daniulive-2017-01-17-17-10-36}4. 啟動錄像
不多解釋,這個只要涉及錄像功能,都需要的。
/** 啟動錄像*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_StartRecorder(IntPtr handle, IntPtr pReserve);5.?暫停/恢復錄像
暫停錄像,好多開發者不可理解,這里舉個簡單的李總,比如老師每次上課2小時,中間有2次下課休息時間,下課期間,老師可暫停錄像,等開始上課后,恢復錄像,這樣確保了上課內容錄制的連續性和完整性。
/** 暫停錄像* * is_pause: 1表示暫停, 0表示恢復錄像, 輸入其他值將調用失敗* * 成功返回NT_ERC_OK* 返回NT_ERC_PB_NEED_RETRY, 請隔一段時間再嘗試調用*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_PauseRecorder(IntPtr hanlde, Int32 is_pause);6. 停止錄像
不多解釋,這個只要涉及錄像功能,都需要的。
/** 停止錄像*/[DllImport(@"SmartPublisherSDK.dll")]public static extern UInt32 NT_PB_StopRecorder(IntPtr handle);7. 錄像事件回調
錄像事件回調,是好多開發者在設計錄像功能模塊時容易忽略的,回調的目的是給上層一個反饋,比如開始錄像、停止錄像狀態反饋,亦或單個錄像完成后的事件回調。
NT_PB_E_EVENT_ID_RECORDER_START_NEW_FILE = NT_PB_E_EVENT_ID_BASE | 0x7, /*錄像寫入新文件, param5表示錄像文件名*/NT_PB_E_EVENT_ID_ONE_RECORDER_FILE_FINISHED = NT_PB_E_EVENT_ID_BASE | 0x8, /*一個錄像文件完成, param5表示錄像文件名*/ case (uint)NTSmartPublisherDefine.NT_PB_E_EVENT_ID.NT_PB_E_EVENT_ID_RECORDER_START_NEW_FILE:event_log = " start new recorder file";if (!String.IsNullOrEmpty(param5)){label_event_status.Text = event_log + " file name:" + param5;}break;case (uint)NTSmartPublisherDefine.NT_PB_E_EVENT_ID.NT_PB_E_EVENT_ID_ONE_RECORDER_FILE_FINISHED:event_log = " finish recorder file";if (!String.IsNullOrEmpty(param5)){label_event_status.Text = event_log + " file name:" + param5;}break;播放端除了上述設置錄像目錄、指定錄像文件名規則,開始錄像/停止錄像和event回調外,還加入了以下接口:
8. 只錄制音頻或視頻
這個很好理解,比如音視頻都有的場景,好多開發者可能實際只需要用到音頻或視頻,這個時候,就凸顯出接口意義了。
/** 設置是否錄視頻,默認的話,如果視頻源有視頻就錄,沒有就沒得錄, 但有些場景下可能不想錄制視頻,只想錄音頻,所以增加個開關* * is_record_video: 1 表示錄制視頻, 0 表示不錄制視頻, 默認是1*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderVideo(IntPtr handle, Int32 is_record_video);/** 設置是否錄音頻,默認的話,如果視頻源有音頻就錄,沒有就沒得錄, 但有些場景下可能不想錄制音頻,只想錄視頻,所以增加個開關** is_record_audio: 1 表示錄制音頻, 0 表示不錄制音頻, 默認是1*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderAudio(IntPtr handle, Int32 is_record_audio);9.?設置錄像時音頻轉AAC編碼的開關
設置錄像時音頻轉AAC編碼的開關的意義在于,比如有些rtsp流,audio是PCMA或PCMU的,有些rtmp流,audio是SPEEX的,實際使用場景下,aac比較通用,sdk增加其他音頻編碼(比如speex, pcmu, pcma等)轉aac的功能,確保存儲下來的MP4文件通用性更好。
/** 設置錄像時音頻轉AAC編碼的開關, aac比較通用,sdk增加其他音頻編碼(比如speex, pcmu, pcma等)轉aac的功能.* is_transcode: 設置為1的話,如果音頻編碼不是aac,則轉成aac, 如果是aac,則不做轉換. 設置為0的話,則不做任何轉換. 默認是0.* 注意: 轉碼會增加性能消耗*/[DllImport(@"SmartPlayerSDK.dll")]public static extern UInt32 NT_SP_SetRecorderAudioTranscodeAAC(IntPtr handle, Int32 is_transcode);總結
一個好多錄像模塊設計,應該是可作為單獨功能模塊使用(如同時多路錄像存檔),亦可和其他模塊組合調用,此外,需要和RTMP/RTSP推送、RTMP/RTSP播放、RTSP轉發、內置輕量級RTSP服務功能完全分離,支持隨時錄像,支持設置單個錄像文件大小、錄像路徑等,并支持純音頻、純視頻、音視頻錄制模式,支持音頻(PCMU/PCMA,Speex等)轉AAC后再錄像,支持RTSP/RTMP H.265(hevc),支持采集端(推送端)錄像過程中,暫停錄像、恢復錄像,從開始錄像,到錄像結束均有event callback上來等。
這么看下來,錄像模塊2個接口確實遠遠不夠。
總結
以上是生活随笔為你收集整理的RTMP/RTSP推送端和RTMP/RTSP播放端录像设计探讨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome谷歌浏览器私密浏览自动开启功
- 下一篇: 腾讯视频怎么上传自己的视频?