自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(146)
  • 资源 (47)
  • 收藏
  • 关注

原创 C# wpf 嵌入外部程序

实现嵌入各种窗口控件后,其实还会有一种需求:嵌入外部程序,我们有时可能需要嵌入一个浏览器或者或者播放器等一些已有的程序,其嵌入原理也和前面差不多,只要能获取进程的主窗口句柄,然后将窗口嵌入。定义一个依赖属性,提供给xaml设置进程运行的命令行/// 进程运行的命令行以上就是今天要讲的内容,嵌入外部程序还是相对比较容易实现的,而且也有一定的使用场景。创建进程,并能获取到进程的主窗口句柄即可。另外要注意的是管理子进程的退出,其他都问题不大。

2024-04-07 09:56:55 1061 1

原创 C# 实现子进程跟随主进程关闭

多进程开发经常会遇到主进程关闭,子进程需要跟随主进程一同关闭。比如调ffmpeg命令行实现的录屏程序,录屏程序关闭,ffmpeg进程也需要退出。我们通常在程序关闭时调用Process.Kill()杀掉fmpeg进程即可。但是如果是强制或异常关闭录屏程序,ffmpeg将会变成僵尸进程残留在系统中。本文将提供一种解决此类问题的方法。

2024-04-04 01:04:10 544

原创 C# wpf 实现底部嵌入HwndHost

前面三章内容是笔者基于本章研发过程中的附带产物,但是意外的发现第三章可嵌入wpf控件后,本章的意义就变得不那么大了。本章讲述如何从底部嵌入hwnd窗口,以此来做到嵌入窗口不覆盖wpf控件的效果,这种实现思路参考了flutter的一个插件flutter_native_view,其内部实现就用了这种方式。对于wpf实现会复杂一些,因为提供自绘没有BlendMode之类的东西,无法直接消除底部画面,能够使用的方式是Clip,这种方式限制比较多。不过最终还是实现了功能。

2024-03-30 00:09:06 1065 2

原创 C# wpf 嵌入wpf控件

通过前面的章节我们了解到了如何嵌入Hwnd窗口以及WinForm控件,但是嵌入的控件存在覆盖wpf控件的情况,嵌入控件上面无法显示王鹏飞控件,对UI的布局有一定的影响。本文提供一种解决方法,将wpf控件通过HwndHost的方式嵌入到wpf界面中,以实现HwndHost控件上显示wpf控件的功能。因为默认嵌入控件的承载Window使用了AllowsTransparency,如果需要自己定制窗口属性则可以直接使用Window。

2024-03-27 13:36:51 1398

原创 C# wpf 嵌入winform控件

wpf的强大界面能力,再加上winform的性能以及灵活性,那基本上什么界面都能够做的很好。比如视频渲染用winform,功能按键用wpf,就能达到性能和界面效果和完美结合。wpf有直接的控件支持嵌入winform控件,使用方法也很简单,网上很容易搜到。之所以编写这篇文章,主要用于记录。

2024-03-27 03:00:00 722 1

原创 C# wpf 嵌入hwnd窗口

wpf是Direct UI,窗口中只有一个hwnd句柄,大部分控件都是直接在上面绘制的。当我们需要使用不同的渲染方式进行绘制时,就会和控件绘制产生冲突。比如使用opengl渲染3d图形或者视频时,直接在窗口绘制就会出现闪烁,与控件相互覆盖。要解决这个问题就需要,添加一个新的hwnd窗口或控件嵌入wpf窗口中,我们可以通过HwndHost就可以实现这样的功能。

2024-03-26 19:56:00 906

原创 c语言 实现切片数组-拓展栈操作

有了上一章的切片后,已经有了动态数组功能,接下来需要实现栈的功能,在go语言中切片可以直接当栈使用,在c语言中则需要添加一个额外操作,弹出栈顶元素。以上就是今天要讲的内容,拓展栈操作还是比较简单的,而且统一一套接口,即可以当作数组也可以当作栈使用。

2024-03-25 09:40:52 305

原创 c语言 实现切片数组

由于c语言没有集合类的标准库,需要用时只能自己实现,由于c语言没有泛型,使得实现的集合类接口通常比较另类,很多时候都需要二级指针作为参数,且不支持字面量作为参数,使用时心智负担较重。本文参考go语言的slice,找到了一种非常简化的动态数组接口,可以极大的方便使用。

2024-03-25 01:21:13 875

原创 C# wpf 使用GDI实现截屏

wpf截屏时通常可以采用gdi+,调用起来比较方便。使用gdi也能实现截屏,截屏数据也能转成BitmapSource对象,当然调用流程会复杂一些,而且需要引入win32方法,唯一比较容易的就是可以直接绘制异或鼠标。以上就是今天要讲的内容,本文实现了的GDI截屏与GDI+对比性能略差一些,但也是可以一定程度满足使用,比如用来截屏或者制作放大镜。而且有一个好处是可以做到无额外依赖。总的来说,可以作为一种备选方案或者测试方案。

2024-03-14 00:58:37 1078

原创 C# Stopwatch计算代码运行时间

