自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c语言 实现跨平台本地日志

本文介绍了一个轻量级跨平台日志模块的实现方案。该模块仅需一个.c文件,支持多级日志输出(DEBUG/INFO/WARN/ERROR等),具备文件切割(默认10MB)和历史文件清理功能(保留10个文件)。通过宏定义区分不同平台,采用缓存写入机制提高性能(WARN及以下等级异步写入,ERROR及以上等级同步写入)。核心功能包括:1)跨平台文件操作封装;2)日志缓存管理;3)按大小自动切割文件;4)历史日志清理。模块使用简单,只需包含头文件即可通过宏(如LOG_INFO)输出日志,适合嵌入式或资源受限场景使用。

2026-02-03 15:20:25 839

原创 flutter-elinux 编译linux arm64程序

本文介绍了在嵌入式Linux系统中运行Flutter应用的方法。通过使用官方Flutter SDK或第三方flutter-elinux工具,可以生成支持多种后端(X11、Wayland等)的ARM64程序。文章详细讲解了本地编译运行、交叉编译的步骤,并提供了常见问题的解决方案。重点指出无需自行生成engine和embedded,只需flutter-elinux+clang+sysroot即可完成编译。最后总结了编译过程中的关键点和注意事项,为开发者提供了实用指引。

2026-01-07 12:41:44 723

原创 c语言 利用宏实现函数重载

本文介绍了一种在C语言中通过宏实现函数重载的方法。该方法利用宏参数个数来区分不同函数版本,分别针对MSVC和GCC等编译器提供了不同的宏定义方案。具体实现包括基础宏定义、函数定义、重载宏定义及调用示例。虽然不同编译器需要不同的实现方式,但这种方法能够稳定实现简单的函数重载功能,为C语言编程提供了一定便利性。未来可能进一步优化MSVC编译器的宏实现。

2026-01-06 17:52:22 1060

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

本文介绍了基于C语言实现的集合类,重点阐述了如何在切片基础上实现队列功能。通过采用循环队列结构优化性能,避免了直接删除头部元素导致的内存拷贝问题。文章提供了关键接口设计,包括slice_remove、slice_set和slice_get等宏定义,使单个对象能够支持切片、栈和队列三种数据结构。完整代码展示了slice.h头文件的实现细节,包含创建切片、添加/移除元素、设置/获取元素值等核心功能。该实现兼顾了性能与功能需求,为C语言开发者提供了高效的数据结构解决方案。

2026-01-06 16:40:41 839

原创 C++ 实现ffmpeg解析hls fmp4 EXT-X-DISCONTINUITY并支持定位

摘要 本文介绍了使用FFmpeg处理HLS FMP4流时遇到的定位问题及解决方案。当M3U8文件中存在不连续片段(如广告)或编码参数不一致时,FFmpeg 8.0版本仍会出现定位失效。文中提出通过自行解析M3U8文件,利用AVIO接口将FMP4的init和m4s片段拼接后提供给FFmpeg解复用的方法。具体实现包括:1) 使用FFmpeg的HTTP接口下载M3U8;2) 通过AVIO动态拼接FMP4片段;3) 在编码参数变化时动态更新解码器。该方法有效解决了HLS流中的不连续片段处理问题,并提供了完整的代码

2026-01-04 10:27:05 483

原创 C++ 基于kmp解析nalu

本文介绍了NALU解析工具的优化实现,重点解决了H.264/H.265视频流中NALU边界处理的复杂性问题。通过将KMP算法直接融入解析循环,持久记录查找状态,有效处理了跨缓存情况下的startcode匹配问题。优化后的NaluParse类简化了接口设计,仅保留核心Decode方法,支持流式数据处理并能自动处理边界情况。示例代码展示了如何将H.264文件封装为MP4格式,包括读取NALU、处理SPS/PPS/IDR帧等关键步骤。该工具适用于视频封装、转码等场景,能正确处理跨缓存的数据边界问题。

2025-12-31 14:18:28 744

原创 c语言 封装跨平台线程类文件

本文介绍了一个跨平台的C语言线程类封装方案,通过宏定义实现Windows(win32 API)和其他平台(pthread)的统一接口。该方案仅需一个头文件即可完成线程、互斥锁、信号量、条件变量等功能的跨平台封装。主要特点包括:使用条件编译区分不同平台;提供线程创建、等待、分离等基本操作;实现互斥锁、信号量、条件变量等线程同步机制;所有功能整合在threads.h头文件中,便于项目集成。这种封装方式简化了多平台开发中的线程操作,提高了代码的可移植性。

2025-12-30 14:00:52 742

原创 c语言 封装跨平台读写锁头文件

