【開發技術】.Net使用FFmpeg視頻特定幀上繪制內容

目錄

一、目的

二、解決方案

2.1 什么是FFmpeg

2.2 FFmpeg主要功能

2.3 使用Xabe.FFmpeg調用FFmpeg功能

2.4 使用 FFmpeg 的 drawbox 濾鏡來繪制 ROI

三、總結


一、目的

當前市場上有很多目標檢測智能識別的相關算法,當前調用一個醫療行業的AI識別算法后返回了一堆對應幀上的ROI數據,因此為了展示算法識別效果,把返回的Roi畫到對應幀上進行展示,這里使用FFmpeg對視頻進行處理,基于FFmpeg 的 drawbox 濾鏡來繪制 ROI。
????????展示:
處理前:
處理后:

二、解決方案

2.1 什么是FFmpeg

FFmpeg 本身是一個多媒體處理工具,它可以對視頻流進行各種處理(如裁剪、濾鏡、編碼等),以及 視頻流推送到 RTMP 服務器或從 RTMP 服務器拉取流。

2.2 FFmpeg主要功能

FFmpeg 主要用于以下幾個方面:
  • 推流:將本地視頻文件或實時視頻流推送到 RTMP 服務器。
  • 拉流:從 RTMP 服務器拉取視頻流并進行處理(如轉碼、轉封裝等)。
  • 處理流:對視頻流進行各種處理(如裁剪、濾鏡、編碼等)。

2.3 使用Xabe.FFmpeg調用FFmpeg功能