我们编写程序时,有时需要统计代码运行时间,比如记录视频解码耗时,以及视频的播放帧率等以确认性能满足,或者记录代码运行时长作为优化的依据。通常的做法是定义一个变量记录起始时间,在结束时获取当前时间减去起始时间,本文将上述操作封装为一些对象方便使用。以上就是今天要讲的内容,本文简单的Stopwatch进行了一个封装,主要目的是方便调用,而且也将均值计算出来了,这样有利于对数据的统计,总的来说还是有一定适用场景的。

2024-03-13 01:07:54 480

原创 Windows C/C++ 任意线程通过hwnd将操作发送到UI线程执行

以上就是今天要讲的内容,本文仅仅简单的实现了通用的线程invoke,且只支持同步,通用的异步invoke实现稍微复杂些(基本实现的方式则比较简单),以后有空再做。总的来说,有了本文的代码很大程度的方便了使用,尤其是一个新的项目突然需要invoke功能,按照基本实现的方式在窗口中写一遍是很麻烦的,而优化的实现则可以直接复用,调用invoke即可。

2024-03-09 22:58:54 383

原创 C# wpf利用Clip属性实现截屏框

第二章已经实现过截屏框,实现方法相对简单,也仅支持矩形框。最近使用wpf的clip时发现了一种用法,可以实现穿透效果。那显然我们基于clip也能实现截屏窗口,而且支持任意形状。以上就是今天要讲的内容,有了之前的基础本文实现起来相对容易,当前目前的也是比较初步的功能,但灵活性是比DockPanel要好的,尤其是支持任意形状,这样就有利于后期划线截屏的实现了。

2024-01-22 18:01:41 743 6

原创 C# 实现单线程异步互斥锁

C#对异步的支持越来越成熟,async、await简化了代码也提高了可读性,但由于在一段上下文中有了异步操作,意味着这段操作可能会被同时重复调用,如果本身没有被设计可以重复调用的情况下,就很可能会出问题。以上就是今天要讲的内容,本文简单的实现了单线程的异步互斥锁,实现起来相对简单,但作用还是比较大的。虽然说有些情况的异步是可以在前期设计上避免同时调用,比如登录按钮点击后出现蒙板不允许再次点击,但是对于已存在的代码出现了同时调用问题,此时有互斥锁则可以避免大范围改动代码,有效解决问题。

2024-01-17 10:27:40 859

原创 C# wpf 获取控件刷新的时机

做wpf开发不像mfc控件的刷新相对同步,wpf的控件改变宽高或者可见性后在下一行代码不会立刻看到效果,而且也没有一种事件可以获取确切的界面刷新后的时机。如果只是进行延迟等待,在不同机器效果是不同的,而且也并没有具体标识说明已刷新界面,这就导致某些场景的功能实现起来会比较困难。本文提供一种获取控件真正界面刷新时机的方法。以上就是今天要讲的内容,本文的做法是笔者曾经在某个论坛看到的建议,然后去尝试实现发现是可行的,后来进一步封装为异步方法。

2024-01-16 17:59:35 789

原创 C# wpf 实现任意控件(包括窗口)更多调整大小功能

上一章我们已经实现了任意控件统一的拖动调整功能,能够方便的给任意控件设置拖动调整大小。开发过程中发现还是有些功能可以继续拓展的,比如cs代码触发拖动、自定义模板、交叉拖动、限制拖动范围等功能。有功能实现起来不算太容易,却很有实用价值。

2024-01-15 15:12:13 2707

原创 C# wpf 实现任意控件(包括窗口)更多拖动功能

上一章我们以及实现了任意控件统一的拖动功能,以及能够方便的给任意控件添加拖动了。开发过程中发现还是有些功能可以继续拓展的,比如cs代码中移动控件、响应事件后触发拖动、限制拖动范围等功能。

2023-11-08 00:49:26 1084

原创 C# 使用waveIn实现声音采集

之前实现了《C++ 使用waveIn实现声音采集》,后来C#项目也有此功能的需求,直接调用C++封装的dll是可以的。但是wimm这种基于win32 api的库,完全可以直接用C#去调用,将依赖减少到最小。

2023-10-24 12:18:14 1073

原创 C# 将音频PCM数据封装成wav文件

之前实现了《C++ 将音频PCM数据封装成wav文件》,最近将其改成了C#版本。使用C#实现录音功能时还是需要写wav文件的,直接用C#实现也是比较简单的,这样可以免去了不必要的依赖。

2023-10-09 20:00:00 782

原创 C# 通过winmm枚举音频设备

使用C#做音频录制时需要获取音频设备信息,比如使用ffmpeg进行录制需要先获取音频设备名称,再Windows上获取音频设备的方法有不少,其中比较简单的就是使用winmm,这是一套比较旧的api但是使用方法简单,当然有个缺陷就是音频名称不能超过32个字符,超过会被截断,当然如果作为winmm的采集或播放配套使用则不会有问题。需要定义声音格式/// 声道数get;/// 采样率get;/// 位深get;以及声音设备实体/// 设备Idget;/// 设备名称get;} = "";

2023-10-08 16:27:43 853

原创 C# wpf 实现桌面放大镜