本文介绍了一个跨平台C语言线程类封装方案,通过宏定义统一了Windows和Linux平台的读写锁接口。该方案仅需一个头文件即可实现跨平台线程安全操作,支持读写锁的创建、销毁、加锁和解锁等操作。示例代码展示了多线程读写数据的应用场景,使用简单方便,无需额外编译配置,直接包含头文件即可使用。这种设计简化了跨平台多线程编程的复杂度,提高了代码的可移植性和开发效率。

2025-12-30 13:48:48 653

原创 c语言 封装跨平台条件变量头文件

本文介绍了一个跨平台的C语言条件变量封装实现,通过宏定义统一了Windows和Linux/POSIX平台的API接口。该方案仅需一个头文件即可实现条件变量的创建、等待、通知和销毁等功能,支持基本等待和带超时的等待操作。代码示例展示了多线程同步和超时等待的使用场景。这种封装方式简化了跨平台开发,无需额外构建配置,只需包含头文件即可直接使用,提高了代码的可移植性和开发效率。

2025-12-30 11:30:57 874

原创 c语言 封装跨平台信号量头文件

本文介绍了一个跨平台C语言线程类的封装方案,通过宏定义统一Windows和Linux/POSIX平台的信号量操作接口。该方案仅需一个头文件即可实现跨平台信号量功能,支持创建/销毁信号量、等待/超时等待、释放信号量等操作。示例代码展示了多线程同步和超时等待两种典型用法,为C语言项目提供了轻量级、易用的线程同步工具。这种封装方式避免了平台差异带来的开发复杂度,简化了跨平台多线程程序的实现。

2025-12-30 10:47:46 346

原创 c语言 封装跨平台互斥锁头文件

本文介绍了一种跨平台的C语言线程互斥锁封装方案,通过宏定义统一了Windows和Linux平台的互斥锁API接口。该方案仅需一个头文件(mutex.h),无需额外编译配置,即可实现跨平台线程同步功能。文章详细展示了如何通过条件编译区分不同系统平台,并提供了初始化、加锁、尝试加锁、解锁等操作的统一接口。示例代码演示了基本用法,包括加锁/解锁流程和尝试加锁场景。这种轻量级封装简化了跨平台开发中的线程同步处理,具有即插即用的便利性。

2025-06-16 14:18:15 743

原创 c语言 封装跨平台线程头文件

本文介绍了一个跨平台C语言线程封装方案,通过单一头文件实现Windows(win32 API)和其他平台(pthread)的线程操作统一接口。核心思路是利用宏定义屏蔽平台差异,提供线程创建(thread_create)、等待(thread_join)、分离(thread_detach)等通用函数。示例代码展示了线程创建与等待返回值、线程分离两种典型用法。该方案无需额外编译配置,仅需包含头文件即可实现跨平台多线程开发,简化了项目移植和维护工作。通过统一的参数和返回值类型设计,有效解决了不同平台线程实现的兼容性

2025-06-06 17:44:53 1114

原创 C++ 计算代码运行时间

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

2024-11-24 22:55:45 2256

原创 golang 计算代码运行时间

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

2024-11-18 20:28:58 587

原创 Flutter 将ffmpeg动态库制做成插件

有了上一章的ffmpeg接口,我们可以很方便的通过dart调用ffmpeg,但是需要自己部署ffmpeg动态库还是比较麻烦的,尤其是多个平台多个项目时,去一个一个编写部署代码显然是不合理的。最好方式应该是将ffmpeg动态库的部署写在一个插件中,需要使用的项目直接引用插件即可。

2024-10-24 23:46:00 1991 2

原创 C# 实现条件变量

C#提供的多进程同步对象有互斥锁和信号量,但是并没有条件变量。虽然信号量条件变量一定程度可以等效,但是具体的使用还是会有区别。比如说消息队列用条件变量就比信号量方便,用信号量要么缺乏灵活性,要么辅助代码已经和实现一个条件变量没区别了。本文提供了一种条件变量的实现方法,可以用于进程间的同步控制。

2024-07-21 23:05:34 971

原创 C# 实现跨进程消息队列

进程通信一般情况下比较少用,但是也有一些使用场景,有些做视频传输的似乎会用多进程来实现,还有在子进程中调用特定的库来避免内存泄漏,笔者最近也遇到了需要使用多进程的场景。多进程的使用最主要的就是进程间的通信,本文参考了go语言的ipc库,实现了一个基于共享内存的跨进程队列。以上就是今天要讲的内容,实现这样的一个对象,虽然代码量不多,但还是有一点难度的,很多细节需要处理,比如泛型转type以统一接口,信号量实现队列和条件变量是有差异的,用CreateFromFile才能实现跨平台。

2024-07-15 23:32:01 1205

原创 Flutter 实现软鼠标