Xabe.FFmpeg 是一個基于 .NET Standard 的 FFmpeg 封裝庫,旨在簡化媒體處理任務。它允許開發者在不了解 FFmpeg 工作原理的情況下,通過 .NET Core 應用程序調用 FFmpeg 功能,并傳遞自定義參數。Xabe.FFmpeg 提供了豐富的 API,支持視頻和音頻的轉換、剪輯、合并等操作,適用于各種媒體處理需求。
本項目中使用版本為:5.2.6
dotnet add package Xabe.FFmpeg
????????簡單使用示例:簡單展示了獲取視頻第一幀保存為圖像存儲在本地(這里也可以獲取任何特定幀)。
using AI.Demo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xabe.FFmpeg;namespace AI.Demo.Common
{public class FFmpegutil{static FFmpegutil(){//獲取存放本地ffmpg.exe路徑的文件夾路徑//如果是使用Nuget包安裝的FFmpeg,默認路徑是當前應用程序的根目錄//如果是手動下載的FFmpeg,需要將ffmpeg.exe放在應用程序的根目錄下var ffmpegPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ffmpeg.exe");if(File.Exists(ffmpegPath)){//如果ffmpeg.exe存在,則設置FFmpeg的可執行文件路徑FFmpeg.SetExecutablesPath(System.IO.Path.GetDirectoryName(ffmpegPath)); //設置FFmpeg的可執行文件路徑}else{throw new Exception("ffmpeg.exe not found in the application directory.");}}/// <summary>  /// 獲取視頻第一幀  /// </summary>  /// <param name="inputFile">輸入文件路徑</param>  /// <param name="outputFile">輸出文件路徑</param>  /// <returns>FFmpeg命令行參數</returns>  public static async Task<string> GetVideoFrame(string inputFile){//根據傳入的視頻文件地址,獲取該視頻的第一幀圖片,并保存到指定的輸出文件路徑  if (string.IsNullOrEmpty(inputFile)){throw new ArgumentException("Input and output file paths must be provided.");}if (!File.Exists(inputFile)){throw new ArgumentException("file Not Exist");}//輸出文件路徑  string outputFile = System.IO.Path.ChangeExtension(inputFile, ".jpg");// 替換為使用 FFmpeg 的截圖功能  await FFmpeg.Conversions.New().AddParameter($"-i \"{inputFile}\" -frames:v 1 \"{outputFile}\"").Start();return outputFile;}}
}

2.4 使用 FFmpeg 的 drawbox 濾鏡來繪制 ROI

基于drawbox的enable參數來控制在特定幀上繪制,drawbox格式: “drawbox=enable='eq(n,frameIndex)':x:y:w:h:color:thickness”
 /// <summary>/// 使用 FFmpeg 的 drawbox 濾鏡來繪制 ROI/// </summary>/// <param name="inputFile"></param>/// <param name="outputFile"></param>/// <param name="locations"></param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>public static async Task<bool> DrawRoiByLocation(string inputFile,ref string analyseVdeofile, List<Location> locations){if (string.IsNullOrEmpty(inputFile)){throw new ArgumentException("Input file paths must be provided.");}if (!File.Exists(inputFile)){throw new ArgumentException("file Not Exist");}//改變輸入文件的名字,增加后綴以區分輸出文件string outputFile = System.IO.Path.ChangeExtension(inputFile, "_analyse.mp4");analyseVdeofile = outputFile;try{// 構建FFmpeg濾鏡命令StringBuilder filterBuilder = new StringBuilder();// 對每個Location(幀)和ROI處理foreach (var location in locations){int frameIndex = location.Index;// 對該幀中的每個ROI進行處理foreach (var roi in location.Rois){// 使用drawbox的enable參數來控制在特定幀上繪制// 格式:drawbox=enable='eq(n,frameIndex)':x:y:w:h:color:thicknessstring boxFilter = $"drawbox=enable='eq(n,{frameIndex})':x={roi.X}:y={roi.Y}:w={roi.W}:h={roi.H}:color=red:thickness=2";if (filterBuilder.Length > 0)filterBuilder.Append(",");filterBuilder.Append(boxFilter);}}// 創建轉換命令,直接使用輸入文件路徑而不是GetMediaInfovar conversion = FFmpeg.Conversions.New().AddParameter($"-i \"{inputFile}\"").SetOutput(outputFile);// 如果有濾鏡,添加到命令中if (filterBuilder.Length > 0){conversion.AddParameter($"-vf \"{filterBuilder}\"").AddParameter("-c:v libx264") // 使用H.264編碼器.AddParameter("-preset medium") // 編碼速度和質量的平衡.AddParameter("-crf 23") // 控制質量,值越低質量越高.AddParameter("-pix_fmt yuv420p") // 設置像素格式,提高兼容性.AddParameter("-c:a aac") // 使用AAC音頻編碼器.AddParameter("-movflags +faststart"); // 優化網絡播放}else{// 即使沒有濾鏡,也確保使用正確的編解碼器conversion.AddParameter("-c:v libx264").AddParameter("-preset medium").AddParameter("-crf 23").AddParameter("-pix_fmt yuv420p").AddParameter("-c:a aac").AddParameter("-movflags +faststart");}// 執行命令并等待完成await conversion.Start();return File.Exists(outputFile);}catch (Exception ex){Console.WriteLine($"Error drawing ROI: {ex.Message}");return false;}}

三、總結

FFmpeg是一個強大的 多媒體處理工具,以上的處理只是它整體功能中的一小部分。結合 Xabe.FFmpeg可以進行視頻的格式轉換、裁剪、增加濾鏡多種功能。同時支持在桌面應用、Web應用、Api服務、云服務多種場景下的處理需求。
????????
? ? ? ? 把之所學以文載之,歡迎大家多多交流~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84494.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過關鍵字批量抓取淘寶商品數據實現方法途徑分享--API

item_search 按關鍵字搜索淘寶商品item_search_tmall 按關鍵字搜索天貓商品item_search_pro 高級關鍵字搜索淘寶商品item_search_img 按圖搜索淘寶商品&#xff08;拍立淘&#xff09;item_search_shop 獲得店鋪的所有商品 一、引言 在電商領域&#xff0c;獲取淘寶商品數據對…

用 Lazarus IDE 寫一個郵件客戶端軟件,能收發郵件,編寫郵件

下面是一個使用Lazarus IDE開發的基本郵件客戶端實現方案&#xff0c;包含收發郵件和編寫郵件的核心功能。我們將使用Synapse庫&#xff08;跨平臺的網絡通信庫&#xff09;來處理郵件協議。 步驟1&#xff1a;安裝依賴 安裝Synapse庫&#xff1a; 下載地址&#xff1a;https:…

第二部分-IP及子網劃分

目錄 一、什么是IP? 1.1.IP地址的由來 1.2.IP地址的表示 1.3.IP地址的構成 1.4.IP地址的分類 1.5.IP地址類型 1.6.IP地址的計算 1.7.私網IP地址 1.8.特殊IP地址 二、子網劃分 2.1.什么是子網劃分及為什么要進行子網劃分? 2.2.如何進行子網劃分&#xff1f; 實例&#xff1a; …

【javascript】泡泡龍游戲中反彈和查找匹配算法

引言 泡泡龍游戲的核心玩法依賴于物理碰撞與顏色匹配的算法實現。反彈效果需要模擬泡泡與邊界或障礙物的彈性碰撞&#xff0c;確保軌跡符合物理規律&#xff1b;匹配算法則需快速檢測相鄰同色泡泡&#xff0c;觸發消除邏輯。高效的處理方式直接影響游戲流暢度和玩家體驗。 以…

如何使用deepseek滿血版

deepseek 訪問方式 DeepSeek滿血版可通過官方網站或官方應用商店下載安裝。確保設備滿足最低系統要求&#xff0c;如操作系統版本和硬件配置。 賬號注冊與登錄 訪問平臺后完成賬號注冊流程&#xff0c;提供必要信息并驗證郵箱或手機號。登錄后進入用戶中心&#xff0c;查看…

網絡管理【Linux/Unix/Windows】命令大全

在跨平臺網絡運維中&#xff0c;管理員常需快速切換Windows與Linux環境下的命令操作。本文整合了核心網絡管理命令的跨平臺對照表&#xff0c;涵蓋連通性測試、路由追蹤、DNS解析、ARP管理、會話監控等高頻場景。無論您負責服務器維護、網絡排障還是安全審計&#xff0c;此表可…

Gremlin創建schema(包括實體和關系)

1、構建圖譜schema&#xff0c;流程包括圖創建、實體構建以及關系構建。 創建圖時需要指定圖庫名稱以及主鍵字段。 實體構建時需要指定主鍵字段&#xff0c;每個屬性需要指定數據類型&#xff0c;是否非空以及默認值。關系構建時需要包括關系名稱、指向頭實體的標簽&#xff0c…

[論文閱讀]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代碼&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…

鴻蒙Next倉頡語言開發實戰教程:店鋪詳情頁

各位好&#xff0c;幽藍君又來分享倉頡開發教程了&#xff0c;今天的內容是店鋪詳情頁&#xff1a; 這個頁面的內容看似簡單&#xff0c;其實有很多小細節需要注意&#xff0c;主要還是讓大家熟悉List容器的使用。 整個頁面由導航欄和List容器兩大部分組成&#xff0c;導航欄我…

FEMFAT許可使用數據分析工具介紹

在高度競爭和快速變化的工程仿真領域&#xff0c;數據驅動的決策變得越來越重要。為了更好地了解FEMFAT許可的使用情況、提高資源利用率、優化工作流程&#xff0c;FEMFAT許可使用數據分析工具應運而生。本文將為您介紹這款強大的工具&#xff0c;助您輕松駕馭FEMFAT許可數據&a…

大模型原理面試題及參考答案

目錄 什么是大語言模型(LLM)?它與傳統語言模型的本質差異在哪里? 自回歸模型(autoregressive)與掩碼語言模型(masked LM)的異同是什么?各適合于哪些任務? Transformer 的核心構件——多頭自注意力機制如何捕捉長距離依賴? 位置編碼(positional encoding)的作用…

Gartner<Reference Architecture Brief: Data Integration>學習心得

數據集成參考架構解析 引言 在當今數字化時代,數據已成為企業最寶貴的資產之一。隨著企業規模的不斷擴大和業務的日益復雜,數據來源也變得多樣化,包括客戶關系管理(CRM)、企業資源規劃(ERP)、人力資源管理(HR)和市場營銷等領域的運營系統。這些系統雖然在其特定功能…

JAVASE:方法

JavaSE 方法詳解 一、方法的核心概念 方法&#xff08;Method&#xff09;是一組執行特定任務的語句集合&#xff0c;它將代碼邏輯封裝為可復用的單元&#xff0c;提高代碼的模塊化和可維護性。 方法的組成&#xff1a; [修飾符] 返回類型 方法名([參數列表]) {// 方法體[r…

MXNet-cu101 + CUDA 10.1 在 Windows 11 上啟用 GPU 的完整指南

一、報錯信息 (pytorch) C:\Users\Administrator\Desktop\test>D:/conda/anaconda3/envs/pytorch/python.exe c:/Users/Administrator/Desktop/test/test.py Traceback (most recent call last): File “c:/Users/Administrator/Desktop/test/test.py”, line 1, in import…

Python基礎數據類型與運算符全面解析

Python作為一門動態類型語言&#xff0c;擁有豐富的內置數據類型和運算符系統&#xff0c;構成了編程的基礎。本文將深入介紹Python核心數據類型的基本概念、特點及使用方法&#xff0c;并系統梳理運算符的分類、優先級和實際應用示例&#xff0c;幫助開發者全面掌握Python的基…

Mysql分區(單服務器應對大數據量方案)

參考資料&#xff1a; 參考視頻 參考博客 分區的復雜操作 參考資料 概述&#xff1a; 這里只講實操&#xff0c;不講原理&#xff0c;看原理請看參考資料Mysql自5.1后支持分區&#xff0c;在Mysql8之后只有InnoDB支持分區&#xff0c;Mysiam不支持分區本例只是一個簡單的說…

[Java惡補day22] 240. 搜索二維矩陣Ⅱ

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a; 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17…

基于Master-Slave主從博弈論的儲能與能源協調算法matlab仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統仿真參數 5.系統原理簡介 6.參考文獻 7.完整工程文件 1.課題概述 基于Master-Slave主從博弈論的儲能與能源協調算法matlab仿真.主從博弈&#xff08;Stackelberg Game&#xff09;是一種具有層級決策結構的博弈模型&am…

vue-print-nb 打印相關問題

一、背景與解決方案 1、ElementUI表格打印通病&#xff0c;均面臨邊框丟失、寬度超出問題&#xff1a;相關解決代碼有注釋&#xff1b; 2、大多數情況下不會打印頁眉頁腳的日期、網址、未配置popTitle顯示的undefined&#xff1a;相關解決代碼有注釋&#xff1b; 3、打印預覽頁…

Agent應用案例精選,以及主流Agent框架開源項目推薦

一、Agent技術概述 在人工智能領域,Agent(智能體)是指能夠感知環境、自主決策并執行動作以實現特定目標的智能系統。隨著大語言模型(LLM)的快速發展,基于LLM的Agent系統已成為當前AI研究的熱點方向,為復雜任務解決提供了全新范式。 Agent的核心特征 自主性(Autonomy): 能夠…