做桌面截屏功能时需要放大镜,显示鼠标所在位置的放大图像,在wpf中使用Bursh的ViewBox属性可以实现图像放大,桌面的画面则需要截屏了,总的来说还是比较容易实现的。以上就是今天要讲的内容,本文仅仅简单介绍了实现桌面放大镜的方法,关键在于使用Viewbox,截屏的功能因为有现成的所以比较简单,当然本文的方法是简单实现,其实还是可以优化的,尤其是截屏是可以复用Bitmap对象的。总的来说,wpf实现桌面放大镜还是比较容易的,而且效果也很不错。

2023-09-09 15:34:21 1224 6

原创 C# wpf 实现截屏框热键截屏功能

在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里不少的细节需要处理,比如响应热键弹出截屏界面、点击拖出截屏框、截屏区域任意反向拖动、处理不同dpi下的坐标位置等等。以上就是今天要讲的内容,本文介绍了wpf截屏框热键截屏的方法。

2023-09-07 00:41:17 1133

原创 使用eXosip+ffmpeg、ffplay命令行实现sip客户端

使用sip做视频通话时,会遇到需要使用ip摄像头作为视频源的情况,查了资料使用pjsip通常也需要改源码。pjsip包含的功能很完整,有点过于庞大,很多功能并不需要。而且笔者有一个想法,只要有个能处理sip交互的库+音视频这块另外实现,比如和先使用ffmpeg和ffplay命令行作为音视频测试,成功后再写代码实现。本文就是测试成功的方案,真正灵活的方式还是要写代码调ffmpeg,本文更多的是提供一种实现思路。//流类型 enum StreamType {

2023-08-07 00:48:53 1718

原创 Flutter 实现按位置大小比例布局的控件

做视频监控项目时需要需要展示多分屏,比如2x2、3x3、414等等,如果每一种分屏都单独实现会很麻烦,而且不能支持用户定制。最好的方式还是实现一个通用的分屏容器,而且采样比例计算位置大小,可以适配任意尺寸。

2023-08-04 11:39:41 2125

原创 Flutter 使用texture_rgba_renderer实现桌面端渲染视频

前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,笔者最近刚好找到了pub上对texture封装的插件,直接提供dart代码调用texture进行rgba的渲染,当然只支持桌面端,即Windows、Linux、Macos,但依然是很方便了。本文实现了Windows、Linux的视频渲染。

2023-07-29 22:20:31 1375 5

原创 Flutter Windows通过嵌入Native窗口实现渲染视频

使用flutter在Windows上渲染视频,目前掌握的至少有2种方法(第二章、第四章),但是性能都不是最佳,而且需要将数据转换成rgba才能渲染。如果能使用win32窗口,直接通过句柄渲染,那就可以达到与原生Windows渲染使用一致的效果,可以使用sdl渲染yuv,以及dxva2解码后d3d9表面直接渲染到窗口全程在gpu上操作。本文将介绍如何在flutter程序嵌入win32窗口并且渲染视频。但是需要注意的是目前的实现只支持win10及以上版本。

2023-07-22 01:00:49 1208

原创 Flutter 实现任意控件拖动

使用flutter开发是需要控件能拖动,比如画板中的元素,或者工具条,搜索框,每个都单独去实现拖动还是比较麻烦的,将拖动功能封装成一个控件,需要的时候直接使用拖动控件作为父控件这样就方便很多了。以上就是今天要讲的内容,本文提供了一种简单的拖动控件实现,尤其是封装成容器后使用变得很简单,主要在于能想到translate变换可以改变位置,在了解通过GlobalKey获取控件大小以及获取控件大小的方法,很容易就实现拖动功能了。

2023-07-01 14:37:38 2593 2

原创 使用ffmpeg和sdl实现多路音频混合播放

音频的播放通常是单例的,在进程内通常一个播放设备只能打开一次,且只支持一个写入。写播放器的时候,会遇到需要实现多开同时播放多个视频,比如视频剪辑工具的多轨道播放。这个时候就需要采用一定的方法,比如音频混合。本文将提供一种基于ffmpeg和sdl实现的音频多路混合的方法。以上就是今天要的内容了,采用ffmpeg结合sdl实现音频多路播放还是比较容易的,都有相关的接口去调用,只要设计实现整体的上层逻辑即可。

2023-06-06 23:25:35 527

原创 C/C++ 高精度(加减乘除)算法二进制优化

上一章《C/C++ 高精度(加减乘除)算法压位优化》实现了优化的高精度计算,采用int32的整型数组每个元素可以储存9个10进制数字,想要再进一步优化计算速度,可以改变数据存储方式,采用二进制存储数字。依然采用int32数组其元素通过二进制来存储数字,这样做不仅运算效率高,而且空间利用率也达到了最高。以上就是今天要讲的内容,二进制存储优化在对比压9位优化速度还有提升,而且存储方式与整型一样,很好的利用了空间。相比较与压9位算法,二进制算法对于乘法和除法的提升较大,尤其是长数据运算的提升更为明显。

2023-04-23 22:34:08 1536

原创 ffmpeg 将视频帧转换成jpg、png等图片

有时播放实时流的时候有截图的需求,需要将解码出来的图片保存本地或上传服务器,这时就需要将avframe中的数据编码成png、jpg等格式的图片,我们使用ffmpeg的相关编码器就可以实现功能。//解码得到的视频数据 AVFrame * frame = allocFrame(frameData , 640 , 360 , AV_PIX_FMT_YUV420P);//此方法定义在示例1中 av_frame_free(& frame);

