![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 54
hcmonk
虚心好学者,各位多多指教。
展开
-
用fstream读写同一个文件
今天讨论fstream的实用性用法——fstream可以读或写文件,可以读取文件A的数据稍作修改写入文件B,但如果不想产生一个文件拷贝,那也可以同时读和写一个文件,但是有些情况需要注意。原创 2024-03-24 21:12:03 · 122 阅读 · 0 评论 -
【音视频】使用ffmpeg重封装视音频文件(5-3)
最近研究了下关于视音频文件重封装功能,即remux。当然,我这里只是做了简单的remux,即将格式封装如MP4、mkv格式去除,然后将音频、视频stream的一些参数拷贝到目标format上下文中,最后从源视音频文件一帧一帧读取packet写入到目标文件中。1、初始化并启动remuxer初始化remuxerint FfmpegRemuxer::init(const char* srcFilename, const char* dstFilename){ int err = ERROR_CODE_O原创 2022-01-03 22:48:35 · 1235 阅读 · 0 评论 -
【音视频】在SDK中集成windows视音频设备热插拔功能(5-2)
上一篇实现了windows的音视频设备热插拔功能,这一篇集成到SDK中。我的对外接口类是HCMDesktopRecorder,该篇主要讲如何集成热插拔功能,其他代码忽略。1、开启并注册热插拔int HCMDesktopRecorder::init(/* 忽略 */){ /* 忽略 */ // Create thread for detect device callback m_detectDeviceThread = std::thread(std::bind(&HCMDesktop原创 2022-01-03 22:25:05 · 1550 阅读 · 0 评论 -
【音视频】实现windows视音频设备热插拔功能(5-1)
最近想完善视音频设备功能,所以研究下windows的热插拔实现。本篇主要介绍视音频设备,如摄像头、麦克风、扬声器等热插拔的代码实现。新建一个DeviceDetector类来实现热插拔功能,如下:1、开始监测设备热插拔要监测的设备GUIDstatic GUID GUID_DEVINTERFACE_LIST[] ={ // KSCATEGORY_AUDIO { 0x6994AD04, 0x93EF, 0x11D0,{ 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31原创 2022-01-03 21:54:28 · 1863 阅读 · 0 评论 -
【音视频】获取桌面程序窗口列表以及桌面、窗口的缩略图(4-4)
采集桌面、窗口,必然需要获取其列表以及缩略图。获取桌面显示器列表在《【音视频】获取视频设备-MMDeviceAPI&MONITORINFOEX(2-3)》已经讲过。本篇主要记录一下如何获取窗口列表,以及显示器、窗口的缩略图。1、获取窗口列表以及缩略图使用EnumWindows枚举所有窗口,需要实现enumWindowProc方法int VideoDevice::getApplicationDevices(std::list<VIDEO_DEVICE>& devices){原创 2021-12-11 22:47:35 · 1718 阅读 · 6 评论 -
【音视频】使用PrintWindow实现程序窗口采集(4-3)
由于使用ffmpeg gdigrab采集程序窗口效果不太好,于是又研究了一下新的窗口截图技术,该篇文章总结一下使用PrintWindow对窗口截流的心得。1、初始化采集器如果采集的窗口最小化,先将其显示出来,然后通过GetWindowRect获取窗口大小,PrintWindow可以截取窗口的全部区域(包括客户区域和标题区域)int GdiCaptor::init(const std::string& deviceId, const int fps){ int err = ERROR_COD原创 2021-12-11 21:50:37 · 1515 阅读 · 0 评论 -
【音视频】使用DXGI实现多屏幕采集(4-2)
既然使用ffmpeg gdigrab可以实现辅屏的采集,那么必须适配一下DXGI的多屏幕采集(先前实现参考《【音视频】WIN8|WIN10的桌面采集技术-DXGI(一)》)。1、修改初始化d3d函数将获取的IDXGIAdapter和IDXGIOutput保存为成员int DuplicationCaptor::initD3d(){ int err = ERROR_CODE_OK; do { err = getAdapter(&m_adapter, &m_output, m_ou原创 2021-12-11 21:26:52 · 2672 阅读 · 0 评论 -
【音视频】使用ffmpeg gdigrab采集桌面和程序窗口(4-1)
最近在研究程序窗口截流,因为之前用过ffmpeg的gdigrab,所以知道gdigrab也可以截取窗口图片,但实际上没用过。经过研究,通过将avformat_open_input中url设置为“title={程序名}"获取format context从而得到图片。1、初始化gdigrab采集器int GdigrabCaptor::init(const std::string& deviceId, const int fps){ int err = ERROR_CODE_OK; if (m_原创 2021-12-11 20:49:18 · 5115 阅读 · 2 评论 -
【音视频】使用FFMPEG读取本地|网络音视频流(3-4)
前篇:继上一篇推送网络流之后,最近又研究了一下读取网络流(顺便还有本地流)作为音视频源,此篇作为记录。一、本地|网络视频源1、初始化视频源int VStreamCaptor::init(const std::string& url, const int fps){ int err = ERROR_CODE_OK; if (m_inited) { return err; } do { m_deviceId = url; err = initStream(); if原创 2021-11-07 13:45:23 · 2244 阅读 · 0 评论 -
【音视频】使用FFMPEG进行RTSP|RTMP|HLS推流(3-3)
前言:网络上基本上没有将RTMP|RTSP|HLS推流写在一起的文章,一是RTMP、RTS这P两个服务器的搭建不一样,二是我的这几个推流代码是复用的,所以写了一篇推流合集。我在之前搭建了RTMP和RTSP服务器的基础上(参考《【音视频】RTSP服务器搭建及FFMPEG命令推流(3-1)》以及《【音视频】在windows下搭建RTMP服务器(3-2)》),使用ffmpeg编写关于rtsp|rtmp|hls推流代码。这里可以将摄像头或者桌面作为视频源,电脑麦克风或者摄像头麦克风作为音频源进行推流(之前也写过原创 2021-11-06 23:37:34 · 4572 阅读 · 1 评论 -
【音视频】获取视频设备-MMDeviceAPI&MONITORINFOEX(2-3)
获取音频设备,包括获取摄像头、显示器设备。主要介绍获取设备列表以及默认设备。技术简介使用mmdeviceapi和MONITORINFOEX技术可以获取摄像头、显示器设备使用模块(库)使用windows的mmdeviceapi、MONITORINFOEX库主要流程和代码获取摄像头设备列表int VideoDevice::getCameraDevices(std::list<VIDEO_DEVICE>& devices){ int err = ERROR_CODE_OK;原创 2021-09-21 22:29:55 · 522 阅读 · 0 评论 -
【音视频】视频混流-avfilter(2-2)
要想将摄像头采集的视频流和桌面采集的视频流混成一股流,需要再次借助ffmpeg的avfilter功能库。技术简介借助fmpeg的filter功能,将两股视频合成一股视频流,从而实现两股视频的画中画效果使用模块(库)使用ffmpeg的avfilter库主要流程和代码1、初始化视频混流器。最需要关注的是filterDesc,即"[in0]setpts=PTS-STARTPTS,scale=%dx%d[main];[in1]setpts=PTS-STARTPTS,scale=%dx%d[over];[原创 2021-09-21 21:55:19 · 786 阅读 · 0 评论 -
【音视频】摄像头采集-dshow(2-1)
从本篇开始,作者的音视频编程之旅即将进入第二阶段,在之前采集桌面、麦克风、扬声器写成mp4|mkv等可播放文件的基础上,添加了摄像头的采集,可以将摄像头替换桌面作为视频端输入源,也可以将摄像头和桌面两股视频流混合作为一股视频输入源。技术简介采集摄像头,应该有人马上会想起dshow,是的,不过我用到了ffmpeg里面的dshow技术,ffmpeg集成了dshow使得使用更加方便了,不过要得到更详细的摄像头设备信息,还是需要使用到com知识。使用模块(库)主要使用的是ffmpeg的format、devi原创 2021-09-21 17:59:23 · 1152 阅读 · 0 评论 -
【音视频】获取音频设备-mmdeviceapi(八)
获取音频设备,包括获取麦克风、扬声器设备。主要介绍获取设备列表以及默认设备。技术简介使用ffmpeg的相关技术以及mmdeviceapi使用模块(库)使用ffmpeg的avdevice-58.dll主要流程和代码获取默认设备int AudioDevice::getDefaultDevice(bool isMic, std::string& id, std::string& name){ HELPER::ComUtil comUtil; int err = ERROR_C原创 2021-04-11 22:12:59 · 930 阅读 · 0 评论 -
【音视频】保存同步的音视频文件-ffmpeg(九)
如何将两股音频和视频合成一个视音同步的可播放的文件呢?本文中用到了ffmpeg的写文件技术。原创 2021-04-11 16:40:00 · 499 阅读 · 0 评论 -
【音视频】音频编码-aac(七)
本文介绍音频编码,使用了ffmpeg在音频编码器实现aac的编码。技术简介使用ffmpeg的编码器使用模块(库)使用ffmpeg的avcodec-58.dll主要流程和代码1、初始化音频编码器int AacEncoder::init(AVSampleFormat format, int samplerate, int bitrate, int channels){ int err = ERROR_CODE_OK; if (m_inited) { return err; } d原创 2021-04-05 20:46:47 · 1079 阅读 · 0 评论 -
【音视频】音频混流-avfilter(六)
要实现两股音频混流功能,需要用到ffmpeg的filter库,它可以自定义过滤器并实现两股甚至多股音频的融合。技术简介使用ffmpeg的filter功能实现使用模块(库)使用ffmpeg的avfilter-7.dll主要流程和代码1、初始化音频混合器int AudioMixer::init(const AUDIO_FILTER_CTX& outCtx, const AUDIO_FILTER_CTX* inCtx0, const AUDIO_FILTER_CTX* inCtx1){原创 2021-04-05 20:33:47 · 470 阅读 · 0 评论 -
【音视频】音频重采样-avfilter(五)
本篇介绍音频重采样技术,音频重采样其实跟视频转码有异曲同工之妙,可以理解为将源pcm转码为目标pcm供编码器编码使用,因为有时候只需要采样率很低的音频。技术简介使用ffmpeg的filter功能实现使用模块(库)使用ffmpeg的avfilter-7.dll主要流程和代码1、初始化重采样器int AudioResampler::init(const AUDIO_FILTER_CTX& outCtx, const AUDIO_FILTER_CTX* inCtx0, const AUDIO原创 2021-04-05 20:04:04 · 512 阅读 · 0 评论 -
【音视频】音频采集-WASAPI(四)
本篇主要介绍音频的采集技术,使用的是WASAPI技术。技术简介WASAPI全称是Windows Audio Session API(Windows音频会话API),是从Windows Vista之后引入的UAA(Universal Audio Architecture)音频架构所属的API。主要流程和代码1、初始化采集器int WasapiCaptor::init(bool isMic, const std::string& deviceId, const std::string&原创 2021-04-05 19:38:37 · 1977 阅读 · 1 评论 -
【音视频】视频编码-H264(三)
本篇主要介绍视频编码,将转码之后的YUV420像素数据编码为H264裸数据。技术简介使用ffmpeg的编码器使用模块(库)使用ffmpeg的avcodec-58.dll主要流程和代码1、初始化编码器int H264Encoder::init(int width, int height, int framerate, int bitrate, int qb, int gopTime){ int err = ERROR_CODE_OK; if (m_inited) { return e原创 2021-04-05 17:43:28 · 224 阅读 · 0 评论 -
【音视频】视频转码-SWS(二)
继桌面采集之后的第二篇关于音视频的文章,本篇主要实现视频的转码,将采集的BRGA转码为YUV420。技术简介使用ffmpeg sws实现转码。使用模块(库)ffmpeg的swscale-5.dll主要流程和代码1、初始化转码器int FfmpegSwsTranscoder::init(AVPixelFormat srcFmt, int srcWidth, int srcHeight, AVPixelFormat dstFmt, int dstWidth, int dstHeight){ i原创 2021-04-05 16:13:52 · 257 阅读 · 0 评论 -
在MacOS下使用cef3全选、拷贝、粘贴、剪切html的输入框文字
本人前段时间在开发MacOS项目的时候遇到一个问题,我用的框架是以SDL2为窗口、CEF3为浏览器加载HTML,当我想要用"Command+C"拷贝输入框账号时,发现无法全选,更不用说拷贝了,于是在某度上搜索了大半天愣是没找到解决方案,最后在CEF官网上找到了答案,这应该是CEF3的一个bug,在这里分享一下自己解决的经验。PS:本人第一次写博客,多有不足之处,多多包涵。代码片段主线程cpp片段(手动实现macOS的键盘组合键的全选、拷贝、粘贴以及剪切功能)SDL_Event e;uint32 m原创 2020-06-11 12:10:44 · 892 阅读 · 0 评论 -
【音视频】WIN8|WIN10的桌面采集技术-DXGI(一)
WIN8|WIN10的桌面采集技术-DXGI目录技术简介使用模块(库)主要流程和代码本篇文章是本人音视频技术文章集中的开篇,之后会持续更新创作更多关于音视频的文章。望有大佬可以交流、指点。文章主要表现形式是以实现为主,扩展知识为辅,所以一般比较长,不过也有更多实现细节以供参考。目录技术简介DXGI(Microsoft DirectX Graphics Infrastructure)是微软提供的一种可以在win8及以上系统使用的图形设备接口。它负责枚举图形适配器、枚举显示模式、选择缓冲区格式、在进程原创 2021-01-10 21:59:07 · 2793 阅读 · 3 评论