![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言
文章平均质量分 73
CodeOfCC
c++ 音视频开发
展开
-
c语言 实现切片数组-拓展栈操作
有了上一章的切片后,已经有了动态数组功能,接下来需要实现栈的功能,在go语言中切片可以直接当栈使用,在c语言中则需要添加一个额外操作,弹出栈顶元素。以上就是今天要讲的内容,拓展栈操作还是比较简单的,而且统一一套接口,即可以当作数组也可以当作栈使用。原创 2024-03-25 09:40:52 · 361 阅读 · 0 评论 -
c语言 实现切片数组
由于c语言没有集合类的标准库,需要用时只能自己实现,由于c语言没有泛型,使得实现的集合类接口通常比较另类,很多时候都需要二级指针作为参数,且不支持字面量作为参数,使用时心智负担较重。本文参考go语言的slice,找到了一种非常简化的动态数组接口,可以极大的方便使用。原创 2024-03-25 01:21:13 · 1100 阅读 · 0 评论 -
Windows C/C++ 任意线程通过hwnd将操作发送到UI线程执行
以上就是今天要讲的内容,本文仅仅简单的实现了通用的线程invoke,且只支持同步,通用的异步invoke实现稍微复杂些(基本实现的方式则比较简单),以后有空再做。总的来说,有了本文的代码很大程度的方便了使用,尤其是一个新的项目突然需要invoke功能,按照基本实现的方式在窗口中写一遍是很麻烦的,而优化的实现则可以直接复用,调用invoke即可。原创 2024-03-09 22:58:54 · 482 阅读 · 0 评论 -
C/C++ 高精度(加减乘除)算法二进制优化
上一章《C/C++ 高精度(加减乘除)算法压位优化》实现了优化的高精度计算,采用int32的整型数组每个元素可以储存9个10进制数字,想要再进一步优化计算速度,可以改变数据存储方式,采用二进制存储数字。依然采用int32数组其元素通过二进制来存储数字,这样做不仅运算效率高,而且空间利用率也达到了最高。以上就是今天要讲的内容,二进制存储优化在对比压9位优化速度还有提升,而且存储方式与整型一样,很好的利用了空间。相比较与压9位算法,二进制算法对于乘法和除法的提升较大,尤其是长数据运算的提升更为明显。原创 2023-04-23 22:34:08 · 1678 阅读 · 0 评论 -
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 · 6003 阅读 · 0 评论 -
C/C++ 高精度(加减乘除)算法压位优化
由于上一章《C/C++ 高精度(加减乘除)算法简单实现》实现了基本的高精度计算,数组的每个元素存储一位10进制的数字。这样的存储方式并不是最优的,32位的整型其实至少可以存储9位高精度数字,数组元素存储更多的位数就是压位优化。本文将展示压位优化的原理以及压9位的实现和示例。以上就是今天要讲的内容,压位优化性能提升是比较显著的,而且实现也很容易,大部分逻辑是一致的只是底数变大了而已。从性能测试结果来看所有计算至少由4倍的提升,乘法性能提升较大有可能是测试方法不严重,这个待以后验证。原创 2023-01-30 22:47:00 · 983 阅读 · 1 评论 -
使用ffmpeg实现单线程异步的视频播放器
ffplay是一个不错的播放器,是基于多线程实现的,播放视频时一般至少有4个线程:读包线程、视频解码线程、音频解码线程、视频渲染线程。如果需要多路播放时,线程不可避免的有点多,比如需要播放8路视频时则需要32个线程,这样对性能的消耗还是比较大的。于是想到用单线程实现一个播放器,经过实践发现是可行的,播放本地文件时可以做到完全单线程、播放网络流时需要一个线程实原创 2022-12-12 23:53:27 · 1832 阅读 · 2 评论 -
C/C++ 高精度(加减乘除)算法简单实现
由于上一章《C/C++ 高精度(加减乘除)算法实现》是基于工程项目考虑实现的,也做了一定的优化,实现过程较为复杂。不利于移植和使用,且比较难以理解,时间一长代码也容易忘记,所以重新编写了一个简化的版本,方便以后需要时拷贝使用。以上就是今天要讲的内容,本文提供的是较为简化的实现,且每个方法基本是独立的,可单独拿来使用,用法也比较简单,由于采用数组第一个元素存储长度,接口就变得很简洁,使用起来也方便了很多。原创 2022-12-12 17:40:06 · 1187 阅读 · 0 评论 -
c语言 将音视频时钟同步封装成通用模块
编写视频播放器时需要实现音视频的时钟同步,这个功能是不太容易实现的。虽然理论通常是知道的,但是不同过实际的调试很难写出可用的时钟同步功能。其实也是有可以参考的代码,ffplay中实现了3种同步,但实现逻辑较为复杂,比较难直接提取出来使用。笔者通过参考ffplay在自己的播放器中实现了时钟同步,参考。在实现过程中发现此功能可以做成一个通用的模块,在任何音视频播放的场景都可以使用。原创 2022-09-21 23:12:38 · 1566 阅读 · 0 评论 -
使用ffmpeg解码视频渲染到sdl窗口
使用ffmpeg解码视频并渲染视频到窗口,网上是有不少例子的,但是大部分例子的细节都不是很完善,比如资源释放、flush解码缓存、多线程优化等都没有。特别是想要快速搭建一个demo时,总是要重新编写不少代码,比较不方便,所以在这里提供一个完善的例子,可以直接拷贝拿来使用。.................................原创 2022-07-22 00:04:27 · 1595 阅读 · 25 评论 -
c语言 判断两个文件是否相同
在实际开发的时候有时需要比较文件是否相同,生成md5摘要比较固然是比较好的方法,有时只是需要写个简单的测试程序,在c语言引入md5库就有点麻烦了,直接比对文件内容可能比较耗时但是准确性还是可以保证的。原创 2022-02-24 13:59:57 · 6303 阅读 · 0 评论 -
c语言计算内存对齐Align
内存对齐在一些数据处理的场景中会被使用到,比如视频或音频数据的处理就会用到内存对齐,在d3d中视频数据通常是按64位对齐的,音频的PCM也有blockAlign对齐。原创 2022-01-01 01:04:55 · 1293 阅读 · 0 评论 -
c语言实现动态增容的栈
一、概述栈在日常开发中有时还是会用到的,比如将递归函数化简为非递归循环、或者解析xml标签。c语言标准库是没有栈这种结构提供的,这里提供一个种栈的实现方法,基于数组实现,支持动态增容。二、原理说明1、基于数组的栈栈的最简单的实现是基于数组的,在一个数组中设一个栈顶下标指向栈顶即可,入栈的时候在栈顶的位置写入元素,出栈的时候栈顶下标减小即可。2、动态增容在动态增容的数组栈中,出栈入栈的操作和普通的数组栈基本一致,只有当数组中的元素满了的时候,会自动增容,申请一段新的更大的空间,将原有数据拷贝过去。原创 2021-10-08 07:53:32 · 956 阅读 · 0 评论 -
c语言实现动态增容循环队列
队列在日常开发中有时还是会用到的,比如实现一个消息队列时底层就需要一个队列、又或者实现图的广度遍历也需要用到队列。c语言标准库是没有队列这种结构提供的,这里提供一个种队列的实现方法,在c语言的环境下能够方便的使用。一、接口设计1、数据结构这里直接把结构体定义在头文件,以方便使用者自由选择堆栈内存实例化。一个循环队列通常需要,一个头下标、一个尾下标、一个数组即可。这里为了实现动态增容添加数组容量字段,用以记录当前数组的长度。还添加了元素大小字段,用以适应不同的数据类型。最后增加了一个元素个数,这个字段不原创 2021-10-07 12:42:54 · 596 阅读 · 0 评论 -
c语言跨平台条件变量封装
条件变量所为一种线程安全对象,在多线程开发中,是有一些使用场景的,比如多个线程协作执行任务,或者生产者消费者模式的实现,都可以使用条件变量来进行线程控制。c语言做多线程开发,实现一个跨平台条件变量量对象还是有用的。本文提供了一个跨平台条件变量的封装对象,内部实现主要参考sdl的SDL_cond。一、接口设计:1、数据结构:条件变量可以使用2和信号量和一个互斥锁实现,这里为了减少代码冗余以及跨平台宏,直接使用我已经实现的《c语言跨平台信号量封装》和《c语言跨平台互斥锁封装》作为信号量和互斥锁。采用原创 2021-09-25 21:59:37 · 1306 阅读 · 0 评论 -
c语言跨平台信号量封装
信号量所为一种线程安全对象,在多线程开发中,是有一些使用场景的,比如多个线程或者进程共享同一个资源,或者生产者消费者模式的实现,都可以使用信号量来进行控制资源的有序访问。c语言做多线程开发,实现一个跨平台信号量对象还是有用的。一、接口设计:1、数据结构:在Windows上采用win32 api实现信号量,Linux及Unix使用pthread实现信号量,由于一般情况下信号量在操作系统中属于内核对象,通常系统只提供一个句柄给用户使用,这种情况下不存在堆栈内存及内存连续的选择策略,所以采用pim..原创 2021-09-24 23:27:18 · 1248 阅读 · 0 评论 -
c语言跨平台共享锁封装
共享锁也称为读写锁,其特点是读和读不互斥,读写互斥,写写互斥。在多线程开发中一般使用在多个读单个写入的场景,比如将摄像头的画面读取后显示并同时编码推流。c语言做跨平台开发,实现一个共享锁封装对象还是有用的。一、接口设计:1、数据结构:共享锁一般是在互斥锁的基础上实现的,所以需要用到互斥锁,这里直接使用了我另外一篇文章《c语言跨平台共享锁封装》作为互斥锁,以减少一些宏代码。为了灵活内存选择策略,直接定义字段在头文件,不采用pimp的方式。#include "acf_mutex.h"///原创 2021-09-23 23:42:50 · 370 阅读 · 0 评论 -
c语言跨平台互斥锁封装
在做c语言的多线程开发时,互斥锁是必不可少的,c语言不像c++11有标准的线程库,在各种编译器支持的平台都可以使用,所以c语言封装一套跨平台的互斥锁还是有必要的。一、接口设计:1、数据结构:使用宏区分平台,在Windows用winapi其他平台用pthread。为了灵活内存选择策略,直接定义字段在头文件,不采用pimp的方式。#ifdef _WIN32#include <windows.h>#else#include <pthread.h>#endif /原创 2021-09-18 20:48:53 · 497 阅读 · 0 评论 -
c语言跨平台线程封装
做跨平台开发的时候有时需要使用到线程库,但是不同平台的线程库是不一样的,在Windows上是使用系统win32 api创建和管理线程,Linux和Mac通常使用pthread,尽管Windows也可以使用第三方的pthread库,但这样库的依赖会比较多,项目的部署会麻烦些,最佳的方法应该还是写跨平台代码,通过宏区分不同平台的代码。接口设计:比较常用的线程相关的功能通常有:1、线程对象typedef void* acf_thread;用这种方式定义线程对象是为了隐藏内部实现,减少头文件的原创 2021-09-16 23:30:19 · 586 阅读 · 0 评论 -
c语言实现动态数组
动态数组是一种比较常用的集合类,其相对于普通数组的优势是可以自动增容,相对于链表的优势是可以下标访问。首先设计接口:1、数据结构如下:#include<stdint.h>/// <summary>/// 数组对象/// </summary>typedef struct { //元素个数 size_t count; //容量 size_t capacity; //元素大小 size_t elementSize; //数据 uint8_原创 2021-09-01 23:55:12 · 3694 阅读 · 0 评论 -
c语言实现加减乘除24算法
加减乘除24是一种扑克牌游戏,在一副扑克中随机抽取4张牌,使用牌上面的数字通过加减乘除计算出结果等于24的组合,先算出来的人获胜。曾经在学校的时候,实现过了这样的算法,列举出所有组合。现在发出来当做记录吧。ac_cal24.h#ifndef AC_CAL24_H#define AC_CAL24_H/// <summary>/// 计算4个数加减乘除等于24的所有组合/// </summary>/// <param name="a">[in]数字1&..原创 2021-08-31 21:40:38 · 2750 阅读 · 0 评论 -
c语言实现哈希字典
做项目写业务逻辑的时候经常用到的数据结构有2个,一个是动态数组还一个是字典。大部分编程语言,都有提供上述两种数据结构的集合类标准库。但是c语言是没有提供这类标准库的,所以本文的目的是提供一种c语言实现哈希字典的方法。一、接口的设计1、数据结构虽然基于接口最小化原则,最好是不要提供任何结构体,而提供句柄之类的方式。但是字典这种数据结构有时还是需要在栈上使用的,为了让使用者能够更灵活的选择不同的内存分配策略,所以个人认为字典应该对外暴露其结构体。具体定义如下:typedef struct { void原创 2021-02-09 10:01:47 · 3070 阅读 · 7 评论