2023-03-28 12:15:14 5268

原创 C/C++ 高精度(加减乘除)算法压位优化

由于上一章《C/C++ 高精度(加减乘除)算法简单实现》实现了基本的高精度计算,数组的每个元素存储一位10进制的数字。这样的存储方式并不是最优的,32位的整型其实至少可以存储9位高精度数字,数组元素存储更多的位数就是压位优化。本文将展示压位优化的原理以及压9位的实现和示例。以上就是今天要讲的内容,压位优化性能提升是比较显著的,而且实现也很容易,大部分逻辑是一致的只是底数变大了而已。从性能测试结果来看所有计算至少由4倍的提升,乘法性能提升较大有可能是测试方法不严重,这个待以后验证。

2023-01-30 22:47:00 898 1

原创 sdl 渲染旋转视频的方法

一般情况下播放视频时不需要旋转,但是如果是移动端录制的视频有时会出现rotate参数,且视频宽高也是互换的,如果直接渲染则会出现视频90度倒转的问题。所以渲染视频时需要获取包的metadata中的rotate参数,计算出旋转角度,按照旋转角度渲染视频才能显示正常的画面。

2022-12-15 01:04:08 1430 2

原创 使用ffmpeg实现单线程异步的视频播放器

ffplay是一个不错的播放器,是基于多线程实现的,播放视频时一般至少有4个线程:读包线程、视频解码线程、音频解码线程、视频渲染线程。如果需要多路播放时,线程不可避免的有点多,比如需要播放8路视频时则需要32个线程,这样对性能的消耗还是比较大的。于是想到用单线程实现一个播放器,经过实践发现是可行的,播放本地文件时可以做到完全单线程、播放网络流时需要一个线程实

2022-12-12 23:53:27 1750 2

原创 C/C++ 高精度(加减乘除)算法简单实现

由于上一章《C/C++ 高精度(加减乘除)算法实现》是基于工程项目考虑实现的,也做了一定的优化,实现过程较为复杂。不利于移植和使用,且比较难以理解,时间一长代码也容易忘记,所以重新编写了一个简化的版本,方便以后需要时拷贝使用。以上就是今天要讲的内容,本文提供的是较为简化的实现,且每个方法基本是独立的,可单独拿来使用,用法也比较简单,由于采用数组第一个元素存储长度,接口就变得很简洁,使用起来也方便了很多。

2022-12-12 17:40:06 1134

原创 Flutter 使用FFI+CustomPainter实现全平台渲染视频

前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,于是有了一个设想,使用c++实现跨平台的视频采集,通过ffi将数据传到dart界面,通过画布控件将图像绘制出来。最终通过测试发现能用的方案就是ffi结合CustomPainter实现视频渲染,这种方式实现的视频渲染可以做到**一套代码所有平台(除web外)都可运行**。

2022-11-23 00:46:38 2453

原创 Windows C++程序运行过程中生成dump文件

开发Windows C++程序跟踪异常是比较重要的功能,一般情况都需要进行全局异常捕获,并且生成dump文件。而且C++没有运行时直接获取堆栈信息的方法,返回错误或者异常处理时无法记录到堆栈信息,如果这个时候能够生成dump,对于bug分析是非常有利的。

2022-11-09 10:06:13 2490

原创 C++ 实现一个消息队列

消息队列在多线程的场景有时会用到,尤其是线程通信跨线程调用的时候,就可以使用消息队列进行通信。C++实现一个能用的消息队列还是比较简单的,只需要一个队列一个互斥变量和一个条件变量,这些在标准库中都有提供。基于曾经写过的项目,总结出来最简单的消息队列的实现将在下文中介绍。

2022-10-29 13:11:26 9893

原创 c语言 将音视频时钟同步封装成通用模块

编写视频播放器时需要实现音视频的时钟同步,这个功能是不太容易实现的。虽然理论通常是知道的,但是不同过实际的调试很难写出可用的时钟同步功能。其实也是有可以参考的代码,ffplay中实现了3种同步,但实现逻辑较为复杂,比较难直接提取出来使用。笔者通过参考ffplay在自己的播放器中实现了时钟同步,参考。在实现过程中发现此功能可以做成一个通用的模块,在任何音视频播放的场景都可以使用。

2022-09-21 23:12:38 1489

原创 使用ffmpeg和sdl播放视频实现时钟同步

使用ffmpeg和sdl实现播放视频后,需要再实现时钟同步才能正常的播放视频,尤其是有音频的情况,我们通常需要将视频同步到音频来确保音画同步。视频的时钟同步有时是很难理解的,甚至知道了理论并不能确保实现,需要通过实践获取各种参数以及具体的实现逻辑。本文将介绍一些视频时钟同步的具体实现方式。

2022-08-21 14:56:33 1815 1

原创 使用ffmpeg解码音频sdl(pull)播放

我们上一章讲了,ffmpeg解码sdl push的方式播放音频,调用流程简单,但是实现起来还是有点难度的。接下来讲的就是使用pull的方式播放音频,pull的方式即是使用回调的方式播放音频,在打开SDL音频设备的时候传入一个回调方法,SDL内部会按照一定频率回调这个方法,我们在回调方法中往音频缓冲写数据就能够播放声音了。............

