Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?

简介: Windows平台RTMP推送|轻量级RTSP服务录像模块如何支持中文路径?

技术背景

我们在做Windows平台RTMP推送、轻量级RTSP服务录像模块的时候,部分开发者抱怨路径无法设置中文,只能设置为英文。

image.gif编辑

以C#的接口为例,早期的设计如下:

/** 设置本地录像目录, 必须是英文目录,否则会失败*/    [DllImport(@"SmartPublisherSDK.dll")]
publicstaticexternUInt32NT_PB_SetRecorderDirectory(IntPtrhandle, [MarshalAs(UnmanagedType.LPStr)] Stringdir, IntPtrpReserve);

image.gif

考虑到一些场景的特殊性,可能需要中文路径,我们设计的接口如下:

/** 设置本地录像目录, 支持中文目录, 需要设置宽字符,比如L"D:\\xxx\\gg"*/        [DllImport(@"SmartPublisherSDK.dll")]
publicstaticexternUInt32NT_PB_SetRecorderDirectoryW(IntPtrhandle, [MarshalAs(UnmanagedType.LPWStr)]Stringdir, IntPtrpReserve);

image.gif

调用如下,以调用开始录像、暂停录像、停止录像为例,调用逻辑如下,可以看到除了中文路径诉求,录像模块还可以添加前缀、添加文字、水印:

publicboolStartRecorder()
        {
if (is_empty_handle() ||is_recording())
returnfalse;
//string edit_rec_dir = "D:\\dntest";stringedit_rec_dir="D:\\推送端录像";
if (String.IsNullOrEmpty(edit_rec_dir))
            {
Console.WriteLine("请设置录像目录");
returnfalse;
            }
uintret=NTSmartPublisherSDK.NT_PB_SetRecorderDirectoryW(handle_, edit_rec_dir, IntPtr.Zero);
if (NTBaseCodeDefine.NT_ERC_OK!=ret)
            {
try_close_handle();
returnfalse;
            }
uintrec_max_file_size=512*1024;
NTSmartPublisherSDK.NT_PB_SetRecorderFileMaxSize(handle_, rec_max_file_size);
NT_PB_RecorderFileNameRulerrec_name_ruler=newNT_PB_RecorderFileNameRuler();
Stringrec_file_name_prefix_="transcode-rec";
rec_name_ruler.file_name_prefix_=rec_file_name_prefix_.ToString();
rec_name_ruler.append_date_=1;
rec_name_ruler.append_time_=1;
NTSmartPublisherSDK.NT_PB_SetRecorderFileNameRuler(handle_, refrec_name_ruler);
if (NTBaseCodeDefine.NT_ERC_OK!=NTSmartPublisherSDK.NT_PB_StartRecorder(handle_, IntPtr.Zero))
            {
try_close_handle();
returnfalse;
            }
shared_lock_.EnterWriteLock();
try            {
handle_reference_count_++;
is_recording_=true;
            }
finally            {
shared_lock_.ExitWriteLock();
            }
returntrue;
        }