flutter在嵌入式系统中运行时,有可能遇到drm鼠标无法使用的情况,但鼠标事件却可以正常接收,此时如果有软鼠标,就可以一定程度解决问题。本文提供了一个软鼠标的简单实现。以上就是今天要讲的内容,本文实现的软鼠标还是比较简单的,当然软鼠标对性能还是有一定的影响的,比如在linux中,每次移动都会触发交换缓存进行drm显示。

2024-06-17 09:47:51 938

原创 Flutter 实现StackAllocator简化FFI局部变量的内存管理

使用Flutter通过FFI调用c库的时候,经常需要传字符串或者一些指针变量,这里变量通常都是局部变量,在一个代码块运行完成后就不需要了,我们通常用calloc进行内存申请和释放,但这也带来了一个麻烦,每个变量都需要单独释放,且字符串必须用变量进行释放,不能直接使用字面量作为参数,否则就内存泄漏了。本文提供一种针对上述问题的简化操作。我们实现一个Allocator,用于局部的内存管理,就可以省去每个变量内存释放这个步骤。salloc是一个用于管理局部变量的Allocator。

2024-06-16 16:34:51 749

原创 Flutter 简化线程Isolate的使用

flutter的线程是数据独立的,每个线程一般通过sendport来传输数据,这样使得线程调用没那么方便,本文将提供一种支持lambda启动isolate的方法,且支持捕获值类型变量,以及支持返回值。以上就是今天要讲的内容,本文的提供线程启动方法,很大程度方便了使用,尤其是支持lambda,可以在任意上下文捕获变量开启线程,执行任务,并获取返回值,用法和Future就很类似了,可以当成异步的另一种选择。

2024-06-13 12:21:13 1098

原创 Flutter 简化CustomPainter的绘制

使用Flutter做界面时,有时会需要需要自绘的控件,比如异形按钮或者显示视频,我们通常可以用CustomPainter实现。但是CustomPainter是一个抽象类,需要继承并实现绘制方法,才能进行绘制。本文对CustomPainter进行了一个简单的封装,简化绘制操作。

2024-06-11 17:47:50 1255

原创 Flutter 实现dispose探测控件

开发flutter一般会用状态管理工具,用了状态管理后大部分控件都会是StatelessWidget,StatefulWidget有dispose重载获取控件销毁时机,但StatelessWidget则没有,此时我们要获取控件销毁的时机就需要另寻他法了。这是一个控件用于帮助探测无状态控件的销毁时机,有点类似用于探测控件的显示和隐藏。/// 创建人: xin/// 创建时间: 2023/6/15 13:44/// 注释: 销毁探测控件final S?tag;//自定义数据this.tag,

2024-06-10 13:44:28 1376

原创 Flutter 使用ffigen生成ffmpeg的dart接口

前面几章介绍了flutter各种视频渲染的方法,视频渲染前显然是需要先获取视频流并解码,这些操作就需要用到ffmpeg,前面的几章的解码都是通过c语言调用ffmpeg,再将数据传输到dart渲染的。本章将提供一种生成ffmpeg dart接口的方法,直接用dart就可以调用ffmpeg进行拉流并解码然后显示。

2024-06-08 12:09:39 3133 3

原创 安卓部署ffmpeg全平台so并实现命令行调用

前面的章节实现了ffmpeg全平台so的生成,接下来的步骤就是部署以及使用了,部署so还是比较简单的,用gradle和cmake都可以部署,部署好了就可以直接使用了,如果需要c++进行封装一层,则需要链接,对cmake熟悉的话链接也是比较简单的。以上就是今天讲述的内容,ffmpeg的so部署还是比较容易的,但是命令行的调用会麻烦一些,尤其是要解决ffmpeg退出问题,在c++中比较好解决,java理论上也比较好实现,如果在dart中则会比较麻烦,因为dart的方法通常不能跨线程调用,多线程的情况会出问题。

2024-05-17 10:56:58 1801

原创 C++ 将字符串解析为argc、argv

一般开启子进程的时候,需要传参数,通常直接传输命令行字符串,进入main会自动转换为argc、argv的形式。有些时候会需要需要自己解析命令行的情况,通常采用split空格就可以了,但如果需要支持双引号则会麻烦一些。以上就是今天要讲的内容,本文的实现是比较简单的,用的方法算是比较巧妙,只要支持split就可以用本文的方法实现命令行的解析。

2024-05-16 11:16:26 810

原创 Shell生成支持x264的ffmpeg安卓全平台so

前两张实现了ffmpeg全平台so的生成,但是ffmpeg依赖的第三方库是需要另外编译的,所以本章将提供编译x264库并加入ffmpeg的方法。本章提供的脚本在ubuntu以及windows的wsl、msys2都适用。以上就是今天讲述的内容,生成ffmpeg安卓so其实并不难,如果熟悉交叉编译以及shell,编译起来还是比较简单的,尤其是想生成最小或者完整依赖的包,最好还是自己生成。