2022-08-11 00:12:09 1081

原创 使用ffmpeg解码音频sdl(push)播放

使用ffmpeg解码音频并使用sdl播放,网上还是有一些例子的,大多都不是特别完善,比如打开音频设备、音频重采样、使用push的方式播放音频等,都是有不少细节需要注意处理。尤其是使用push的方式播放音频,流程很简单完全可以使用单线程实现,但是队列数据长度比较难控制控制。而且有时想要快速搭建一个demo时,总是要重新编写不少代码,比较不方便,所以在这里提供一个完善的例子,可以直接拷贝拿来使用。.........

2022-08-07 01:17:46 1908

C# wpf 实现底部嵌入HwndHost

前面三章内容是笔者基于本章内容研发过程中的附带产物,但是意外的发现第三章可嵌入wpf控件后,本章的意义就变得不那么大了。本章讲述如何从底部嵌入hwnd窗口,以此来做到嵌入窗口不覆盖wpf控件的效果,这种实现思路参考了flutter的一个插件flutter_native_view,其内部实现就用了这种方式。对于wpf实现会复杂一些,因为提供自绘没有BlendMode之类的东西,无法直接消除底部画面,能够使用的方式是Clip,这种方式限制比较多。不过最终还是实现了功能。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/137122148

2024-04-05

C# wpf 使用GDI实现截屏

wpf截屏时通常可以采用gdi+,调用起来比较方便。使用gdi也能实现截屏,截屏数据也能转成BitmapSource对象,当然调用流程会复杂一些,而且需要引入win32方法,唯一比较容易的就是可以直接绘制异或鼠标。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/136693692

2024-03-18

C# wpf 实现任意控件(包括窗口)更多调整大小功能

上一章我们已经实现了任意控件统一的拖动调整功能,能够方便的给任意控件设置拖动调整大小。开发过程中发现还是有些功能可以继续拓展的,比如cs代码触发拖动、自定义模板、交叉拖动、限制拖动范围等功能。有功能实现起来不算太容易,却很有实用价值。当前版本1.2.1。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/135552871

2024-01-16

ffmpeg4.3.6安卓全平台so动态库

生成安卓ffmpeg动态库是有点麻烦的,需要在linux上进行交叉编译。网上的教程大多数都有坑,尤其是--disable-everything的基本是无法打开任何协议的输入了, --disable-asm禁用汇编也到导致性能下降很可能不能用于正规项目。本资源基本没有禁用任何功能生成的安卓全平台so,但不支持x264、fdkaac、x265等需要单独编译库。api 21-34,包含架构armv7-a、armv8-a、x84、x86-64,生成好的包在对应api编号目录中。本资源为文章附件资源,原文链接1:https://blog.csdn.net/u013113678/article/details/125451768,原文链接2:https://blog.csdn.net/u013113678/article/details/125435571

2023-11-17

ffmpeg5.1.4.安卓全平台so动态库

生成安卓ffmpeg动态库是有点麻烦的,需要在linux上进行交叉编译。网上的教程大多数都有坑,尤其是--disable-everything的基本是无法打开任何协议的输入了, --disable-asm禁用汇编也到导致性能下降很可能不能用于正规项目。本资源基本没有禁用任何功能生成的安卓全平台so,但不支持x264、fdkaac、x265等需要单独编译库。api 21-34,包含架构armv7-a、armv8-a、x84、x86-64,生成好的包在对应api编号目录中。本资源为文章附件资源,原文链接1:https://blog.csdn.net/u013113678/article/details/125451768,原文链接2:https://blog.csdn.net/u013113678/article/details/125435571

2023-11-17

ffmpeg6.1.安卓全平台so动态库

生成安卓ffmpeg动态库是有点麻烦的,需要在linux上进行交叉编译。网上的教程大多数都有坑,尤其是--disable-everything的基本是无法打开任何协议的输入了, --disable-asm禁用汇编也到导致性能下降很可能不能用于正规项目。本资源基本没有禁用任何功能生成的安卓全平台so,但不支持x264、fdkaac、x265等需要单独编译库。api 21-34,包含架构armv7-a、armv8-a、x84、x86-64,生成好的包在对应api编号目录中。本资源为文章附件资源,原文链接1:https://blog.csdn.net/u013113678/article/details/125451768,原文链接2:https://blog.csdn.net/u013113678/article/details/125435571

2023-11-16

C# wpf 实现任意控件(包括窗口)更多拖动功能

上一章我们以及实现了任意控件统一的拖动功能,以及能够方便的给任意控件添加拖动了。开发过程中发现还是有些功能可以继续拓展的,比如cs代码中移动控件、响应事件后触发拖动、限制拖动范围等功能。当前版本v1.1.1。本资源为本章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/134191213

2023-11-08

C# 使用waveIn实现声音采集

之前实现了《C++ 使用waveIn实现声音采集》,后来C#项目也有此功能的需求,直接调用C++封装的dll是可以的。但是wimm这种基于win32 api的库,完全可以直接用C#去调用,将依赖减少到最小。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/134001313。vs2022 .net6.0 项目,所有win api通过dllimport引入,没有任意额外依赖。 注:winmm不能识别dshow虚拟设备,请根据需要下载资源。

