視頻、音頻錄制

1,項目介紹。

實現全屏錄屏選擇區域錄屏攝像頭錄像麥克風錄音主板音頻錄音截屏畫板的自由組合。并通過FFmpeg完成音頻與視頻的合并。

功能界面
在這里插入圖片描述
畫板畫筆

在這里插入圖片描述

參考的項目

https://github.com/yangjinming1062/RecordWin

本項目是在此項目的基礎上修復了部分bug,并增加了屏幕區域錄屏,與主板音頻錄音功能。

2,知識點總結

2.1,熱鍵注冊。

WPF中進行熱鍵注冊需要添加鉤子,用以監視熱鍵輸入。

public IntPtr winHandle;
private HwndSource hWndSource;
private void Window_Loaded(object sender, RoutedEventArgs e)
{//獲取窗口句柄winHandle = new WindowInteropHelper(this).Handle;//在Win32窗口呈現wpf內容hWndSource = HwndSource.FromHwnd(winHandle);GoToScreenTopMiddle();SetHotKey(true);}private void SetHotKey(bool Add){if (Add){hWndSource.AddHook(MainWindowProc);HotKeyBF = HotKey.GlobalAddAtom($"{SettingHelp.Settings.播放暫停.Item1}-{Enum.GetName(typeof(System.Windows.Forms.Keys), SettingHelp.Settings.播放暫停.Item2)}");HotKeyTZ = HotKey.GlobalAddAtom($"{SettingHelp.Settings.停止關閉.Item1}-{Enum.GetName(typeof(System.Windows.Forms.Keys), SettingHelp.Settings.停止關閉.Item2)}");HotKeyHB = HotKey.GlobalAddAtom($"{SettingHelp.Settings.開關畫筆.Item1}-{Enum.GetName(typeof(System.Windows.Forms.Keys), SettingHelp.Settings.開關畫筆.Item2)}");HotKey.RegisterHotKey(winHandle, HotKeyBF, SettingHelp.Settings.播放暫停.Item1, SettingHelp.Settings.播放暫停.Item2);HotKey.RegisterHotKey(winHandle, HotKeyTZ, SettingHelp.Settings.停止關閉.Item1, SettingHelp.Settings.停止關閉.Item2);HotKey.RegisterHotKey(winHandle, HotKeyHB, SettingHelp.Settings.開關畫筆.Item1, SettingHelp.Settings.開關畫筆.Item2);}else//暫時沒起作用,todo{hWndSource.RemoveHook(MainWindowProc);HotKey.GlobalDeleteAtom((short)HotKeyBF);HotKey.GlobalDeleteAtom((short)HotKeyTZ);HotKey.GlobalDeleteAtom((short)HotKeyHB);HotKey.UnregisterHotKey(winHandle, HotKeyBF);HotKey.UnregisterHotKey(winHandle, HotKeyTZ);HotKey.UnregisterHotKey(winHandle, HotKeyHB);}}private IntPtr MainWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled){switch (msg){case HotKey.WM_HOTKEY:{int sid = wParam.ToInt32();if (Visibility == Visibility.Visible){if (!SettingPop.IsOpen){if (sid == HotKeyBF){if (btBegin.Visibility == Visibility.Visible)btBegin_Click(null, null);elsebtParse_Click(null, null);}else if (sid == HotKeyTZ){if (btStop.Visibility == Visibility.Visible)btStop_Click(null, null);elseBtClose_Click(null, null);}}if (sid == HotKeyHB){btPen.IsChecked = !btPen.IsChecked;OpenDraweWin();}}handled = true;break;}}return IntPtr.Zero;}

外部函數

 public class HotKey{/// <summary> /// 如果函數執行成功,返回值不為0。 /// 如果函數執行失敗,返回值為0。要得到擴展錯誤信息,調用GetLastError。.NET方法:Marshal.GetLastWin32Error() /// </summary> /// <param name="hWnd">要定義熱鍵的窗口的句柄</param> /// <param name="id">定義熱鍵ID(不能與其它ID重復) </param> /// <param name="fsModifiers">標識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時才會生效</param> /// <param name="vk">定義熱鍵的內容,WinForm中可以使用Keys枚舉轉換, /// WPF中Key枚舉是不正確的,應該使用System.Windows.Forms.Keys枚舉,或者自定義正確的枚舉或int常量</param> [DllImport("user32.dll", SetLastError = true)]public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, int vk);/// <summary> /// 取消注冊熱鍵 /// </summary> /// <param name="hWnd">要取消熱鍵的窗口的句柄</param> /// <param name="id">要取消熱鍵的ID</param> [DllImport("user32.dll", SetLastError = true)]public static extern bool UnregisterHotKey(IntPtr hWnd, int id);/// <summary> /// 向全局原子表添加一個字符串,并返回這個字符串的唯一標識符,成功則返回值為新創建的原子ID,失敗返回0 /// </summary> [DllImport("kernel32", SetLastError = true)]public static extern short GlobalAddAtom(string lpString);[DllImport("kernel32", SetLastError = true)]public static extern short GlobalDeleteAtom(short nAtom);/// <summary> /// 定義了輔助鍵的名稱(將數字轉變為字符以便于記憶,也可去除此枚舉而直接使用數值) /// </summary> [Flags()]public enum KeyModifiers{None = 0,Alt = 1,Ctrl = 2,Shift = 4,WindowsKey = 8}/// <summary> /// 熱鍵的對應的消息ID /// </summary> public const int WM_HOTKEY = 0x312;}
2. 2,兩種透明。

根據實際需要可以定義兩種透明,一種是真透明Transparent,一種是假透明#01000000

 <Color x:Key="FakeTransparentColor" >#01000000</Color><Color x:Key="TrueTransparentColor" >Transparent</Color>
 Background = Application.Current.Resources[enable ? "FakeTransparent" : "TrueTransparent"] as Brush;

在窗口定義為接受透明時:AllowsTransparency="True",采用真透明背景的窗體A,覆蓋在應用B上時,應用B的控件可透過窗體A被操作。采用假透明背景的窗體A,覆蓋在應用B上時,應用B的控件不能透過窗體A被操作。

2. 3,音視頻合并。

音視頻的合并一般以命令的形式調用軟件FFmpeg完成。

下載FFmpeg軟件

常用語法:

  1. ?直接合并(視頻流復制+音頻轉碼)

    若需保持視頻無損且兼容MP4容器,建議將WAV轉碼為AAC:

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

? 參數說明:

  • -c:v copy:復制視頻流不重新編碼

  • -c:a aac:將WAV音頻轉碼為MP4支持的AAC格式

  • -strict experimental:早期版本需此參數支持AAC?

  1. ?強制替換原視頻音頻軌道?

若原視頻已含音頻需替換,可指定映射關系:

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4

參數說明

  • -map 0:v:0:選擇第一個輸入文件(video.mp4)的視頻流
  • -map 1:a:0:選擇第二個輸入文件(audio.wav)的音頻流?
  1. ?無損合并(需視頻無音頻)

若視頻本身無音頻軌道,可直接復制流:

ffmpeg -i video.mp4 -i audio.wav -c copy output.mkv

注意:需改用MKV容器以支持PCM音頻流?。

  1. 示例:

    將視頻1.mp4與音頻1.wav合并為output.mkv
    在這里插入圖片描述

2. 4,自定義動畫。
public class CornerRadiusAnimation : AnimationTimeline{static CornerRadiusAnimation(){FromProperty = DependencyProperty.Register("From", typeof(CornerRadius), typeof(CornerRadius));ToProperty = DependencyProperty.Register("To", typeof(CornerRadius), typeof(CornerRadius));}private bool _fromSetted;private bool _toSetted;public static readonly DependencyProperty FromProperty;public CornerRadius From{get => (CornerRadius)GetValue(FromProperty);set{SetValue(FromProperty, value);_fromSetted = true;}}public static readonly DependencyProperty ToProperty;public CornerRadius To{get => (CornerRadius)GetValue(ToProperty);set{SetValue(ToProperty, value);_toSetted = true;}}public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock){var fromVal = _fromSetted ? (CornerRadius)GetValue(FromProperty) : (CornerRadius)defaultOriginValue;var toVal = _toSetted ? (CornerRadius)GetValue(ToProperty) : (CornerRadius)defaultDestinationValue;if (animationClock.CurrentProgress != null)return new CornerRadius(animationClock.CurrentProgress.Value * (toVal.TopLeft - fromVal.TopLeft) + fromVal.TopLeft,animationClock.CurrentProgress.Value * (toVal.TopRight - fromVal.TopRight) + fromVal.TopRight,animationClock.CurrentProgress.Value * (toVal.BottomRight - fromVal.BottomRight) + fromVal.BottomRight,animationClock.CurrentProgress.Value * (toVal.BottomLeft - fromVal.BottomLeft) + fromVal.BottomLeft);return new CornerRadius();}protected override Freezable CreateInstanceCore() => new CornerRadiusAnimation();public override Type TargetPropertyType => typeof(CornerRadius);}
2.5,注意事項

不同目標框架的.NetFramework,編譯后的.dll不一定相同,例如使用.NetFramerwork4.6.1將生成大量系統自帶的.dll

如下:面對同一個解決方案

.NetFramerwork4.7編譯清單。
在這里插入圖片描述

.NetFramerwork4.6.1編譯清單

在這里插入圖片描述

3,項目鏈接

https://download.csdn.net/download/lingxiao16888/91461603

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

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

相關文章

Linux文件系統理解1

目錄一、初步理解系統層面的文件1. 文件操作的本質2. 進程管理文件核心思想二、系統調用層1. 打開關閉文件函數2. 讀寫文件函數三、操作系統文件管理1. 文件管理機制2. 硬件管理機制四、理解重定向1. 文件描述符分配規則2. 重定向系統調用3. 重定向命令行調用五、理解緩沖區1. …

科技向善,銀發向暖:智慧養老與經濟共筑適老未來

人口老齡化是當今中國社會面臨的重大課題&#xff0c;也是推動社會變革與經濟轉型的重要引擎。隨著數字技術的飛速發展&#xff0c;“智慧養老”正以科技向善的溫度&#xff0c;為老年群體構建更舒適、更安全、更有尊嚴的晚年生活&#xff0c;同時為銀發經濟注入蓬勃活力&#…

numpy庫 降維,矩陣創建與元素的選取,修改

目錄 1.降維函數ravel()和flatten ravel(): flatten(): 2.矩陣存儲與內存結構 3.修改矩陣形狀的方法 4.特殊矩陣創建 全零矩陣: 如np.zeros(5) 創建含5個零的一維數組&#xff0c;輸出中零后的點&#xff08;如 0.&#xff09;表示浮點數類型。 全一矩陣&#xff1a;如n…

SpringCloud seata全局事務

項目https://github.com/apache/incubator-seata docker拉取啟動server $ docker run --name seata-server -p 8091:8091 apache/seata-server:2.1.0 seata注冊到nacos <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-…

OpenLayers 快速入門(八)事件系統

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

【Linux | 網絡】應用層(HTTPS)

目錄一、HTTPS的概念二、準備概念2.1 什么是加密和解密2.2 為什么要加密2.3 常見的加密方式2.3.1 對稱加密2.3.1 非對稱加密2.4 數據摘要&&數據指紋三、HTTPS理解過程3.1 只使用對稱加密3.2 只使用非對稱加密3.3 雙方都使用非對稱加密3.4 對稱加密 非對稱加密3.5 中間…

GRE協議

一、實驗拓撲二、實驗配置1、靜態路由實現GRERT1配置&#xff1a;RT1(config)# int fa1/0RT1(config-if)# ip add 192.168.20.1 255.255.255.0RT1(config-if)# no shutdownRT1(config)# int fa0/0RT1(config-if)# ip add 172.1.1.2 255.255.255.0RT1(config-if)# no shutdownRT…

JDialong彈窗

public class DialogDemo extends JFrame {public DialogDemo(){this.setVisible(true);this.setSize(700,500);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//JFrame 放東西&#xff0c;容器Container contentPane this.getContentPane();//絕對布局conte…

tlias智能學習輔助系統--違紀處理(實戰)

目錄 1.StudentController.java 2.interface StudentService 3.StudentServiceImpl.java 4.interface StudentMapper 1.StudentController.java // 違紀處理PutMapping("/violation/{id}/{score}")Operation(summary "違紀處理")public Result violat…

傳統RNN模型筆記:輸入數據長度變化的結構解析

一、案例背景 本案例通過PyTorch的nn.RNN構建單隱藏層RNN模型&#xff0c;重點展示RNN對變長序列數據的處理能力&#xff08;序列長度從1變為20&#xff09;&#xff0c;幫助理解RNN的輸入輸出邏輯。 二、核心代碼與結構拆解 def dm_rnn_for_sequencelen():# 1. 定義RNN模型rnn…

OpenLayers 快速入門(四)View 對象

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

測試左移方法論

測試左移&#xff08;Shift-Left Testing&#xff09;?是一種軟件測試方法論&#xff0c;核心思想是將測試活動從傳統的開發后期&#xff08;如系統測試、驗收測試階段&#xff09;提前到軟件生命周期的更早期階段&#xff08;如需求分析、設計、編碼階段&#xff09;&#xf…

OpenCV(01)基本圖像操作、繪制,讀取視頻

圖像基礎 import cv2 as cv#讀取圖像 cv.imread(path,讀取方式)默認讀為彩色圖像 #cv.imread(path) cat cv.imread(E:\hqyj\code\opencv\images\\face.png)#顯示圖像 cv.imshow(window,img) cv.imshow(myimg,cat)print(cat) print(cat.shape) #(h,w,c) 元組(1,1) print(cat…

biji 1

1.應用層&#xff1a;為應用程序提供網絡服務。2.表示層&#xff1a;定義數據的格式&#xff0c;對數據進行壓縮、解壓縮、加密、解密、編碼、解碼。3.會話層&#xff1a;對通信雙方間的會話進行建立、維護、拆除-----session id---區分同一應用程序的不同進程4.傳輸層&#x…

mongodb的備份和還原(精簡)

1 官網下載對應版本msi2 運行msi mongodb-database-tools-windows-x86_64-100.12.2.msi3 將安裝地址加到環境變量 C:\Program Files\MongoDB\Tools\100\bin4 查看version mongodump --version mongorestore --version5 運行 備份命令 mongodump --host 127.0.0.1 --db dbname--…

Mac安裝Typescript報錯

目錄 Mac上安裝Typescript報錯: 原因分析 1. 默認 npm 全局安裝目錄的權限問題 2. Node.js 的安裝方式 如何解決?(無需每次用 `sudo`) 方法 1:修改 npm 全局目錄的權限(推薦) 方法 2:配置 npm 使用用戶級目錄 方法 3:使用 `nvm` 管理 Node.js(最推薦) 為什么建議避免…

spring-cloud概述

單體架構 把業務的所有功能實現都打包在一個war包或者jar包&#xff0c;這種方式就成為單體架構。 比如Spring課程中的博客系統,前端后端數據庫實現&#xff0c;都在一個項目中&#xff0c;這種架構就稱為單體架構. 舉個例子&#xff1a; 比如在電商系統中&#xff0c;我們…

android ROOM kotlin官方文檔完全學習

android ROOM kotlin官方文檔完全學習2.6 使用 Room 將數據保存到本地數據庫 | Android Developers (google.cn) 一、簡介 1.1 引入 dependencies {def room_version "2.6.1"implementation "androidx.room:room-runtime:$room_version"//如下三選一a…

DOM編程全解析:操作、事件與存儲實戰指南

引言&#xff1a;DOM——JavaScript與網頁交互的橋梁 DOM&#xff08;文檔對象模型&#xff09; 是JavaScript操作HTML/XML文檔的接口&#xff0c;它將網頁文檔抽象為一個樹形結構&#xff0c;允許開發者通過API動態修改文檔的內容、結構和樣式。無論是實現動態交互&#xff0…

Ansible命令

Ansible命令 ansible 常用命令 /usr/bin/ansible   #Ansibe AD-Hoc 臨時命令執行工具&#xff0c;常用于臨時命令的執行 /usr/bin/ansible-doc    #Ansible 模塊功能查看工具 /usr/bin/ansible-galaxy   #下載/上傳優秀代碼或Roles模塊 的官網平臺&#xff0c;基于網…