C# wpf使用ffmpeg命令行實(shí)現(xiàn)錄屏的示例代碼
前言
上一章我們實(shí)現(xiàn)了截屏界面與功能,接下來可以在此基礎(chǔ)上實(shí)現(xiàn)錄屏功能,錄屏采用ffmpeg命令行實(shí)現(xiàn)會(huì)方便一些,效果也是不錯(cuò)的,當(dāng)然前提是要對(duì)Windows子進(jìn)程的控制比較熟悉,做出來之后完全可以滿足項(xiàng)目使用。
一、主要步驟
1、使用 AllowsTransparency實(shí)現(xiàn)穿透框
錄屏需要使用AllowsTransparency來實(shí)現(xiàn)透明背景,因?yàn)殇浧習(xí)r框選區(qū)域需要能夠點(diǎn)擊穿透到桌面,使用WindowChome則不行。

2、獲取音頻設(shè)備名稱
因?yàn)椴灰蕾嚨谌焦ぞ撸ū热纾簊creen capture recorder),只要我們能夠獲取音頻設(shè)備名稱就可以使用ffmpeg的dshow錄制聲音。我們通過調(diào)用Com的方式就可以獲取到設(shè)備名稱,在《C# 使用com獲取Windows攝像頭列表》的基礎(chǔ)上添加一個(gè)屬性獲取音頻設(shè)備列表:
static readonly Guid AudioInputDevice = new Guid(0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86);
/// <summary>
/// 枚舉錄音設(shè)備
/// </summary>
public static IEnumerable<string> AudioInputDevices
{
get
{
IMoniker[] monikers = new IMoniker[5];
var devEnum = Activator.CreateInstance(Type.GetTypeFromCLSID(SystemDeviceEnum)) as ICreateDevEnum;
IEnumMoniker moniker;
if (devEnum.CreateClassEnumerator(AudioInputDevice, out moniker, 0) == 0)
{
while (true)
{
int hr = moniker.Next(1, monikers, IntPtr.Zero);
if (hr != 0 || monikers[0] == null)
break;
yield return GetName(monikers[0]);
foreach (var i in monikers)
{
if (i != null)
Marshal.ReleaseComObject(i);
}
}
Marshal.ReleaseComObject(moniker);
}
Marshal.ReleaseComObject(devEnum);
}
}
獲取音頻設(shè)備名稱
string audio = null;
//獲取音頻采集設(shè)備名稱
foreach (var i in EnumDevices.AudioInputDevices)
{
audio = i;
break;
}
3、命令行啟動(dòng)ffmpeg
得到了音頻設(shè)備名稱之后,我們就可以使用下面的命令行是實(shí)現(xiàn)錄屏了。
錄屏命令行,-i audio=上一步獲取的音頻設(shè)備名稱。
ffmpeg -y -f dshow -sample_rate 44100 -sample_size 16 -channels 2 -i audio="麥克風(fēng) (Realtek High Definition Audio)" -f gdigrab -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop -preset:v ultrafast -tune:v zerolatency -r 30 screen.mp4
啟動(dòng)ffmpeg(示例)
var process = new Process(); process.StartInfo.FileName = "ffmpeg"; process.StartInfo.Arguments ="-y -f dshow -sample_rate 44100 -sample_size 16 -channels 2 -i audio=\"麥克風(fēng) (Realtek High Definition Audio)\" -f gdigrab -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop -preset:v ultrafast -tune:v zerolatency -r 30 screen.mp4 " process.Start()
4、使用JobObject管理子進(jìn)程
啟動(dòng)ffmpeg作為子進(jìn)程,需要對(duì)其進(jìn)行一定的管理,要保證主進(jìn)程任何情況的退出子進(jìn)程跟隨退出,我們可以使用Windows的JobObject實(shí)現(xiàn)這一功能。C#需要使用dllimport包裝Job Object的WinApi。
下面是部分示例代碼:創(chuàng)建了作業(yè)對(duì)象,并設(shè)置為對(duì)象銷毀后,加入的進(jìn)程全部退出。
handle = CreateJobObject(IntPtr.Zero, null);
var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION
{
LimitFlags = 0x2000
};
var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
BasicLimitInformation = info
};
int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
二、完整代碼
實(shí)現(xiàn)了錄屏功能,包括畫面和聲音的錄制,只依賴ffmpeg.exe。
之后上傳
三、效果預(yù)覽
1、錄制中

2、錄制動(dòng)態(tài)流程

總結(jié)
以上就是今天要講的內(nèi)容了,因?yàn)槭褂昧嗣钚兴凿浧吝壿嫴挥米约簩?shí)現(xiàn),但是要控制ffmpeg子進(jìn)程還是有不少細(xì)節(jié)需要處理的,比如進(jìn)程自動(dòng)退出、信息反饋、停止錄屏、異常提示等。另外一方面在界面上也有需要處理的東西,比如可控的點(diǎn)擊穿透、控制窗口置頂?shù)鹊?。總的來說,實(shí)現(xiàn)這一一個(gè)功能模塊還是需要一定的時(shí)間和精力,以及一些相關(guān)的知識(shí)。
到此這篇關(guān)于C# wpf使用ffmpeg命令行實(shí)現(xiàn)錄屏的示例代碼的文章就介紹到這了,更多相關(guān)C# wpf ffmpeg命令行錄屏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
比Math類庫abs()方法性能更高的取絕對(duì)值方法介紹
這篇文章主要給大家介紹了一種比Math類庫abs()方法性能更高的取絕對(duì)值方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
C#將Word轉(zhuǎn)換成PDF方法匯總(基于Office和WPS)
這篇文章主要匯總了C#將Word轉(zhuǎn)換成PDF方法,基于Office和WPS的兩種解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Unity游戲開發(fā)之射擊小游戲的實(shí)現(xiàn)
本篇文章為大家?guī)硪粋€(gè)橫版2D射擊小游戲,游戲制作超級(jí)簡單,玩法一學(xué)就會(huì)。文中的示例代碼講解詳細(xì),快跟隨小編一起動(dòng)手試一試2022-03-03
C#實(shí)現(xiàn)將漢字轉(zhuǎn)化為2位大寫的16進(jìn)制Unicode的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將漢字轉(zhuǎn)化為2位大寫的16進(jìn)制Unicode的方法,分析了轉(zhuǎn)換的技巧并以實(shí)例形式給出了具體的轉(zhuǎn)換方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12
C#(WinForm) ComboBox和ListBox添加項(xiàng)及設(shè)置默認(rèn)選擇項(xiàng)
這篇文章主要介紹了C#(WinForm) ComboBox和ListBox添加項(xiàng)及設(shè)置默認(rèn)選擇項(xiàng)的的相關(guān)資料,需要的朋友可以參考下2014-07-07
C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換
這篇文章介紹了C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

