C++与C#实战:FFmpeg屏幕录制开发指南

基于FFmpeg使用C#和C++开发

以下是一些基于FFmpeg使用C#和C++开发的简单屏幕录制软件示例,涵盖不同平台和功能需求。这些示例可作为学习或项目开发的起点。

使用C++开发FFmpeg屏幕录制

基础屏幕录制(Windows)
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <Windows.h>int main() {AVFormatContext* formatContext = nullptr;avformat_alloc_output_context2(&formatContext, nullptr, "flv", "output.flv");// 配置视频流(使用GDI抓屏)AVStream* stream = avformat_new_stream(formatContext, nullptr);stream->codecpar->codec_id = AV_CODEC_ID_H264;stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;stream->codecpar->width = GetSystemMetrics(SM_CXSCREEN);stream->codecpar->height = GetSystemMetrics(SM_CYSCREEN);stream->codecpar->format = AV_PIX_FMT_BGR0;avio_open(&formatContext->pb, formatContext->filename, AVIO_FLAG_WRITE);avformat_write_header(formatContext, nullptr);// 模拟抓帧(实际需用GDI/DXGI)AVPacket pkt;av_new_packet(&pkt, 0);av_write_frame(formatContext, &pkt);av_write_trailer(formatContext);avio_closep(&formatContext->pb);
}

使用DXGI抓屏(高性能)
#include <dxgi.h>
#include <d3d11.h>
// 需结合FFmpeg的硬件加速编码(如h264_nvenc)
Linux X11屏幕录制
#include <X11/Xlib.h>
// 使用XGetImage抓屏后通过FFmpeg编码

使用C#开发FFmpeg屏幕录制