2023-10-30

C# wpf 实现截屏框热键截屏功能

在《C# wpf 使用DockPanel实现截屏框》中我们实现了一个截屏框,接下来就要实现相应的截屏功能了。获取截屏区域然后使用GDI+截屏,在这里不少的细节需要处理,比如响应热键弹出截屏界面、点击拖出截屏框、截屏区域任意反向拖动、处理不同dpi下的坐标位置等等。本资源为文章附件资源,原文连接https://blog.csdn.net/u013113678/article/details/132484304 说明:截屏的操作方式和qq、微信差不多,目前设置的热键为alt+d。

2023-09-07

使用eXosip+ffmpeg、ffplay命令行实现sip客户端

使用sip做视频通话时,会遇到需要使用ip摄像头作为视频源的情况,查了资料使用pjsip通常也需要改源码。pjsip包含的功能很完整,但有点过于庞大,很多功能并不需要。而且笔者有一个想法,只要有个能处理sip交互的库比如eXosip,音视频这块另外实现,比如先使用ffmpeg和ffplay命令行作为音视频测试,成功后再写代码实现。本文就是测试成功的方案,真正灵活的方式还是要写代码调ffmpeg,本文更多的是提供一种实现思路。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/132126069

2023-08-07

Flutter 使用texture-rgba-renderer实现桌面端渲染视频

前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,笔者最近刚好找到了pub上对texture封装的插件,直接提供dart代码调用texture进行rgba的渲染,当然只支持桌面端,即Windows、Linux、Macos,但依然是很方便了。本文只实现了**Windows、Linux**的视频渲染。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/132000510

2023-07-29

Flutter Windows通过嵌入Native窗口实现渲染视频

使用flutter在Windows上渲染视频,目前掌握的至少有2种方法(第二章、第四章),但是性能都不是最佳,而且需要将数据转换成rgba才能渲染。如果能使用win32窗口,直接通过句柄渲染,那就可以达到与原生Windows渲染使用一致的效果,可以使用sdl渲染yuv,以及dxva2解码后d3d9表面直接渲染到窗口全程在gpu上操作。本文将介绍如何在flutter程序嵌入win32窗口并且渲染视频。但是需要注意的是目前的实现**只支持win10及以上版本**,本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/131775523

2023-07-22

使用ffmpeg和sdl实现多路音频播放

音频的播放通常是单例的,在进程内通常一个播放设备只能打开一次,且只支持一个写入。写播放器的时候,会遇到需要实现多开同时播放多个视频,比如视频剪辑工具的多轨道播放。这个时候就需要采用一定的方法,比如音频混合。本文将提供一种基于ffmpeg和sdl实现的音频多路混合的方法。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/131077317

2023-06-06

C/C++ 高精度(加减乘除)算法二进制优化

上一章《C/C++ 高精度(加减乘除)算法压位优化》实现了优化的高精度计算,采用int32的整型数组每个元素可以储存9个10进制数字,想要再进一步优化计算速度,可以改变数据存储方式,采用二进制存储数字。依然采用int32数组其元素通过二进制来存储数字,这样做不仅运算效率高,而且空间利用率也达到了最高。代码是跨平台的,vs2022创建的cmake项目。本资源为附件资源,原为链接:https://blog.csdn.net/u013113678/article/details/130320216

2023-04-23

使用ffmpeg实现单线程异步的视频播放器

ffplay是一个不错的播放器,是基于多线程实现的,播放视频时一般至少有4个线程:读包线程、视频解码线程、音频解码线程、视频渲染线程。如果需要多路播放时,线程不可避免的有点多,比如需要播放8路视频时则需要32个线程,这样对性能的消耗还是比较大的。于是想到用单线程实现一个播放器,经过实践发现是可行的,播放本地文件时可以做到完全单线程、播放网络流时需要一个线程实现读包异步。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/128293698。

2022-12-13

Flutter 使用FFI+CustomPainter实现全平台渲染视频

前面几章介绍了flutter使用texture渲染视频的方法,但是有个问题就是在每个平台都需要写一套原生代码去创建texture,这样对于代码的维护是比较不利的。最好的方法应该是一套代码每个平台都能运行,于是有了一个设想,使用c++实现跨平台的视频采集,通过ffi将数据传到dart界面,通过画布控件将图像绘制出来。最终通过测试发现能用的方案就是ffi结合CustomPainter实现视频渲染,这种方式实现的视频渲染可以做到**一套代码所有平台(除web外)都可运行**。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/127990764

2022-11-23

Flutter 使用Texture实现Linux渲染视频

flutter渲染视频的方法有多种,比如texture、platformview、ffi,其中texture是通过flutter自己提供的一个texture对象与dart界面关联后进行渲染,很容易搜索到android和ios的相关资料,但是Linux上却几乎找不到任何资料。通过查看一些开源库的代码,才找到Linux上使用flutter texture的方法,在这里做一个简单的介绍。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125509450。

2022-11-20

Flutter 使用Texture实现Android渲染视频

