- 博客(161)
- 资源 (47)
- 收藏
- 关注
原创 C++ 计算代码运行时间
我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文为C++版本将上述操作封装为一些对象方便使用。以上就是今天要讲的内容,本文简单对chrono进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。
2024-11-24 22:55:45
728
原创 golang 计算代码运行时间
我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文将上述操作封装为一些对象方便使用。以上就是今天要讲的内容,本文简单的对time进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。
2024-11-18 20:28:58
283
原创 Flutter 将ffmpeg动态库制做成插件
有了上一章的ffmpeg接口,我们可以很方便的通过dart调用ffmpeg,但是需要自己部署ffmpeg动态库还是比较麻烦的,尤其是多个平台多个项目时,去一个一个编写部署代码显然是不合理的。最好方式应该是将ffmpeg动态库的部署写在一个插件中,需要使用的项目直接引用插件即可。
2024-10-24 23:46:00
910
原创 C# 实现条件变量
C#提供的多进程同步对象有互斥锁和信号量,但是并没有条件变量。虽然信号量条件变量一定程度可以等效,但是具体的使用还是会有区别。比如说消息队列用条件变量就比信号量方便,用信号量要么缺乏灵活性,要么辅助代码已经和实现一个条件变量没区别了。本文提供了一种条件变量的实现方法,可以用于进程间的同步控制。
2024-07-21 23:05:34
721
原创 C# 实现跨进程消息队列
进程通信一般情况下比较少用,但是也有一些使用场景,有些做视频传输的似乎会用多进程来实现,还有在子进程中调用特定的库来避免内存泄漏,笔者最近也遇到了需要使用多进程的场景。多进程的使用最主要的就是进程间的通信,本文参考了go语言的ipc库,实现了一个基于共享内存的跨进程队列。以上就是今天要讲的内容,实现这样的一个对象,虽然代码量不多,但还是有一点难度的,很多细节需要处理,比如泛型转type以统一接口,信号量实现队列和条件变量是有差异的,用CreateFromFile才能实现跨平台。
2024-07-15 23:32:01
755
原创 Flutter 实现软鼠标
flutter在嵌入式系统中运行时,有可能遇到drm鼠标无法使用的情况,但鼠标事件却可以正常接收,此时如果有软鼠标,就可以一定程度解决问题。本文提供了一个软鼠标的简单实现。以上就是今天要讲的内容,本文实现的软鼠标还是比较简单的,当然软鼠标对性能还是有一定的影响的,比如在linux中,每次移动都会触发交换缓存进行drm显示。
2024-06-17 09:47:51
711
原创 Flutter 实现StackAllocator简化FFI局部变量的内存管理
使用Flutter通过FFI调用c库的时候,经常需要传字符串或者一些指针变量,这里变量通常都是局部变量,在一个代码块运行完成后就不需要了,我们通常用calloc进行内存申请和释放,但这也带来了一个麻烦,每个变量都需要单独释放,且字符串必须用变量进行释放,不能直接使用字面量作为参数,否则就内存泄漏了。本文提供一种针对上述问题的简化操作。我们实现一个Allocator,用于局部的内存管理,就可以省去每个变量内存释放这个步骤。salloc是一个用于管理局部变量的Allocator。
2024-06-16 16:34:51
606
原创 Flutter 简化线程Isolate的使用
flutter的线程是数据独立的,每个线程一般通过sendport来传输数据,这样使得线程调用没那么方便,本文将提供一种支持lambda启动isolate的方法,且支持捕获值类型变量,以及支持返回值。以上就是今天要讲的内容,本文的提供线程启动方法,很大程度方便了使用,尤其是支持lambda,可以在任意上下文捕获变量开启线程,执行任务,并获取返回值,用法和Future就很类似了,可以当成异步的另一种选择。
2024-06-13 12:21:13
815
原创 Flutter 简化CustomPainter的绘制
使用Flutter做界面时,有时会需要需要自绘的控件,比如异形按钮或者显示视频,我们通常可以用CustomPainter实现。但是CustomPainter是一个抽象类,需要继承并实现绘制方法,才能进行绘制。本文对CustomPainter进行了一个简单的封装,简化绘制操作。
2024-06-11 17:47:50
959
原创 Flutter 实现dispose探测控件
开发flutter一般会用状态管理工具,用了状态管理后大部分控件都会是StatelessWidget,StatefulWidget有dispose重载获取控件销毁时机,但StatelessWidget则没有,此时我们要获取控件销毁的时机就需要另寻他法了。这是一个控件用于帮助探测无状态控件的销毁时机,有点类似用于探测控件的显示和隐藏。/// 创建人: xin/// 创建时间: 2023/6/15 13:44/// 注释: 销毁探测控件final S?tag;//自定义数据this.tag,
2024-06-10 13:44:28
1129
原创 Flutter 使用ffigen生成ffmpeg的dart接口
前面几章介绍了flutter各种视频渲染的方法,视频渲染前显然是需要先获取视频流并解码,这些操作就需要用到ffmpeg,前面的几章的解码都是通过c语言调用ffmpeg,再将数据传输到dart渲染的。本章将提供一种生成ffmpeg dart接口的方法,直接用dart就可以调用ffmpeg进行拉流并解码然后显示。
2024-06-08 12:09:39
2140
1
原创 安卓部署ffmpeg全平台so并实现命令行调用
前面的章节实现了ffmpeg全平台so的生成,接下来的步骤就是部署以及使用了,部署so还是比较简单的,用gradle和cmake都可以部署,部署好了就可以直接使用了,如果需要c++进行封装一层,则需要链接,对cmake熟悉的话链接也是比较简单的。以上就是今天讲述的内容,ffmpeg的so部署还是比较容易的,但是命令行的调用会麻烦一些,尤其是要解决ffmpeg退出问题,在c++中比较好解决,java理论上也比较好实现,如果在dart中则会比较麻烦,因为dart的方法通常不能跨线程调用,多线程的情况会出问题。
2024-05-17 10:56:58
1453
原创 C++ 将字符串解析为argc、argv
一般开启子进程的时候,需要传参数,通常直接传输命令行字符串,进入main会自动转换为argc、argv的形式。有些时候会需要需要自己解析命令行的情况,通常采用split空格就可以了,但如果需要支持双引号则会麻烦一些。以上就是今天要讲的内容,本文的实现是比较简单的,用的方法算是比较巧妙,只要支持split就可以用本文的方法实现命令行的解析。
2024-05-16 11:16:26
582
原创 Shell生成支持x264的ffmpeg安卓全平台so
前两张实现了ffmpeg全平台so的生成,但是ffmpeg依赖的第三方库是需要另外编译的,所以本章将提供编译x264库并加入ffmpeg的方法。本章提供的脚本在ubuntu以及windows的wsl、msys2都适用。以上就是今天讲述的内容,生成ffmpeg安卓so其实并不难,如果熟悉交叉编译以及shell,编译起来还是比较简单的,尤其是想生成最小或者完整依赖的包,最好还是自己生成。
2024-05-09 09:25:57
1092
原创 C# wpf 运行时替换方法实现mvvm自动触发刷新
我们知道,使用wpf的绑定功能,代码触发界面改变时,需要在属性的setter触发PropertyChanged事件,以达到界面刷新的效果。上一章我们简化了触发流程,但是依然需要在每个属性的setter中调用方法。本章将再进一步简化,实现setter不需要调方法就可以自动触发界面刷新。定义的用于替换属性setter的方法,确保参数类型兼容。设置NoInlining确保不会被内联优化失去函数地址。再方法中触发RaisePropertyChangedEvent。
2024-04-29 11:54:44
1376
2
原创 C# wpf 嵌入外部程序
实现嵌入各种窗口控件后,其实还会有一种需求:嵌入外部程序,我们有时可能需要嵌入一个浏览器或者或者播放器等一些已有的程序,其嵌入原理也和前面差不多,只要能获取进程的主窗口句柄,然后将窗口嵌入。定义一个依赖属性,提供给xaml设置进程运行的命令行/// 进程运行的命令行以上就是今天要讲的内容,嵌入外部程序还是相对比较容易实现的,而且也有一定的使用场景。创建进程,并能获取到进程的主窗口句柄即可。另外要注意的是管理子进程的退出,其他都问题不大。
2024-04-07 09:56:55
1759
原创 C# 实现子进程跟随主进程关闭
多进程开发经常会遇到主进程关闭,子进程需要跟随主进程一同关闭。比如调ffmpeg命令行实现的录屏程序,录屏程序关闭,ffmpeg进程也需要退出。我们通常在程序关闭时调用Process.Kill()杀掉fmpeg进程即可。但是如果是强制或异常关闭录屏程序,ffmpeg将会变成僵尸进程残留在系统中。本文将提供一种解决此类问题的方法。
2024-04-04 01:04:10
1302
1
原创 C# wpf 实现底部嵌入HwndHost
前面三章内容是笔者基于本章研发过程中的附带产物,但是意外的发现第三章可嵌入wpf控件后,本章的意义就变得不那么大了。本章讲述如何从底部嵌入hwnd窗口,以此来做到嵌入窗口不覆盖wpf控件的效果,这种实现思路参考了flutter的一个插件flutter_native_view,其内部实现就用了这种方式。对于wpf实现会复杂一些,因为提供自绘没有BlendMode之类的东西,无法直接消除底部画面,能够使用的方式是Clip,这种方式限制比较多。不过最终还是实现了功能。
2024-03-30 00:09:06
1608
1
原创 C# wpf 嵌入wpf控件
通过前面的章节我们了解到了如何嵌入Hwnd窗口以及WinForm控件,但是嵌入的控件存在覆盖wpf控件的情况,嵌入控件上面无法显示王鹏飞控件,对UI的布局有一定的影响。本文提供一种解决方法,将wpf控件通过HwndHost的方式嵌入到wpf界面中,以实现HwndHost控件上显示wpf控件的功能。因为默认嵌入控件的承载Window使用了AllowsTransparency,如果需要自己定制窗口属性则可以直接使用Window。
2024-03-27 13:36:51
1801
原创 C# wpf 嵌入winform控件
wpf的强大界面能力,再加上winform的性能以及灵活性,那基本上什么界面都能够做的很好。比如视频渲染用winform,功能按键用wpf,就能达到性能和界面效果和完美结合。wpf有直接的控件支持嵌入winform控件,使用方法也很简单,网上很容易搜到。之所以编写这篇文章,主要用于记录。
2024-03-27 03:00:00
2218
1
原创 C# wpf 嵌入hwnd窗口
wpf是Direct UI,窗口中只有一个hwnd句柄,大部分控件都是直接在上面绘制的。当我们需要使用不同的渲染方式进行绘制时,就会和控件绘制产生冲突。比如使用opengl渲染3d图形或者视频时,直接在窗口绘制就会出现闪烁,与控件相互覆盖。要解决这个问题就需要,添加一个新的hwnd窗口或控件嵌入wpf窗口中,我们可以通过HwndHost就可以实现这样的功能。
2024-03-26 19:56:00
1609
原创 c语言 实现切片数组-拓展栈操作
有了上一章的切片后,已经有了动态数组功能,接下来需要实现栈的功能,在go语言中切片可以直接当栈使用,在c语言中则需要添加一个额外操作,弹出栈顶元素。以上就是今天要讲的内容,拓展栈操作还是比较简单的,而且统一一套接口,即可以当作数组也可以当作栈使用。
2024-03-25 09:40:52
505
原创 c语言 实现切片数组
由于c语言没有集合类的标准库,需要用时只能自己实现,由于c语言没有泛型,使得实现的集合类接口通常比较另类,很多时候都需要二级指针作为参数,且不支持字面量作为参数,使用时心智负担较重。本文参考go语言的slice,找到了一种非常简化的动态数组接口,可以极大的方便使用。
2024-03-25 01:21:13
1697
原创 C# wpf 使用GDI实现截屏
wpf截屏时通常可以采用gdi+,调用起来比较方便。使用gdi也能实现截屏,截屏数据也能转成BitmapSource对象,当然调用流程会复杂一些,而且需要引入win32方法,唯一比较容易的就是可以直接绘制异或鼠标。以上就是今天要讲的内容,本文实现了的GDI截屏与GDI+对比性能略差一些,但也是可以一定程度满足使用,比如用来截屏或者制作放大镜。而且有一个好处是可以做到无额外依赖。总的来说,可以作为一种备选方案或者测试方案。
2024-03-14 00:58:37
1451
原创 C# Stopwatch计算代码运行时间
我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文将上述操作封装为一些对象方便使用。以上就是今天要讲的内容,本文简单的Stopwatch进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。
2024-03-13 01:07:54
1110
原创 Windows C/C++ 任意线程通过hwnd将操作发送到UI线程执行
以上就是今天要讲的内容,本文仅仅简单的实现了通用的线程invoke,且只支持同步,通用的异步invoke实现稍微复杂些(基本实现的方式则比较简单),以后有空再做。总的来说,有了本文的代码很大程度的方便了使用,尤其是一个新的项目突然需要invoke功能,按照基本实现的方式在窗口中写一遍是很麻烦的,而优化的实现则可以直接复用,调用invoke即可。
2024-03-09 22:58:54
652
原创 C# wpf利用Clip属性实现截屏框
第二章已经实现过截屏框,实现方法相对简单,也仅支持矩形框。最近使用wpf的clip时发现了一种用法,可以实现穿透效果。那显然我们基于clip也能实现截屏窗口,而且支持任意形状。以上就是今天要讲的内容,有了之前的基础本文实现起来相对容易,当前目前的也是比较初步的功能,但灵活性是比DockPanel要好的,尤其是支持任意形状,这样就有利于后期划线截屏的实现了。
2024-01-22 18:01:41
1068
6
原创 C# 实现单线程异步互斥锁
C#对异步的支持越来越成熟,async、await简化了代码也提高了可读性,但由于在一段上下文中有了异步操作,意味着这段操作可能会被同时重复调用,如果本身没有被设计可以重复调用的情况下,就很可能会出问题。以上就是今天要讲的内容,本文简单的实现了单线程的异步互斥锁,实现起来相对简单,但作用还是比较大的。虽然说有些情况的异步是可以在前期设计上避免同时调用,比如登录按钮点击后出现蒙板不允许再次点击,但是对于已存在的代码出现了同时调用问题,此时有互斥锁则可以避免大范围改动代码,有效解决问题。
2024-01-17 10:27:40
1495
原创 C# wpf 获取控件刷新的时机
做wpf开发不像mfc控件的刷新相对同步,wpf的控件改变宽高或者可见性后在下一行代码不会立刻看到效果,而且也没有一种事件可以获取确切的界面刷新后的时机。如果只是进行延迟等待,在不同机器效果是不同的,而且也并没有具体标识说明已刷新界面,这就导致某些场景的功能实现起来会比较困难。本文提供一种获取控件真正界面刷新时机的方法。以上就是今天要讲的内容,本文的做法是笔者曾经在某个论坛看到的建议,然后去尝试实现发现是可行的,后来进一步封装为异步方法。
2024-01-16 17:59:35
1133
原创 C# wpf 实现任意控件(包括窗口)更多调整大小功能
上一章我们已经实现了任意控件统一的拖动调整功能,能够方便的给任意控件设置拖动调整大小。开发过程中发现还是有些功能可以继续拓展的,比如cs代码触发拖动、自定义模板、交叉拖动、限制拖动范围等功能。有功能实现起来不算太容易,却很有实用价值。
2024-01-15 15:12:13
3882
4
原创 C# wpf 实现任意控件(包括窗口)更多拖动功能
上一章我们以及实现了任意控件统一的拖动功能,以及能够方便的给任意控件添加拖动了。开发过程中发现还是有些功能可以继续拓展的,比如cs代码中移动控件、响应事件后触发拖动、限制拖动范围等功能。
2023-11-08 00:49:26
1830
原创 C# 使用waveIn实现声音采集
之前实现了《C++ 使用waveIn实现声音采集》,后来C#项目也有此功能的需求,直接调用C++封装的dll是可以的。但是wimm这种基于win32 api的库,完全可以直接用C#去调用,将依赖减少到最小。
2023-10-24 12:18:14
1698
原创 C# 将音频PCM数据封装成wav文件
之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去了不必要的依赖。
2023-10-09 20:00:00
976
1
原创 C# 通过winmm枚举音频设备
使用C#做音频录制时需要获取音频设备信息,比如使用ffmpeg进行录制需要先获取音频设备名称,再Windows上获取音频设备的方法有不少,其中比较简单的就是使用winmm,这是一套比较旧的api但是使用方法简单,当然有个缺陷就是音频名称不能超过32个字符,超过会被截断,当然如果作为winmm的采集或播放配套使用则不会有问题。需要定义声音格式/// 声道数get;/// 采样率get;/// 位深get;以及声音设备实体/// 设备Idget;/// 设备名称get;} = "";
2023-10-08 16:27:43
1093
原创 C# wpf 实现桌面放大镜
做桌面截屏功能时需要放大镜,显示鼠标所在位置的放大图像,在wpf中使用Bursh的ViewBox属性可以实现图像放大,桌面的画面则需要截屏了,总的来说还是比较容易实现的。以上就是今天要讲的内容,本文仅仅简单介绍了实现桌面放大镜的方法,关键在于使用Viewbox,截屏的功能因为有现成的所以比较简单,当然本文的方法是简单实现,其实还是可以优化的,尤其是截屏是可以复用Bitmap对象的。总的来说,wpf实现桌面放大镜还是比较容易的,而且效果也很不错。
2023-09-09 15:34:21
1562
6
原创 C# wpf 实现截屏框热键截屏功能
在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里不少的细节需要处理,比如响应热键弹出截屏界面、点击拖出截屏框、截屏区域任意反向拖动、处理不同dpi下的坐标位置等等。以上就是今天要讲的内容,本文介绍了wpf截屏框热键截屏的方法。
2023-09-07 00:41:17
1577
1
原创 使用eXosip+ffmpeg、ffplay命令行实现sip客户端
使用sip做视频通话时,会遇到需要使用ip摄像头作为视频源的情况,查了资料使用pjsip通常也需要改源码。pjsip包含的功能很完整,有点过于庞大,很多功能并不需要。而且笔者有一个想法,只要有个能处理sip交互的库+音视频这块另外实现,比如和先使用ffmpeg和ffplay命令行作为音视频测试,成功后再写代码实现。本文就是测试成功的方案,真正灵活的方式还是要写代码调ffmpeg,本文更多的是提供一种实现思路。//流类型 enum StreamType {
2023-08-07 00:48:53
2232
原创 Flutter 实现按位置大小比例布局的控件
做视频监控项目时需要需要展示多分屏,比如2x2、3x3、414等等,如果每一种分屏都单独实现会很麻烦,而且不能支持用户定制。最好的方式还是实现一个通用的分屏容器,而且采样比例计算位置大小,可以适配任意尺寸。
2023-08-04 11:39:41
2784
原创 Flutter 使用texture_rgba_renderer实现桌面端渲染视频
前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,笔者最近刚好找到了pub上对texture封装的插件,直接提供dart代码调用texture进行rgba的渲染,当然只支持桌面端,即Windows、Linux、Macos,但依然是很方便了。本文实现了Windows、Linux的视频渲染。
2023-07-29 22:20:31
1744
5
原创 Flutter Windows通过嵌入Native窗口实现渲染视频
使用flutter在Windows上渲染视频,目前掌握的至少有2种方法(第二章、第四章),但是性能都不是最佳,而且需要将数据转换成rgba才能渲染。如果能使用win32窗口,直接通过句柄渲染,那就可以达到与原生Windows渲染使用一致的效果,可以使用sdl渲染yuv,以及dxva2解码后d3d9表面直接渲染到窗口全程在gpu上操作。本文将介绍如何在flutter程序嵌入win32窗口并且渲染视频。但是需要注意的是目前的实现只支持win10及以上版本。
2023-07-22 01:00:49
1937
C# 基于共享内存实现跨进程队列
2024-07-15
Flutter 使用ffigen生成ffmpeg的dart接口
2024-06-08
C# wpf 运行时替换方法实现mvvm自动触发刷新
2024-04-29
C# wpf 实现底部嵌入HwndHost
2024-04-05
C# wpf 使用GDI实现截屏
2024-03-18
C# wpf 实现任意控件(包括窗口)更多调整大小功能
2024-01-16
ffmpeg4.3.6安卓全平台so动态库
2023-11-17
ffmpeg5.1.4.安卓全平台so动态库
2023-11-17
ffmpeg6.1.1安卓全平台so动态库
2023-11-16
C# wpf 实现任意控件(包括窗口)更多拖动功能
2023-11-08
C# 使用waveIn实现声音采集
2023-10-30
C# wpf 实现截屏框热键截屏功能
2023-09-07
使用eXosip+ffmpeg、ffplay命令行实现sip客户端
2023-08-07
Flutter 使用texture-rgba-renderer实现桌面端渲染视频
2023-07-29
Flutter Windows通过嵌入Native窗口实现渲染视频
2023-07-22
使用ffmpeg和sdl实现多路音频播放
2023-06-06
C/C++ 高精度(加减乘除)算法二进制优化
2023-04-23
使用ffmpeg实现单线程异步的视频播放器
2022-12-13
Flutter 使用FFI+CustomPainter实现全平台渲染视频
2022-11-23
Flutter 使用Texture实现Linux渲染视频
2022-11-20
Flutter 使用Texture实现Android渲染视频
2022-11-20
Flutter 使用Texture实现Windows渲染视频
2022-11-18
使用ffmpeg解码音频sdl(push)播放
2022-10-29
C# wpf使用ffmpeg命令行实现录屏
2022-10-29
使用ffmpeg解码视频渲染到sdl窗口
2022-07-22
C# wpf style中实现可定制的自定义标题栏
2022-07-13
C# wpf 实现截屏框截屏功能
2022-07-02
C# wpf 使用DockPanel实现截屏框
2022-07-01
ffmpeg7.0安卓全平台so动态库
2022-06-15
使用gdi实现多路视频流合并
2022-06-10
C# wpf 实现自定义界面操作分离的MessageBox
2022-05-27
C# wpf 使用ffplay实现视频播放器
2022-05-22
ffplay自定义播放器封装C#接口
2022-05-14
C++ 解析aac-adts的头部信息
2022-05-08
C++ 读取h264中的nalu
2022-05-08
使用mp4v2将h264和aac封装成mp4
2022-05-07
C# wpf 使用d3d渲染dxva2解码数据
2022-04-17
C++ 使用fdk-aac对音频编码
2022-02-02
使用fdk-aac将wav编码为aac
2022-01-30
C++ 使用Intel Media SDK 实现H.264硬编码
2022-01-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人