通过Process调用FFmpeg
using System.Diagnostics;Process.Start("ffmpeg", "-f gdigrab -i desktop -c:v libx264 output.mp4");
使用FFmpeg.AutoGen(原生封装)
using FFmpeg.AutoGen;public unsafe class Recorder {public void Start() {AVFormatContext* fmtCtx = null;ffmpeg.avformat_alloc_output_context2(&fmtCtx, null, "mp4", "output.mp4");// 配置视频流参数AVStream* stream = ffmpeg.avformat_new_stream(fmtCtx, null);AVCodecParameters* codecpar = stream->codecpar;codecpar->codec_id = AVCodecID.AV_CODEC_ID_H264;codecpar->width = 1920;codecpar->height = 1080;}
}
结合AForge.NET抓屏
using AForge.Video.DirectShow;
// 通过ScreenCaptureStream获取帧后传给FFmpeg编码

功能扩展示例

录制系统音频
ffmpeg -f dshow -i audio="麦克风" -f gdigrab -i desktop output.mkv
区域录制
Process.Start("ffmpeg", "-f gdigrab -offset_x 100 -offset_y 200 -video_size 1280x720 -i desktop -c:v libx264 region.mp4");
硬件加速录制(NVIDIA)
av_dict_set(&opts, "preset", "fast", 0);
av_dict_set(&opts, "c:v", "h264_nvenc", 0);

其他语言/平台示例

Python调用FFmpeg
import subprocess
subprocess.run(["ffmpeg", "-f", "avfoundation", "-i", "1", "output.mov"])  # macOS
Electron桌面应用
const { exec } = require('child_process');
exec('ffmpeg -f x11grab -i :0.0 output.mp4');

关键注意事项

  • 分辨率设置:需与显示器实际分辨率匹配
  • 帧率控制:通过-r参数指定(如-r 30
  • 编码选择
    • 软件编码:libx264(CPU)
    • 硬件编码:h264_nvenc(NVIDIA)、h264_amf(AMD)
  • 内存管理:C++示例需手动释放FFmpeg资源

完整项目建议参考:

  • ScreenRecorderLib(C#库)
  • QtFFmpegScreenRecorder(C++/Qt实现)
  • OBS Studio开源代码(高级参考)

基于C++和FFmpeg的移动端开发实例

以下是一些基于C++和FFmpeg的移动端开发实例,涵盖音视频处理、编解码、流媒体等常见场景。所有示例均适配Android/iOS平台,代码结构简洁,适合快速实现功能集成。

音视频基础处理

解码本地视频文件
使用avformat_open_inputavcodec_send_packet实现视频解码,输出YUV帧数据:

AVFormatContext* fmt_ctx = nullptr;
avformat_open_input(&fmt_ctx, input_path, nullptr, nullptr);
AVCodecContext* codec_ctx = avcodec_alloc_context3(decoder);
avcodec_parameters_to_context(codec_ctx, fmt_ctx->streams[video_index]->codecpar);
avcodec_open2(codec_ctx, decoder, nullptr);

提取音频PCM数据
通过swr_convert将音频重采样为PCM格式:

SwrContext* swr = swr_alloc_set_opts(nullptr, out_ch_layout, out_sample_fmt, out_sample_rate,in_ch_layout, in_sample_fmt, in_sample_rate, 0, nullptr);
swr_convert(swr, &out_buffer, out_samples, (const uint8_t**)in_buffer, in_samples);

高级功能实现

视频实时滤镜
应用FFmpeg滤镜链实现色彩调整(需链接libavfilter):

AVFilterContext* buffersrc = avfilter_graph_alloc_filter(graph, buffersrc_c, "src");
avfilter_graph_create_filter(&buffersink, buffersink_c, "sink", nullptr, nullptr, graph);
AVFilterInOut* outputs = avfilter_inout_alloc();
outputs->name = av_strdup("in");
outputs->filter_ctx = buffersrc;

硬件加速解码
Android上使用MediaCodec硬解(NDK集成):

AVBufferRef* hw_device_ctx = nullptr;
av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_MEDIACODEC, nullptr, nullptr, 0);
codec_ctx->hw_device_ctx = av_buffer_ref(hw_device_ctx);

流媒体与网络

RTMP直播推流
配置输出流并发送数据包:

AVOutputFormat* ofmt = av_guess_format("flv", nullptr, nullptr);
avformat_alloc_output_context2(&out_fmt_ctx, ofmt, nullptr, rtmp_url);
avio_open(&out_fmt_ctx->pb, out_fmt_ctx->filename, AVIO_FLAG_WRITE);
avformat_write_header(out_fmt_ctx, nullptr);
av_interleaved_write_frame(out_fmt_ctx, &pkt);

HLS切片生成
设置分段参数并生成m3u8文件:

AVDictionary* opts = nullptr;
av_dict_set(&opts, "hls_time", "10", 0);
av_dict_set(&opts, "hls_list_size", "6", 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91015.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「源力觉醒 创作者计划」_DeepseekVS文心一言代码简单测试

一起来轻松玩转文心大模型吧一文心大模型免费下载地址&#xff1a;https://ai.gitcode.com/theme/1939325484087291906小插曲发现自己的上一篇文章的被盗了&#xff0c;而且是在deepseek上检索资料发现的&#xff0c;最让我破防的点在于&#xff0c;它完完全全搬运我的文章&…

服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某公司一台服务器上有一组由24块FC硬盘组建的raid。 服务器出现故障&#xff0c;无法正常工作。 经过初步检测&#xff0c;管理员发现导致服务器故障的原因是raid中有两块硬盘掉线&#xff0c;导致卷无法挂载。服务器数据恢复过程&…

链表迭代翻转|二分|状态压缩bfs|数学

&#x1f36d;lc2039.bfs空闲时间把网络抽象成图&#xff0c;用 BFS 算出 0 号节点到各节点的最短距离 d 。结合每个节点发消息的间隔 patience[v] &#xff0c;先算消息往返需要 2d 秒。再看 2d 和 patience[v] 的关系若 2d 能被 patience[v] 整除&#xff0c;最后一条消息已发…

Vulnhub 02-Breakout靶机渗透攻略详解

一、下载靶机 下载地址&#xff1a;https://download.vulnhub.com/empire/02-Breakout.zip 下载好后使用VM打开&#xff0c;将网络配置模式改为net&#xff0c;防止桥接其他主机干扰&#xff08;桥接Mac地址也可确定主机&#xff09;。 二、发现主机 使用nmap扫描没有相应的…

数据结构(5)单链表算法题(中)

一、合并两个有序链表 1、题目描述 https://leetcode.cn/problems/merge-two-sorted-lists 2、算法分析 这道题和之前的合并两个有序数组的思路很像&#xff0c;创建空链表即可&#xff0c;可以很轻松地写出如下代码。 /*** Definition for singly-linked list.* struct L…

园区网络搭建实验

跟着B站上的老师&#xff0c;用华为ensp模拟搭建了一个园区网络&#xff0c;感觉挺好玩的虽然老师说这个很简单&#xff0c;但还是比我公司里的拓扑复杂LSW3配置上行端口3/4配置为串口&#xff0c;下行端口1/2为access口用于连接终端[Huawei]vlan batch 10 20 --创建vlan [Hua…

【tips】小程序css ➕号样式

上传的时候一般页面显示的是加号。不用图片可以用样式实现&#xff1b;wxss&#xff1a; /* 加号 */ .plus-box {width: 91rpx;height: 91rpx;border-radius: 6rpx;background: rgba(204, 204, 204, 1);position: relative; /* 用于定位加号 */ }/* 水平线条 */ .plus-box::bef…

MCU中的GPIO(通用输入/输出)是什么?

MCU中的GPIO(通用输入/输出)是什么? GPIO(General-Purpose Input/Output,通用输入/输出)是微控制器(MCU)或嵌入式系统中的一种可编程数字接口,用于与外部设备进行简单的高低电平信号交互。它是最基础、最常用的外设之一,广泛应用于按键检测、LED控制、传感器通信等场…

echarts 之 datazoom Y轴缩放

如果想 y 轴也能够缩放&#xff0c;那么在 y 轴上也加上 dataZoom 组件const dataZoomY ref([{type: "slider",yAxisIndex: 0,startValue: 0,endValue: 9,filterMode: "empty",width: 10,height: "80%",showDataShadow: false,left: 5,},{type:…

(四)Python基础入门-核心数据结构

概览 列表操作&#xff08;增删改查/切片/推导式&#xff09;元组特性与不可变性字典操作&#xff08;键值对/嵌套字典&#xff09;集合运算&#xff08;交集/并集/差集&#xff09; Python的核心数据结构是编程的基石&#xff0c;本文将系统讲解列表、元组、字典和集合四大数…

FCN语义分割算法原理与实战

FCN语义分割算法原理与实战 本文若有舛误&#xff0c;尚祈诸君不吝斧正&#xff0c;感激不尽。 前提概要&#xff1a;所使用的材料来源 对应视频材料&#xff1a;FCN语义分割 虽然可能比较简单但是奠定了使用卷积神经网络做语义分割任务的基础。 语义分割&#xff1a;输入图片…

堆的理论知识

1 引入1.1 普通二叉树不适合用数组存储的原因普通二叉树的结构是 “不规则” 的 —— 节点的左右孩子可能缺失&#xff0c;且缺失位置无规律。 若用数组存储&#xff08;按 “层次遍历顺序” 分配索引&#xff0c;即根节点放索引 0&#xff0c;根的左孩子放 1、右孩子放 2&…

【python实用小脚本-161】Python Json转Xml:告别手敲标签——一行命令把配置秒变可导入的XML

Python Json转Xml&#xff1a;告别手敲标签——一行命令把配置秒变可导入的XML 关键词&#xff1a;json转xml、零依赖脚本、自动生成标签、小白友好、跨平台故事开场&#xff1a;周五下午&#xff0c;老板又甩来“配置翻译”任务 17:55&#xff0c;你正准备关机&#xff0c;老板…

WisFile(文件整理工具) v1.2.19 免费版

下载&#xff1a;https://pan.quark.cn/s/db99b679229fWisFile是一款免费AI文件管理工具&#xff0c;可以在电脑本地运行。它专注于解决文件命名混乱、归类无序和手动整理耗时的问题。通过AI技术智能识别文件内容&#xff0c;支持批量重命名和智能分类归档功能&#xff0c;可自…

简历美容院:如何把“打杂经历“包装成“核心项目“?

简历美容院&#xff1a;如何把"打杂经历"包装成"核心项目"&#xff1f; 大家好&#xff0c;我是程序员小白条&#xff0c;今天来研究下简历包装的事&#xff0c;小白可以按我的包装流程走&#xff0c;可以分步骤进行包装&#xff0c;具体怎么进行可以看正文…

零基础-动手学深度学习-7.7 稠密连接网络(DenseNet)

ResNet极大地改变了如何参数化深层网络中函数的观点。 稠密连接网络&#xff08;DenseNet&#xff09;在某种程度上是ResNet的逻辑扩展。让我们先从数学上了解一下。 7.7.1. 从ResNet到DenseNet 7.7.2. 稠密块体 DenseNet使用了ResNet改良版的“批量规范化、激活和卷积”架构…

Marin说PCB之POC电路layout设计仿真案例---09

好消息&#xff0c;好消息&#xff0c;小编最爱的国漫凡人修仙传电视剧版本的终于可以看了&#xff0c;小编我推荐一波啊&#xff0c;感兴趣的道友们可以去某酷视频去追剧啊。 好了&#xff0c;咱们言归正传啊。本期的案例是这个月中旬我们组的测试大哥阿永去某田实验室去测试我…

论文阅读--射频电源在半导体领域的应用

《射频电源在半导体领域的应用》 论文信息&#xff1a;左政,冯国楠,李建慧,等.射频电源在半导体领域的应用[J].软件和集成电路,2025,(04):38-43.DOI:10.19609/j.cnki.cn10-1339/tn.2025.04.007. 一、射频电源的定义与分类 1.1 定义射频电源&#xff08;RF Power Supply&#xf…

绿算技术携手昇腾发布高性能全闪硬盘缓存设备,推动AI大模型降本增效

在数字化浪潮席卷全球的今天&#xff0c;人工智能已经成为推动企业创新与发展的重要力量。广东省绿算技术有限公司&#xff08;简称“绿算技术”&#xff09;紧跟时代步伐&#xff0c;基于华为昇腾AI大模型&#xff0c;推出了高性能全闪硬盘缓存设备&#xff0c;致力于为人工智…

HoloLens2系列讲解 - 06 基本操作

一、导入MRTK插件 1. 首先要新建一个项目,打开unity,新建一个project。 2. 导入MRTK包。 3. 点击 Mixed Reality Toolkit > Add to scene and Configure 添加MR场景配置文件。