![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
.Net
文章平均质量分 81
CodeOfCC
c++ 音视频开发
展开
-
C# 实现跨进程条件变量
C#提供的多进程同步对象有互斥锁和信号量,但是并没有条件变量。虽然信号量条件变量一定程度可以等效,但是具体的使用还是会有区别。比如说消息队列用条件变量就比信号量方便,用信号量要么缺乏灵活性,要么辅助代码已经和实现一个条件变量没区别了。本文提供了一种条件变量的实现方法,可以用于进程间的同步控制。原创 2024-07-21 23:05:34 · 182 阅读 · 0 评论 -
C# 基于共享内存实现跨进程队列
进程通信一般情况下比较少用,但是也有一些使用场景,有些做视频传输的似乎会用多进程来实现,还有在子进程中调用特定的库来避免内存泄漏,笔者最近也遇到了需要使用多进程的场景。多进程的使用最主要的就是进程间的通信,本文参考了go语言的ipc库,实现了一个基于共享内存的跨进程队列。以上就是今天要讲的内容,实现这样的一个对象,虽然代码量不多,但还是有一点难度的,很多细节需要处理,比如泛型转type以统一接口,信号量实现队列和条件变量是有差异的,用CreateFromFile才能实现跨平台。原创 2024-07-15 23:32:01 · 419 阅读 · 0 评论 -
C# 实现子进程跟随主进程关闭
多进程开发经常会遇到主进程关闭,子进程需要跟随主进程一同关闭。比如调ffmpeg命令行实现的录屏程序,录屏程序关闭,ffmpeg进程也需要退出。我们通常在程序关闭时调用Process.Kill()杀掉fmpeg进程即可。但是如果是强制或异常关闭录屏程序,ffmpeg将会变成僵尸进程残留在系统中。本文将提供一种解决此类问题的方法。原创 2024-04-04 01:04:10 · 826 阅读 · 1 评论 -
C# Stopwatch计算代码运行时间
我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文将上述操作封装为一些对象方便使用。以上就是今天要讲的内容,本文简单的Stopwatch进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。原创 2024-03-13 01:07:54 · 620 阅读 · 0 评论 -
C# 实现单线程异步互斥锁
C#对异步的支持越来越成熟,async、await简化了代码也提高了可读性,但由于在一段上下文中有了异步操作,意味着这段操作可能会被同时重复调用,如果本身没有被设计可以重复调用的情况下,就很可能会出问题。以上就是今天要讲的内容,本文简单的实现了单线程的异步互斥锁,实现起来相对简单,但作用还是比较大的。虽然说有些情况的异步是可以在前期设计上避免同时调用,比如登录按钮点击后出现蒙板不允许再次点击,但是对于已存在的代码出现了同时调用问题,此时有互斥锁则可以避免大范围改动代码,有效解决问题。原创 2024-01-17 10:27:40 · 1187 阅读 · 0 评论 -
C# 使用waveIn实现声音采集
之前实现了《C++ 使用waveIn实现声音采集》,后来C#项目也有此功能的需求,直接调用C++封装的dll是可以的。但是wimm这种基于win32 api的库,完全可以直接用C#去调用,将依赖减少到最小。原创 2023-10-24 12:18:14 · 1342 阅读 · 0 评论 -
C# 将音频PCM数据封装成wav文件
之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去了不必要的依赖。原创 2023-10-09 20:00:00 · 834 阅读 · 0 评论 -
C# 通过winmm枚举音频设备
使用C#做音频录制时需要获取音频设备信息,比如使用ffmpeg进行录制需要先获取音频设备名称,再Windows上获取音频设备的方法有不少,其中比较简单的就是使用winmm,这是一套比较旧的api但是使用方法简单,当然有个缺陷就是音频名称不能超过32个字符,超过会被截断,当然如果作为winmm的采集或播放配套使用则不会有问题。需要定义声音格式/// 声道数get;/// 采样率get;/// 位深get;以及声音设备实体/// 设备Idget;/// 设备名称get;} = "";原创 2023-10-08 16:27:43 · 913 阅读 · 0 评论 -
C# 使用com获取Windows摄像头列表
想使用ffmpeg打开摄像头,需要输入摄像头的名称,而ffmpeg本身的枚举摄像头列表功能不是接口,所以需要用其他方式获取到设备列表。C++获取视频设备列表的方法有不少,但C#获取视频设备列表的方法网上提供的解决方案基本都是依赖第三方库的,为了获取视频设备列表而引入一整个视频库实在是不太必要。经过思考,Windows的directshow和mediafudation都是基于com的,而且C#对com的支持是很好的,基于上述两点我们完全可以在C#中直接调用com。原创 2022-03-27 14:11:43 · 4989 阅读 · 0 评论 -
C#使用共享内存实现进程间的通信
进程通信有多种方式,比如socket、管道、共享内存。c#直接提供了共享内存的相关库,但直接使用起来还是不太方便,需要使用Marshal处理内存对齐以及托管非托管转换的问题,本文提供一种,将上述操作包装,借助反射的手段,实现通过类和属性的方式使用共享内存。一、.net共享内存对象MemoryMappedFile是.net的共享内存对象,一般通过MemoryMappedFile.CreateNew的方式创建共享内存,最简单的创建方式是,传入名称及大小。//申请共享内存 MemoryMapped原创 2021-09-26 14:45:08 · 8054 阅读 · 8 评论 -
C# WinForm Label 控件拓展—变色字体、超链接
前段时间做项目需要实现在文本类控件中加入超链接文字段的功能,在网上查了不少资料基本没有找到比较理想的实现方法,最后无奈只好自己实现了...需求:拓展Label控件,使其文本中的文字可以有多种颜色,添加下划线、做成超链、点击变色。变色文字的格局(间距、字体大小、换行)必须与原来一致。(注意做出改变的是部分文字,非整个文本)效果图如下:图1 图2原创 2017-09-04 15:26:00 · 6161 阅读 · 5 评论