flutter渲染视频的方法有多种,比如texture、platformview、ffi,其中texture是通过flutter自己提供的一个texture对象与dart界面关联后进行渲染,很容易搜索到android和ios的相关资料,但是大部分资料不够详细,尤其是jni渲染部分基本都略过了,对于使用flutter但不熟悉安卓的情况下,是比较难搞清楚通过texure拿到surface之后该怎么渲染。所以本文将说明整体的渲染流程。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125530536。

2022-11-20

Flutter 使用Texture实现Windows渲染视频

flutter渲染视频的方法有多种,比如texture、platformview、ffi,其中texture是通过flutter自己提供的一个texture对象与dart界面关联后进行渲染,很容易搜索到android和ios的相关资料,但是windows却几乎找不到。通过查看一些开源库的代码,找出了再windows使用texture渲染的方法,在这里做一个简单的介绍。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125492286。

2022-11-18

使用ffmpeg解码音频sdl(push)播放

使用ffmpeg解码音频并使用sdl播放,使用push的方式播放音频,流程很简单完全可以使用单线程实现,但是队列数据长度比较难控制控制。本资源为文章附件资源,原文链接https://blog.csdn.net/u013113678/article/details/126203574

2022-10-29

C# wpf使用ffmpeg命令行实现录屏

录屏采用ffmpeg命令行实现会方便一些,效果也是不错的,当然前提是要对Windows子进程的控制比较熟悉,做出来之后完全可以满足项目使用。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/126109965

2022-10-29

使用ffmpeg解码视频渲染到sdl窗口

使用ffmpeg解码视频并渲染视频到窗口,网上是有不少例子的,但是大部分例子的细节都不是很完善,比如资源释放、flush解码缓存、多线程优化等都没有。特别是想要快速搭建一个demo时,总是要重新编写不少代码,比较不方便,所以在这里提供一个完善的例子,可以直接拷贝拿来使用。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125922942

2022-07-22

C# wpf style中实现可定制的自定义标题栏

上一章我们实现了在style中自定义标题栏,解决了复用性的问题。但是在实际使用中,还是存在一些问题的,比如有些界面需要放几个菜单在标题栏或者不需要最大化按钮等,就会变得很不灵活。这时候就需要对style进行进一步拓展了。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125772769

2022-07-13

C# wpf 实现截屏框截屏功能

获取截屏区域然后使用GDI+截屏,在这里有些细节需要处理,比如要隐藏截屏框上的控件避免遮挡,处理不同dpi下的坐标位置。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125567308

2022-07-02

C# wpf 使用DockPanel实现截屏框

做桌面客户端的时候有时需要实现截屏功能,能够在界面上框选截屏,做一个蒙版然后中间选框透明可以移动和改变大小。这个功能是不太好实现的,需要一定的方法,其中使用DockPanel是相对简单直接的实现。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/125550292

2022-07-01

ffmpeg5.0.1安卓全平台so动态库

生成安卓ffmpeg动态库是有点麻烦的,需要在linux上进行交叉编译。网上的教程大多数都有坑,尤其是--disable-everything的基本是无法打开任何协议的输入了, --disable-asm禁用汇编也到导致性能下降很可能不能用于正规项目。本资源基本没有禁用任何功能生成的安卓全平台so,但不支持x264、fdkaac、x265等需要单独编译库。api 29,包含架构armv7-a、armv8-a、x84、x86-64,生成好的包在install目录中。本资源为文章附件资源,原文链接1:https://blog.csdn.net/u013113678/article/details/125451768,原文链接2:https://blog.csdn.net/u013113678/article/details/125435571

2022-06-15

使用gdi实现多路视频流合并

以前用ffmpeg的滤镜实现过多路视频流合并,后来想到其实只要是图形处理库应该都能实现图像的合并,于是尝试了一下用使用gdi来实现视频流的合并,实际发现效果还可以,可以支持rgb格式的图像数据的合并,对于1080p的数据合并2路流的耗时也在可接受范围内。本文将介绍gdi如何实现视频流的合并,以及封装成对象使用。本资源为文章附件资源, 原文链接:https://blog.csdn.net/u013113678/article/details/125212602

2022-06-10

C# wpf 实现自定义界面操作分离的MessageBox

提供了一个MessageBoxHelper类封装的MessageBox所有操作逻辑,通过泛型使用不同的绑定属性窗口进行显示。操作与界面分离后,方便了界面的灵活设计,在不同的项目只需要定义MessageBox的界面即可,操作逻辑直接使用MessageBoxHelper,减少了造轮子。本资源为文章附加资源,原文链接: https://blog.csdn.net/u013113678/article/details/120922903

2022-05-27

C# wpf 使用ffplay实现视频播放器

有了《WPF视频渲染系列》的视频渲染方法,再结合笔者已有的一个定制化ffplay播放器《基于ffplay改造成自定义多开播放器》,我们可以很容易的在wpf中实现一个播放器软件,这个播放器可以支持本地播放、摄像头播放、网络点播、rtmp和rtsp拉流。本资源为文章附件资源,原文链接: https://blog.csdn.net/u013113678/article/details/123907480

2022-05-22

ffplay自定义播放器封装C#接口