2024-05-09 09:25:57 1309

原创 C# wpf 运行时替换方法实现mvvm自动触发刷新

我们知道,使用wpf的绑定功能,代码触发界面改变时,需要在属性的setter触发PropertyChanged事件,以达到界面刷新的效果。上一章我们简化了触发流程,但是依然需要在每个属性的setter中调用方法。本章将再进一步简化,实现setter不需要调方法就可以自动触发界面刷新。定义的用于替换属性setter的方法,确保参数类型兼容。设置NoInlining确保不会被内联优化失去函数地址。再方法中触发RaisePropertyChangedEvent。

2024-04-29 11:54:44 1569 2

原创 C# wpf 嵌入外部程序

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

2024-04-07 09:56:55 2154

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

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

2024-04-04 01:04:10 1913 1

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

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

2024-03-30 00:09:06 2012 1

原创 C# wpf 嵌入wpf控件

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

2024-03-27 13:36:51 2154

原创 C# wpf 嵌入winform控件

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

2024-03-27 03:00:00 3728 1

原创 C# wpf 嵌入hwnd窗口

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

2024-03-26 19:56:00 2325

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

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

2024-03-25 09:40:52 643

原创 c语言 实现切片数组

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

2024-03-25 01:21:13 2228

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

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

2024-03-14 00:58:37 1701

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

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

2024-03-13 01:07:54 1346

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

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

2024-03-09 22:58:54 875

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

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

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

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

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

2024-01-17 10:27:40 1870

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# wpf使用ffmpeg命令行实现录屏

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

2022-10-29

ffmpeg7.0安卓全平台so动态库

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

2022-06-15

使用mp4v2将h264和aac封装成mp4

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

2022-05-07

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

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

2022-05-22

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

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

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

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

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

2022-10-29

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

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

2022-07-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

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

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

2022-07-02

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

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

2022-07-22

C# wpf 使用DockPanel实现截屏框

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

2022-07-01

使用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++ 解析aac-adts的头部信息

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

2022-05-08

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++ 实现ffmpeg解析hls fmp4 EXT-X-DISCONTINUITY并支持定位

使用ffmpeg播放hls fmp4时通常会发现定位有问题,这个可以通过升级到8.0可以一定程度解决问题。但是如果m3u8文件中存在不连续片段比如广告,则8.0定位也会失效。而且广告的编码分辨率与原片不同时ffmpeg也无法当成一条流解析。比较有效的解决方法是自行解析m3u8通过avio让ffmpeg解复用。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/156561003

2026-01-04

C++ 基于kmp解析nalu

h264、h265帧通常包含多个nalu,当我们需要封装为mp4的时候,就需要获取这些nalu,读取其中的vps、sps和pps信息,以及视频帧。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/123112596

2025-12-31

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

生成安卓ffmpeg动态库是有点麻烦的,需要在linux上进行交叉编译。网上的教程大多数都有坑,尤其是--disable-everything的基本是无法打开任何协议的输入了, --disable-asm禁用汇编也到导致性能下降很可能不能用于正规项目。本资源基本没有禁用任何功能生成的安卓全平台so,但不支持fdkaac、x265等需要单独编译库。api 21-34,加入x264 api 24-34,包含架构armv7-a、armv8-a、x86、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# 基于共享内存实现跨进程队列

进程通信一般情况下比较少用,但是也有一些使用场景,有些做视频传输的似乎会用多进程来实现,还有在子进程中调用特定的库来避免内存泄漏,笔者最近也遇到了需要使用多进程的场景。多进程的使用最主要的就是进程间的通信,本文参考了go语言的ipc库,实现了一个基于共享内存的跨进程队列。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/140450856

2024-07-15

Flutter 使用ffigen生成ffmpeg的dart接口

前面几章介绍了flutter各种视频渲染的方法,视频渲染前显然是需要先获取视频流并解码,这些操作就需要用到ffmpeg,前面的几章的解码都是通过c语言调用ffmpeg,再将数据传输到dart渲染的。本章将提供一种生成ffmpeg dart接口的方法,直接用dart就可以调用ffmpeg进行拉流并解码然后显示。本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/139538045。

2024-06-08

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

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

2023-11-17

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

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

2023-11-17

C# wpf 运行时替换方法实现mvvm自动触发刷新

我们知道,使用wpf的绑定功能,代码触发界面改变时需要在属性的setter触发PropertyChanged事件,以达到界面刷新的效果。上一章我们简化了触发流程,但是依然需要在每个属性的setter中调用方法。本章将再进一步简化,实现setter不需要调方法就可以自动触发界面刷新。 本资源为文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/138305128。

2024-04-29

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/C++ 高精度(加减乘除)算法二进制优化

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

2023-04-23

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

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

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

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

2022-12-13

空空如也

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

TA关注的人

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