publicUInt32PauseRecorder(boolis_pause)
        {
if (is_empty_handle() ||!is_recording())
returnNTBaseCodeDefine.NT_ERC_FAILED;
UInt32ret=NTBaseCodeDefine.NT_ERC_OK;
if (is_pause)
            {
ret=NTSmartPublisherSDK.NT_PB_PauseRecorder(handle_, 1);
if ((UInt32)NT.NTSmartPublisherDefine.NT_PB_E_ERROR_CODE.NT_ERC_PB_NEED_RETRY==ret)
                {
Console.WriteLine("暂停录像失败, 请重新尝试!");
returnret;
                }
elseif (NTBaseCodeDefine.NT_ERC_OK==ret)
                {
//btn_pause_rec.Text = "恢复录像";                }
            }
else            {
ret=NTSmartPublisherSDK.NT_PB_PauseRecorder(handle_, 0);
if ((UInt32)NT.NTSmartPublisherDefine.NT_PB_E_ERROR_CODE.NT_ERC_PB_NEED_RETRY==ret)
                {
Console.WriteLine("恢复录像失败, 请重新尝试!");
returnret;
                }
elseif (NTBaseCodeDefine.NT_ERC_OK==ret)
                {
//btn_pause_rec.Text = "暂停录像";                }
            }
returnret;
        }
publicvoidStopRecorder()
        {
if (is_empty_handle() ||!is_recording())
return;
shared_lock_.EnterWriteLock();
try            {
is_recording_=false;
handle_reference_count_--;
            }
finally            {
shared_lock_.ExitWriteLock();
            }
NTSmartPublisherSDK.NT_PB_StopRecorder(handle_);
try_close_handle();
        }

image.gif

开始录像和录像完成后,提示如下:

privatevoidPbEventCallBack(UInt32event_id,
Int64param1,
Int64param2,
UInt64param3,
UInt64param4,
            [MarshalAs(UnmanagedType.LPStr)] Stringparam5,
            [MarshalAs(UnmanagedType.LPStr)] Stringparam6,
IntPtrparam7)
        {
Stringevent_log="";
switch (event_id)
            {
                ......
case (uint)NTSmartPublisherDefine.NT_PB_E_EVENT_ID.NT_PB_E_EVENT_ID_RECORDER_START_NEW_FILE:
event_log=" start new recorder file";
byte[] utf8_bytes=Encoding.Default.GetBytes(param5);
byte[] default_bytes=Encoding.Convert(Encoding.UTF8, Encoding.Default, utf8_bytes);
Stringfile_name=Encoding.Default.GetString(default_bytes);
if (!String.IsNullOrEmpty(file_name))
                    {
event_log=event_log+" file name:"+file_name;
                    }
break;
case (uint)NTSmartPublisherDefine.NT_PB_E_EVENT_ID.NT_PB_E_EVENT_ID_ONE_RECORDER_FILE_FINISHED:
event_log=" finish recorder file";
byte[] finished_utf8_bytes=Encoding.Default.GetBytes(param5);
byte[] finished_default_bytes=Encoding.Convert(Encoding.UTF8, Encoding.Default, finished_utf8_bytes);
Stringfinished_file_name=Encoding.Default.GetString(finished_default_bytes);
if (!String.IsNullOrEmpty(finished_file_name))
                    {
event_log=event_log+" file name:"+finished_file_name;
                    }
break;
                .......
default:
break;
            }
EventGetPublisherEventMsg(event_log);
        }

image.gif

总结

Windows平台RTMP推送、轻量级RTSP服务配套的录像模块,除了设置录像保存路径外、还可以设置录像文件前缀、是不是添加日期、时间等,还有就是单个录像文件大小,超过这个大小后,会自动切换到下个文件,需要测试交流的,可以跟我联系。

相关文章
|
2月前
|
开发框架 监控 安全
Windows Defender 导致 Web IIS 服务异常停止排查
某日凌晨IIS服务异常停止,经查为Windows Defender安全补丁KB2267602触发引擎更新,导致系统资源波动,进而引发应用池回收。确认非人为操作,系统无重启。通过分析日志与监控,定位原因为Defender更新后扫描加重负载。解决方案:将IIS及.NET相关路径添加至Defender排除列表,避免业务影响。
416 116
|
9月前
|
Linux iOS开发 MacOS
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Git 服务
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Git 服务
275 0
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Git 服务
|
11月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
1257 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
1085 4
|
2月前
|
安全 数据安全/隐私保护 虚拟化
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
561 2
Windows Server 2022 中文版、英文版下载 (2025 年 10 月更新)
|
2月前
|
安全 Unix 物联网
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
275 0
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 10 月更新)
|
2月前
|
存储 SQL 人工智能
Windows Server 2025 中文版、英文版下载 (2025 年 10 月更新)
Windows Server 2025 中文版、英文版下载 (2025 年 10 月更新)
454 0
|
3月前
|
运维 安全 网络安全
Windows Server 2019拨号“找不到设备”?Error 1058解决指南
Windows Server 2019拨号报错1058?别急!这不是硬件故障,而是关键服务被禁用。通过“服务依存关系”排查,依次启动“安全套接字隧道协议”“远程接入连接管理”和“路由与远程访问”服务,仅需4步即可恢复PPPoE或VPN拨号功能,轻松解决网络中断问题。
333 1
|
3月前
|
存储 SQL 人工智能
Windows Server 2025 中文版、英文版下载 (2025 年 9 月更新)
Windows Server 2025 中文版、英文版下载 (2025 年 9 月更新)
1135 3
Windows Server 2025 中文版、英文版下载 (2025 年 9 月更新)
|
3月前
|
安全 Unix 物联网
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 9 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 9 月更新)
373 2