提供了x86、x64dll、qt示例、C#封装对象代码及示例项目,不包含播放器c语言源码,请根据需要下载。版本v1.3.15。原文链接:https://blog.csdn.net/u013113678/article/details/124759757。 * 更新日志 * v1.3:支持dxva2硬解渲染,以及设置解码器 * v1.3.13 Windows,全局初始化添加原子操作 * v1.3.14 Windows渲染采用d3d9,去除音频滤镜,音频倍速切换为soundtouch实现,不再限制0.5-2倍速范围。 * v1.3.15 ACPixelFormat的值与AVPixelFormat统一,可以直接使用AVPixelFormat,不再限制ACPixelFormat的几个格式中,需要注意ffmpeg版本枚举值不同,当前使用版本为4.3。 去除dxva2渲染h265的绿边 去除多线程解码,解决反复播放停止变卡问题。去除多线程解码后,内存使用大量降低,延迟降低(实时流),但解码性能会减弱,播放4k解码性能不足时考虑使用硬解。

2022-05-14

C++ 解析aac-adts的头部信息

aac的adts封装格式的音频文件是可以直接播放的,因为其内部的数据中每一帧都带有adts头部,头部包含了解码的必要信息。不像wav文件其头部的字段都是基于byte为单位,直接使用内存结构相同的实体即可直接读取,adts的头部字段是以bit为单位的,这就给解析其头部带来了一定的难度,几乎获取每个字段都需要进行位操作,一些跨byte的位还需要进行字节序的转换。本文将提供解析adts头的具体方法及实现。本资源为文章附加资源 原文链接:https://blog.csdn.net/u013113678/article/details/123134860

2022-05-08

C++ 读取h264中的nalu

h264帧通常包含多个nalu,当我们需要封装为mp4的时候,就需要获取这些nalu,读取其中的sps和pps信息,以及视频帧。h264的打包格式有2种,一种是Annex-B,另一种是AVCC,本文提供Annex-B的解析方法。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/123112596

2022-05-08

使用mp4v2将h264和aac封装成mp4

我们通过编码得到的h264和aac数据通常需要封装成mp4文件,可以使用mp4v2实现这样的封装,封装的时候需要注意一些细节,比如读取sps、pps,判断idr、音频固定时间戳等。文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/122833036

2022-05-07

C# wpf 使用d3d渲染dxva2解码数据

使用dxva2解码渲染的方案是有的,通过句柄关联d3d对象的方式直接渲染,性能相当好,但是在wpf中显然不太合适,嵌入hwnd窗口与wpf绘制不兼容,而且对于键盘事件也会有影响,最好的方式还是使用d3d渲染,本文主要讲述如何将dxva2解码的数据不经过转换,直接渲染到wpf的image上。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/124223161

2022-04-17

C++ 使用fdk-aac对音频编码

mp4的音频流通常是aac编码,我们做音视频采集的时候就需要将,采集的音频PCM编码成aac,然后再打包进mp4,而aac编解码库中fdk-aac是性能较好的,使用方式也比较简单。在C++项目中使用,通常再做一层封装,提高模块的复用性和替换性。本文将展示C++将fdk-aac封装成一个编码对象,以及使用示例。本资源为文章附件项目代码,原文链接https://blog.csdn.net/u013113678/article/details/122760653

2022-02-02

使用fdk-aac将wav编码为aac

fdk-aac的编码示例,vs2019项目,文章https://blog.csdn.net/u013113678/article/details/122755035的附件资源。

2022-01-30

C++ 使用Intel Media SDK 实现H.264硬编码

曾经做视频会议相关项目的时候,需要在客户端实现多路视频推流,对若干摄像头以及桌面的数据进行编码推流,当每路数据都是1080p 30fps时,采用软编对cpu的压力是比较大的而且在1080p的基础上达到30fps的帧率也是比较困难的。于是开始尝试使用硬编,发现Intel的硬编性能是非常不错的,对于多路1080p 30fps的编码实时流在相对较好的cpu中是很容易达到的。本文将说明Intel Media SDK的获取以及使用方法。本资源为文章附件项目代码, 原文链接:https://blog.csdn.net/u013113678/article/details/122646187

2022-01-23

C++ 使用waveOut实现声音播放

在Windows上实现声音播放比较简单的方法是使用winmm,其中的waveOut模块就可以打开声音设备,播放PCM数据。本文将介绍waveOut声音播放的具体实现,其实现相较于waveIn的采集简单很多,不需要通过开启子线程避免死锁,对于消息也只需要监听WOM_DONE。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/122478895

2022-01-13

C++ 使用waveIn实现声音采集

在Windows上实现录音比较简单的方法是使用winmm,其中的waveIn模块就可以打开录音设备,获取PCM数据,进行声音录制。本文将介绍waveIn录音的具体实现,以及如何避免死锁。本资源为文章附件资源。 原文链接:有可能本站连接也被当成广告,暂不提供,请自行搜索本站与与资源同名博客。

2022-01-01

C# wpf 使用GDI+实现截屏

wpf做屏幕录制或者屏幕广播之类的功能时需要实现截屏,在C#中比较容易实现的截屏方法是使用GDI+,本文将展示使用GDI+截屏的具体实现方案,包括如何绘制鼠标,按帧率采集屏幕、将GDI+对象转成wpf对象等。原文链接:https://blog.csdn.net/u013113678/article/details/121874479

2021-12-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除