自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 【音视频】Windows下获取App窗口缩略图优化(6-1)

因为主要针对采集缩小化的窗口缩略图采集不到问题,所以思路如下:依然遍历所有App窗口,如果没有最小化那么按照原来思路采集,如果是最小化窗口,则使用DWM将最小化窗口显示在自己创建的Layered窗口X上面,窗口X远离屏幕显示区域显示,接着用原来的采集方法采集X的缩略图即可。至此,获取App窗口缩略图优化完成,完美收尾!只要不断努力钻研,有朝一日定有收获。

2024-05-05 20:51:32 322

原创 在Windows下使用shell编译自己的FFmpeg库

之前在Windows下编译过FFmpeg库,但是编译出来的DLL库不仅个数多达7个,而且库总大小高达几十兆。现经过研究,使用shell脚本根据自己的需要编译自己的FFmpeg库,不仅可以编译出来一个自己命名的DLL,而且大小可以减小到10MB以下。

2024-04-14 22:09:12 577

原创 用fstream读写同一个文件

今天讨论fstream的实用性用法——fstream可以读或写文件,可以读取文件A的数据稍作修改写入文件B,但如果不想产生一个文件拷贝,那也可以同时读和写一个文件,但是有些情况需要注意。

2024-03-24 21:12:03 100

原创 【音视频】使用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 1213

原创 【音视频】在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 1537

原创 【音视频】实现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 1816

原创 【音视频】获取桌面程序窗口列表以及桌面、窗口的缩略图(4-4)

采集桌面、窗口,必然需要获取其列表以及缩略图。获取桌面显示器列表在《【音视频】获取视频设备-MMDeviceAPI&MONITORINFOEX(2-3)》已经讲过。本篇主要记录一下如何获取窗口列表,以及显示器、窗口的缩略图。1、获取窗口列表以及缩略图使用EnumWindows枚举所有窗口,需要实现enumWindowProc方法int VideoDevice::getApplicationDevices(std::list<VIDEO_DEVICE>& devices){

2021-12-11 22:47:35 1681 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 1497

原创 【音视频】使用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 2621

原创 【音视频】使用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 4268 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 2211

原创 【音视频】使用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 3604 1

原创 【音视频】在windows下搭建RTMP服务器(3-2)

最近在使用ffmpeg进行rtmp推流开发,那么必须先搭建rtmp服务器。一、搭建时需要用到的软件1、下载 nginx 1.7.11.3 Gryphon链接: http://nginx-win.ecsds.eu/download/nginx 1.7.11.3 Gryphon.zip下载完成后解压,将文件夹中的空格改为下划线,重命名为nginx_1.7.11.3_Gryphon,否则局域网内的其他电脑会发生无法访问rtmp的现象。2、下载服务器状态检查程序链接:https://github.com

2021-11-03 23:21:58 3093

转载 【音视频】RTSP服务器搭建及FFMPEG命令推流(3-1)

最近开始使用ffmpeg做网络推流的事情,例如rtmp、rtsp推流等。这里参考以下文章先搭建rtsp服务器实现ffmepg命令推流,之后会写代码实现推流功能。转载地址链接:https://blog.csdn.net/weixin_40448140/article/details/113180796

2021-11-03 21:41:37 997

原创 【音视频】获取视频设备-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 496

原创 【音视频】视频混流-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 771

原创 【音视频】摄像头采集-dshow(2-1)

从本篇开始,作者的音视频编程之旅即将进入第二阶段,在之前采集桌面、麦克风、扬声器写成mp4|mkv等可播放文件的基础上,添加了摄像头的采集,可以将摄像头替换桌面作为视频端输入源,也可以将摄像头和桌面两股视频流混合作为一股视频输入源。技术简介采集摄像头,应该有人马上会想起dshow,是的,不过我用到了ffmpeg里面的dshow技术,ffmpeg集成了dshow使得使用更加方便了,不过要得到更详细的摄像头设备信息,还是需要使用到com知识。使用模块(库)主要使用的是ffmpeg的format、devi

2021-09-21 17:59:23 1106

原创 【音视频】获取音频设备-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 887

原创 【音视频】保存同步的音视频文件-ffmpeg(九)

如何将两股音频和视频合成一个视音同步的可播放的文件呢?本文中用到了ffmpeg的写文件技术。

2021-04-11 16:40:00 475

原创 【音视频】音频编码-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 1050

原创 【音视频】音频混流-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 454

原创 【音视频】音频重采样-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 473

原创 【音视频】音频采集-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 1914 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 215

原创 【音视频】视频转码-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 240

原创 【音视频】WIN8|WIN10的桌面采集技术-DXGI(一)

WIN8|WIN10的桌面采集技术-DXGI目录技术简介使用模块(库)主要流程和代码本篇文章是本人音视频技术文章集中的开篇,之后会持续更新创作更多关于音视频的文章。望有大佬可以交流、指点。文章主要表现形式是以实现为主,扩展知识为辅,所以一般比较长,不过也有更多实现细节以供参考。目录技术简介DXGI(Microsoft DirectX Graphics Infrastructure)是微软提供的一种可以在win8及以上系统使用的图形设备接口。它负责枚举图形适配器、枚举显示模式、选择缓冲区格式、在进程

2021-01-10 21:59:07 2746 3

原创 在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 867

空空如也

空空如也

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

TA关注的人

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