![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 80
CodeOfCC
c++ 音视频开发
展开
-
C++ 将字符串解析为argc、argv
一般开启子进程的时候,需要传参数,通常直接传输命令行字符串,进入main会自动转换为argc、argv的形式。有些时候会需要需要自己解析命令行的情况,通常采用split空格就可以了,但如果需要支持双引号则会麻烦一些。以上就是今天要讲的内容,本文的实现是比较简单的,用的方法算是比较巧妙,只要支持split就可以用本文的方法实现命令行的解析。原创 2024-05-16 11:16:26 · 361 阅读 · 0 评论 -
Windows C/C++ 任意线程通过hwnd将操作发送到UI线程执行
以上就是今天要讲的内容,本文仅仅简单的实现了通用的线程invoke,且只支持同步,通用的异步invoke实现稍微复杂些(基本实现的方式则比较简单),以后有空再做。总的来说,有了本文的代码很大程度的方便了使用,尤其是一个新的项目突然需要invoke功能,按照基本实现的方式在窗口中写一遍是很麻烦的,而优化的实现则可以直接复用,调用invoke即可。原创 2024-03-09 22:58:54 · 482 阅读 · 0 评论 -
使用eXosip+ffmpeg、ffplay命令行实现sip客户端
使用sip做视频通话时,会遇到需要使用ip摄像头作为视频源的情况,查了资料使用pjsip通常也需要改源码。pjsip包含的功能很完整,有点过于庞大,很多功能并不需要。而且笔者有一个想法,只要有个能处理sip交互的库+音视频这块另外实现,比如和先使用ffmpeg和ffplay命令行作为音视频测试,成功后再写代码实现。本文就是测试成功的方案,真正灵活的方式还是要写代码调ffmpeg,本文更多的是提供一种实现思路。//流类型 enum StreamType {原创 2023-08-07 00:48:53 · 1961 阅读 · 0 评论 -
使用ffmpeg和sdl实现多路音频混合播放
音频的播放通常是单例的,在进程内通常一个播放设备只能打开一次,且只支持一个写入。写播放器的时候,会遇到需要实现多开同时播放多个视频,比如视频剪辑工具的多轨道播放。这个时候就需要采用一定的方法,比如音频混合。本文将提供一种基于ffmpeg和sdl实现的音频多路混合的方法。以上就是今天要的内容了,采用ffmpeg结合sdl实现音频多路播放还是比较容易的,都有相关的接口去调用,只要设计实现整体的上层逻辑即可。原创 2023-06-06 23:25:35 · 638 阅读 · 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 评论 -
Windows C++程序运行过程中生成dump文件
开发Windows C++程序跟踪异常是比较重要的功能,一般情况都需要进行全局异常捕获,并且生成dump文件。而且C++没有运行时直接获取堆栈信息的方法,返回错误或者异常处理时无法记录到堆栈信息,如果这个时候能够生成dump,对于bug分析是非常有利的。原创 2022-11-09 10:06:13 · 2749 阅读 · 0 评论 -
C++ 实现一个消息队列
消息队列在多线程的场景有时会用到,尤其是线程通信跨线程调用的时候,就可以使用消息队列进行通信。C++实现一个能用的消息队列还是比较简单的,只需要一个队列一个互斥变量和一个条件变量,这些在标准库中都有提供。基于曾经写过的项目,总结出来最简单的消息队列的实现将在下文中介绍。原创 2022-10-29 13:11:26 · 10787 阅读 · 0 评论 -
C++ 实现自定义撤销重做功能
在使用c++做界面开发的时候,需要涉及到到撤销重做操作,尤其是实现白板功能时需要自己实现一套撤销重做功能,如果是qt则有QUndoable对象,可以直接拿来用。但是如果是使用gdi绘图,则可能需要自己实现了。............原创 2022-07-05 23:29:23 · 1875 阅读 · 2 评论 -
C++ 使用宏加载动态库
开发的时候,有些项目不能静态链接动态库,需要程序运行时加载动态库,这个时候根据不同平台我们通常使用LoadLibrary或dlopen将动态库加载到程序中,并且还需要定义函数指针然后在获取函数地址,这一系列的操作其实时比较麻烦的,尤其是方法较多的情况,基本没法这么做,这时候就需要将这一过程进行适当的简化。让动态加载在方法较多的情况下尽量减少工作量。.......................................原创 2022-06-19 11:32:00 · 1300 阅读 · 0 评论 -
C++ 解析aac-adts的头部信息
aac的adts封装格式的音频文件是可以直接播放的,因为其内部的数据中每一帧都带有adts头部,头部包含了解码的必要信息。不像wav文件其头部的字段都是基于byte为单位,直接使用内存结构相同的实体即可直接读取,adts的头部字段是以bit为单位的,这就给解析其头部带来了一定的难度,几乎获取每个字段都需要进行位操作,一些跨byte的位还需要进行字节序的转换。本文将提供解析adts头的具体方法及实现。原创 2022-02-25 22:24:19 · 4420 阅读 · 4 评论 -
C++ 读取h264中的nalu
h264帧通常包含多个nalu,当我们需要封装为mp4的时候,就需要获取这些nalu,读取其中的sps和pps信息,以及视频帧。h264的打包格式有2种,一种是Annex-B,另一种是AVCC,本文提供Annex-B的解析方法。原创 2022-02-24 16:46:46 · 2949 阅读 · 2 评论 -
C++ 使用fdk-aac对音频编码
mp4的音频流通常是aac编码,我们做音视频采集的时候就需要将,采集的音频PCM编码成aac,然后再打包进mp4,而aac编解码库中fdk-aac是性能较好的,使用方式也比较简单。在C++项目中使用,通常再做一层封装,提高模块的复用性和替换性。本文将展示C++将fdk-aac封装成一个编码对象,以及使用示例。原创 2022-02-02 12:13:09 · 3317 阅读 · 0 评论 -
C++ 使用Intel Media SDK 实现H.264硬编码
曾经做视频会议相关项目的时候,需要在客户端实现多路视频推流,对若干摄像头以及桌面的数据进行编码推流,当每路数据都是1080p 30fps时,采用软编对cpu的压力是比较大的而且在1080p的基础上达到30fps的帧率也是比较困难的。于是开始尝试使用硬编,发现Intel的硬编性能是非常不错的,对于多路1080p 30fps的编码实时流在相对较好的cpu中是很容易达到的。本文将说明Intel Media SDK的获取以及使用方法。原创 2022-01-23 11:00:41 · 3805 阅读 · 1 评论 -
C++ 使用waveOut实现声音播放
在Windows上实现声音播放比较简单的方法是使用winmm,其中的waveOut模块就可以打开声音设备,播放PCM数据。本文将介绍waveOut声音播放的具体实现,其实现相较于waveIn的采集简单很多,不需要通过开启子线程避免死锁,对于消息也只需要监听WOM_DONE。原创 2022-01-13 21:02:29 · 3215 阅读 · 0 评论 -
C++ 读取wav文件中的PCM数据
使用声音设备采集的声音数据通常是PCM数据,直接写入文件是无法播放的,通常的做法是将其封装成wav格式,这样播放器就能够识别且播放了。本文将介绍如何将PCM封装成wav的方法。原创 2022-01-11 16:59:22 · 4040 阅读 · 2 评论 -
C++ 实现对象池
需求无限,但资源有限的情况下,就需要对资源进行专门的管理。不断的申请和释放内存是不合理的,会造成内存的波动,以及内存不受限的增长。比如,实现了一个消息队列,当发消息的速度快于处理消息的速度时,如果不对资源进行控制,就会导致内存不断的增长。除非有专门的内存管理机制,或明确的编译器优化内存复用,否则建立一个资源管理模块是很有必要的。对象池就是一个对限定数量资源复用管理的模块。原创 2022-01-05 16:09:48 · 3154 阅读 · 7 评论 -
C++ 将音频PCM数据封装成wav文件
使用声音设备采集的声音数据通常是PCM数据,直接写入文件是无法播放的,通常的做法是将其封装成wav格式,这样播放器就能够识别且播放了。本文将介绍如何将PCM封装成wav的方法。原创 2022-01-01 16:17:44 · 2990 阅读 · 21 评论 -
C++ 使用waveIn实现声音采集
在Windows上实现录音比较简单的方法是使用winmm,其中的waveIn模块就可以打开录音设备,获取PCM数据,进行声音录制。本文将介绍waveIn录音的具体实现,以及如何避免死锁。原创 2022-01-01 15:39:28 · 4843 阅读 · 5 评论 -
C/C++ 高精度(加减乘除)算法实现
前言C/C++基本类型做算数运算长度有限,但也基本满足大部分场景使用了,有时需要计算大长度数据时就有点无能为力了,比如1000的阶乘结果就有2000位,用基本类型是无法计算的。高精度的算法,一般的方式是用一个很长的数组去记录数据,数组的每一位记录固定位数的数字,记录顺序是低到高位。计算方式则通常采用模拟立竖式计算。计算方法有一些优化,比如FFT快速傅里叶变换优化乘法,牛顿迭代优化除法。方法采用的,就是上述的一般方式,用数组从低到高位记录数据,计算方式采用模拟立竖式计算。一、定义一些必要的参数1、计原创 2021-01-23 19:19:02 · 3641 阅读 · 1 评论 -
C++实现事件委托delegate
用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含一系列的回调函数。但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是很不错的一种方式。参考了duilib的CDelegate和C#的Deleagte<T>得出如下实现:#pragma once#include<functional>#include <map>#include<vector>#in原创 2020-12-25 18:09:08 · 1867 阅读 · 0 评论