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
英文地址,請注明出處:http://en.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場景配置文件。