<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一章我們實現了截圖介面與功能,接下來可以在此基礎上實現錄屏功能,錄屏採用ffmpeg命令列實現會方便一些,效果也是不錯的,當然前提是要對Windows子程序的控制比較熟悉,做出來之後完全可以滿足專案使用。
錄屏需要使用AllowsTransparency來實現透明背景,因為錄屏時框選區域需要能夠點選穿透到桌面,使用WindowChome則不行。
因為不依賴第三方工具(比如:screen capture recorder),只要我們能夠獲取音訊裝置名稱就可以使用ffmpeg的dshow錄製聲音。我們通過呼叫Com的方式就可以獲取到裝置名稱,在《C# 使用com獲取Windows攝像頭列表》的基礎上新增一個屬性獲取音訊裝置列表:
static readonly Guid AudioInputDevice = new Guid(0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86); /// <summary> /// 列舉錄音裝置 /// </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); } }
獲取音訊裝置名稱
string audio = null; //獲取音訊採集裝置名稱 foreach (var i in EnumDevices.AudioInputDevices) { audio = i; break; }
得到了音訊裝置名稱之後,我們就可以使用下面的命令列是實現錄屏了。
錄屏命令列,-i audio=上一步獲取的音訊裝置名稱。
ffmpeg -y -f dshow -sample_rate 44100 -sample_size 16 -channels 2 -i audio="麥克風 (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
啟動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="麥克風 (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()
啟動ffmpeg作為子程序,需要對其進行一定的管理,要保證主程序任何情況的退出子程序跟隨退出,我們可以使用Windows的JobObject實現這一功能。C#需要使用dllimport包裝Job Object的WinApi。
下面是部分範例程式碼:建立了作業物件,並設定為物件銷燬後,加入的程序全部退出。
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()));
實現了錄屏功能,包括畫面和聲音的錄製,只依賴ffmpeg.exe。
之後上傳
以上就是今天要講的內容了,因為使用了命令列所以錄屏邏輯不用自己實現,但是要控制ffmpeg子程序還是有不少細節需要處理的,比如程序自動退出、資訊反饋、停止錄屏、異常提示等。另外一方面在介面上也有需要處理的東西,比如可控的點選穿透、控制視窗置頂等等。總的來說,實現這一一個功能模組還是需要一定的時間和精力,以及一些相關的知識。
到此這篇關於C# wpf使用ffmpeg命令列實現錄屏的範例程式碼的文章就介紹到這了,更多相關C# wpf ffmpeg命令列錄屏內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45