RTSP/RTMP播放端錄像不可忽視的幾個設計要點

很多開發者提到,拉取的攝像機(一般RTSP流)或RTMP流,如果需要錄製,需要考慮哪些因素,本文以大牛直播SDK的Windows平臺拉流端錄像爲例(github),做個簡單的介紹:

1. 基礎文件名設定

一般來說,本地錄像的話,不可能每個文件單獨命名,這個時候,需要考慮如文件名前綴、文件名是否添加日期、是否添加時間幾個因素,以C#爲例,具體接口定義如下:

    /*如果三項都是0的話,將不能啓動錄像*/
    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct NT_SP_RecorderFileNameRuler
    {
        public UInt32 type_;                                          // 這個值目前默認是0,將來擴展用
        [MarshalAs(UnmanagedType.LPStr)] public String file_name_prefix_;  // 設置一個錄像文件名前綴, 例如:daniulive
        public Int32 append_date_;                                    // 如果是1的話,將在文件名上加日期, 例如:daniulive-2017-01-17
        public Int32 append_time_;                                    // 如果是1的話,將增加時間,例如:daniulive-2017-01-17-17-10-36
    }

		/*
		 * 設置錄像文件名生成規則
		 */
        [DllImport(@"SmartPlayerSDK.dll", EntryPoint = "NT_SP_SetRecorderFileNameRuler", CallingConvention = CallingConvention.StdCall)]
        public static extern UInt32 NT_SP_SetRecorderFileNameRuler(IntPtr handle, ref NT_SP_RecorderFileNameRuler ruler);

2. 設置錄像目錄、單個錄像文件大小

這個不再贅述,設置錄像目錄是錄像的基礎操作,單個文件大小設定,可以更精細的控制單個文件size,一般建議單個文件不要過大,單次錄製,超過設定的size,將自動切分保存到另外一個新的文件。

		/*
		 * 設置本地錄像目錄, 必須是英文目錄,否則會失敗
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetRecorderDirectory(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] String dir);

		/*
		 * 設置單個錄像文件最大大小, 當超過這個值的時候,將切割成第二個文件
		 * size: 單位是KB(1024Byte), 當前範圍是 [5MB-800MB], 超出將被設置到範圍內
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetRecorderFileMaxSize(IntPtr handle, UInt32 size);

3. 音頻轉碼後錄像

一般來說,AAC格式更通用,設置錄像時音頻轉AAC編碼的開關, 可以把比如speex, pcmu, pcma轉aac的後再錄像,確保錄製文件的audio格式更通用,轉碼會有一定的資源消耗。

        /*
         * 設置錄像時音頻轉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);

4. 更精細的音視頻錄像控制(純音頻、純視頻錄製)

這兩組接口設置的意義在於, 有些場景下可能不想錄制視頻,只想錄音頻,或是隻錄製視頻、不錄製音頻,通過開放此類接口設定,讓開發者操作更靈活。

        /*
		 * 設置是否錄視頻,默認的話,如果視頻源有視頻就錄,沒有就沒得錄, 但有些場景下可能不想錄制視頻,只想錄音頻,所以增加個開關
         * 
		 * 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);

5. 容易被忽略的callback事件

第五條,錄像狀態反饋,是好多開發者容易遺忘的,錄像回調狀態,可以很方便的告知上層開發者,什麼時候開啓了錄像,什麼時候結束了錄像,什麼時候寫入了新的錄像文件,這樣便於上層邏輯開發人員,對錄製好的文件進行二次編輯或處理。

		/*
		 * 設置錄像回調接口
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetRecorderCallBack(IntPtr handle,
            IntPtr call_back_data, SP_SDKRecorderCallBack call_back);

6. 開始錄像/停止錄像

不再贅述,有了以上5條的設計,第六條,只要上層開發者按部就班的調用就好了。

		/*
		 * 啓動錄像
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_StartRecorder(IntPtr handle);

		/*
		 * 停止錄像
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_StopRecorder(IntPtr handle);

總結:

以上是一個友好的RTSP、RTMP拉流錄像功能需要考慮的幾點設計,遺憾的是,好多開發者之關注第六條,前五條或多或少的忽略了,除了常規的接口設計之外,錄像功能需要考慮的其他因素還很多,後續有機會再做進一步分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章