FFmpegInterop 庫在 Windows 10 應用中的編譯使用

来源:http://www.cnblogs.com/validvoid/archive/2016/03/17/build-and-use-ffmpeginterop-win10.html
-Advertisement-
Play Games

FFmpegInterop 是微軟推出的封裝 FFmpeg 的一個開源庫,旨在方便在 Windows 10、Windows 8.1 以及 Windows Phone 8.1 應用中使用 FFmpeg 進行媒體內容播放。FFmpegInterop 實現了一個 MediaStreamSource 以便通


FFmpegInterop 簡介

FFmpegInterop 是微軟推出的封裝 FFmpeg 的一個開源庫,旨在方便在 Windows 10、Windows 8.1 以及 Windows Phone 8.1 應用中使用 FFmpeg 進行媒體內容播放。FFmpegInterop 實現了一個 MediaStreamSource 以便通過 FFmpeg 對媒體內容進行解碼後輸送到 Windows 多媒體管線進行播放。

FFmpegInterop 項目托管於 Github,項目地址:FFmpegInterop 。


原文地址:http://validvoid.net/build-and-use-ffmpeginterop-win10/


 

編譯步驟

FFmpegInterop 是對 FFmpeg 的封裝,依賴 FFmpeg 庫本身。要使用 FFmpegInterop 需要首先手動編譯 FFmpeg 和 FFmpegInterop 庫。

獲取文件到本地

使用 git 命令或任意 git 工具將 FFmpegInterop 項目文件 clone 到本地:

git clone --recursive git://github.com/microsoft/FFmpegInterop.git

獲取最新的 FFmpeg 代碼:

 git clone git://github.com/microsoft/FFmpegInterop.git
 cd FFmpegInterop
 git clone git://source.ffmpeg.org/ffmpeg.git

FFmpegInterop 的 github 倉庫 中鏈接的是 commit 620197d 的 FFmpeg 代碼。不同版本的 FFmpeg 編譯後實際表現可能有所不同。

進行以上操作後,你的本地目錄結構應該同以下結構相同:

FFmpegInterop\
├ ffmpeg\ - FFmpeg 庫代碼目錄
├ FFmpegInterop\ - FFmpegInterop WinRT 組件代碼目錄
├ Samples\ - 使用 C++, C# 以及 JavaScript 分別實現的例子
├ Tests\ - FFmpegInterop 的單元測試
├ BuildFFmpeg.bat - 用於編譯 FFmpeg 庫的批處理文件
├ FFmpegConfig.sh - FFmpeg 配置腳本
├ FFmpegWin8.1.sln - 用於 Windows 8.1 Windows Phone 8.1 開發的 Visual Studio 2013 解決方案
├ FFmpegWin10.sln - 用於 Windows 10 開發的 Visual Studio 2015 解決方案
├ LICENSE
└ README.md

編譯 FFmpeg

編譯 FFmpegInterop 之前,我們首先需要編譯 FFmpeg 本體。編譯 FFmpeg 需要先準備特定的編譯環境。

Visual Studio

對於 Windows 8.1,要求使用 Visual Studio 2013 Update 3 RTM 或更新的版本。 對於 Windows 10,要求使用 Visual Studio 2015。

安裝配置 MSYS2

MSYS2 是一個用於 Windows 平臺的 GNU 編譯環境套件。要編譯 FFmpeg,必須安裝使用 MSYS2。

MSYS2 下載地址:http://msys2.github.io/

下載頁面提供了 x86 和 x64 兩種架構對應的版本,選擇當前電腦對應版本下載即可。下載啟動安裝程式後選擇一個安裝路徑,註意儘量選擇類似 C:\msys32 這樣由字母數字構成的簡單短路徑,路徑中不能包含中文、特殊字元、空格等。安裝完成後立即運行 MSYS2。

啟動 MSYS2 後,需要更新 MSYS2 提供的 GNU 環境,在 MSYS2 的終端中輸入命令 update-core 進行更新。更新完畢後,關閉 MSYS2 再通過開始菜單重啟 MSYS2。重啟後,再輸入 pacman -Su 同步 MSYS2 環境的包資料庫。

有關 MSYS2 安裝使用的更多內容,可參閱 MSYS2 Wiki

安裝配置 YASM

YASM 一個完全重寫 NASM 編譯器的彙編語言編譯器,也是編譯 FFmpeg 的必要工具之一。有關 YASM 的更多信息,可以訪問其官網 yasm.tortall.net

YASM 下載地址:http://yasm.tortall.net/Download.html

截至目前 YASM 的最新版本為 2014 年 8 月 10 日發佈的 1.3.0 版。註意 YASM 在其下載頁面上列舉了多個不同的版本可供下載:

  • Source .tar.gz (源代碼)
  • Win32 VS2010 .zip (用於 VS2010+ 和 32 位 Windows)
  • Win64 VS2010 .zip (用於 VS2010+ 和 64 位 Windows)
  • Win32 .exe (32 位 Windows 通用)
  • Win64 .exe (64 位 Windows 通用)
  • CygWin32 .exe (用於 CygWin)
  • DOS .exe (用於純 DOS 或 DJGPP)

註意我們需要的是上述列表中加粗的兩個通用版本。根據自己使用計算器的架構選擇對應的通用版本下載即可。下載後,將下載回來的 yasm-1.3.0-win64.exe 改名為 yaml.exe,並放置於 MSYS2 安裝目錄中。例如,MSYS2 安裝在 C:\msys64,則將 yaml.exe 放置到c:\msys64\usr\bin\ 中。

安裝配置 gas-preprocessor

gas-preprocessor 是用於編譯 FFmpeg 的 perl 預處理腳本。

gas-preprocessor 下載地址:https://github.com/FFmpeg/gas-preprocessor

下載 gas-preprocessor.pl 文件後放置於 MSYS2 安裝目錄中。例如,MSYS2 安裝在 C:\msys64,則將 gas-preprocessor.pl 放置到 c:\msys64\usr\bin\ 中。

驗證 FFmpeg 編譯環境

進行以上步驟之後,編譯 FFmpeg 的環境已經基本準備就緒。我們還需要對環境進行一下驗證,以保證環境確實準備完畢能夠順利進行編譯。

通過開始菜單找到 Visual Studio 2013 或 Visual Studio 2015 菜單組,在其中找到 VS2015 x86 ARM Cross Tools Command Prompt 啟動。註意,菜單組中可能存在多個名稱類似的命令行快捷方式,需要選擇 x86 ARM Cross Tools。 啟動 VS2015 x86 ARM Cross Tools Command Prompt 後,在命令行中定位到 MSYS2 的安裝目錄,啟動 MSYS2:C:\msys64\msys2_shell.bat。(這樣通過 VS 提供的命令行啟動 MSYS2 的目的在於讓 MSYS2 能夠檢測到部分由 VS 提供的編譯工具。)

在啟動的 MSYS2 終端中分別運行一下命令觀察各便於工具組件是否被正確找到:

$ which cl
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/cl

$ which link
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/link

$ which armasm
/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/x86_ARM/armasm

$ which yasm
/usr/bin/yasm

$ which cpp
/usr/bin/cpp

$ which gas-preprocessor.pl
/usr/bin/gas-preprocessor.pl

如果所有組件均在指定位置被找到,則表示 FFmpeg 編譯環境已經準備就緒,可以進入下一步驟編譯 FFmpeg。如果沒有通過 VS 提供的 x86 ARM Cross Tools 命令行啟動 MSYS2,則 cl, link, armasam 這幾個組件有可能定位不到。也可以選擇將 c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_ARM 這個目錄加入系統的環境變數。

編譯 FFmpeg

在 FFmpegInterop 中,微軟已經提供了方便的編譯批處理用於自動編譯 FFmpeg,如果你想手動編譯 FFmpeg,可以參閱 Compile and Use FFmpeg Libraries for Windows Runtime

FFmpegInterop 項目中提供了一個名為 BuildFFmpeg.bat 的批處理文件,藉助該批處理,可以輕鬆進行 FFmpeg 的編譯工作。BuildFFmpeg.bat 接受兩個可選參數,第一個參數表明目標平臺,第二個參數表明目標架構,例如:

BuildFFmpeg.bat win10                     - 為 Windows 10 的 ARM, x64 和 x86 編譯  
BuildFFmpeg.bat phone8.1 ARM              - 為 Windows Phone 8.1 的 ARM 編譯  
BuildFFmpeg.bat win8.1 x86 x64            - 為 Windows 8.1 的 x86 和 x64 編譯  
BuildFFmpeg.bat phone8.1 win10 ARM        - 為 Windows 10 和 Windows Phone 8.1 的 ARM 編譯  
BuildFFmpeg.bat win8.1 phone8.1 win10     - 為 所有平臺所有架構編譯  

編譯時間較長,編譯完成後批處理會自動退出。編譯後的輸出的文件位於項目的 ffmpeg/Build/目標平臺/架構 目錄內。

編譯 FFmpegInterop

打開 Win 8.1 或 Win 10 對應的 項目解決方案文件。可見到 FFmpegInterop 解決方案整體的結構:

Solution "FFmpegWin10"  
├ FFmpegInterop (Universal Windows, C++)
├ MediaPlayerCPP (Universal Windows, C++)
├ MediaPlayerCS (Universal Windows, C#)
├ MediaPlayerJS (Universal Windows, Javascript)
└ UnitTest

而解決方案的文件目錄結構為

FFmpegInterop-master  
├ FFmpegWin10.sln/ FFmpegWin8.1.sln (Visual Studio Solution)
├ BuildFFmpeg.bat (Build script)
├ FFmpegConfig.sh (Build script)
├ FFmpegInterop (Project folder of FFmpegInterop)
└ Samples (Project folder of sample players)
  ├ SamplesWin10
  └ SamplesWin8.1

需要註意的是,在項目中使用 FFmpegInterop 時需要按照 FFmpegInterop 的文件目錄結構對項目文件進行安放。如果沒有直接使用 FFmpegInterop 提供的項目文件,記得配置 interop 項目對 FFmpeg 的引用:

 

另外 FFmpeg 編譯後是區分 x86, x64, ARM 三種不同目標架構的,不同架構輸出的目錄並不相同,例如面向 ARM 平臺的 Windows 10 版本的 FFmpeg 編譯輸出的文件位於 FFmpegInterop-master\ffmpeg\Build\Windows10\ARM 目錄中。在 C# 版的播放器示例項目中,FFmpeg 的幾個 .dll 文件是以鏈接的方式直接從 FFmpeg 的 build 目錄引入項目的,這樣在應用打包時,會將對應架構的 FFmpeg 庫文件自動封入應用包中。

FFmpegInterop 提供的 MediaPlayerCS 項目已經做好了相關配置,如果需要在自己的項目中使用如上文所述的鏈接方式為項目添加 FFmpeg 庫文件,需要手動配置項目文件:

C# 項目

使用文本編輯器(推薦 Sublime Text/Atom,不要使用記事本)或以 Visual Studio 文本模式(只打開文件不打開整個項目)打開項目的 .csproj 文件,找到 <ItemGroup></ItemGroup> 節點,在其中添加以下內容:

<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avcodec-56.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avdevice-56.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avfilter-5.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avformat-56.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avutil-54.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\swresample-1.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\swscale-3.dll" />  

<ItemGroup> 節點代表項目包含的文件組,<Content> 代表項目中的“內容”類型文件。$(SolutionDir) 和 $(PlatformTarget) 均為 Visual Studio 所用生成器可以識別的巨集,$(SolutionDir) 代表解決方案目錄;$(PlatformTarget) 代表目標平臺。採用以上配置,C# 項目即可引入對應平臺的 FFmpeg 庫文件了。項目配置文件全文可參考MediaPlayerCS.csproj 。

Javascript 項目

Javascript 項目與 C# 項目類似,使用文本編輯器(推薦 Sublime Text/Atom,不要使用記事本)或以 Visual Studio 文本模式(只打開文件不打開整個項目)打開項目的 .jsproj 文件,找到 <ItemGroup></ItemGroup> 節點,在其中 <AppxManifest></AppxManifest>節點之後添加以下內容:

<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avcodec-56.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avdevice-56.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avfilter-5.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avformat-56.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avutil-54.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\swresample-1.dll" />  
<Content Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\swscale-3.dll" />  

項目配置文件全文可參考 MediaPlayerJS.jsproj 。

C++ 項目

C++ 項目與 C# 和 Javascript 項目稍有不同,使用文本編輯器(推薦 Sublime Text/Atom,不要使用記事本)或以 Visual Studio 文本模式(只打開文件不打開整個項目)打開項目的 .vcxproj 文件,找到 <ItemGroup></ItemGroup> 節點,在其中 <AppxManifest></AppxManifest> 節點之後添加以下內容:

<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avcodec-56.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  
<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avdevice-56.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  
<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avfilter-5.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  
<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avformat-56.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  
<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\avutil-54.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  
<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\swresample-1.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  
<None Include="$(SolutionDir)ffmpeg\Build\Windows10\$(PlatformTarget)\bin\swscale-3.dll">  
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</DeploymentContent>
  <DeploymentContent Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</DeploymentContent>
</None>  

完整的 C++ 項目配置文件可以參考 MediaPlayerCPP.vcxproj 。

可以看到 FFmpeg 的幾個 .dll 文件名中都有數字,例如 avformat-56.dll,不同版本的 FFmpeg 編譯出來的文件名中這個版本號數字是不一樣的,如果手動獲取了不同版本的 FFmpeg 代碼進行編譯,註意在項目中添加 FFmpeg 的 .dll 時正確填寫文件名。

如果在之前獲取代碼文件到本地的步驟中,你獲取了最新版本的 FFmpeg 代碼,則需要對 FFmpegInterop 項目進行一些改動才能夠順利編譯。

在最新版本的 FFmpeg 代碼中,FFmpegInterop 在 FFmpegReader.cpp 中調用的 av_free_packet 已被棄用,FFmpeg 在 commit ce70f28a1732c74a9cd7fec2d56178750bd6e457 中已經使用 av_packet_unref 替換了 av_free_packet,因此我們需要在 FFmpegReader.cpp 中改為使用 av_packet_unref。相關討論可參見 Build error: avfreepacket deprecated 。

使用 FFmpegInterop

FFmpegInterop 的工作流程是:

  1. 讀取媒體文件流。
  2. 通過 FFmpegInteropMSS.CreateFFmpegInteropMSSFromStream() 方法創建一個 FFmpegInteropObject,併為其傳遞媒體文件流和強制軟解設置。
  3. 調用 FFmpegInteropObject 互操作對象的 GetMediaStreamSource() 方法獲得 MediaStreamSource
  4. 將 MediaStreamSource 設置給 MediaElement(C#) 或 VideoTag(Javascript)進行播放。

FFmpegInteropMSS 中提供了兩個用於創建 FFmpegInteropObject

  1. CreateFFmpegInteropMSSFromStream
  2. CreateFFmpegInteropMSSFromUri

CreateFFmpegInteropMSSFromStream 方法接收三個參數 IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecodestream 即輸入的待播放媒體文件流;forceAudioDecode 用於設置是否強制使用 FFmpeg 對音頻進行軟解;forceVideoDecode 用於設置是否強制使用 FFmpeg 對視頻進行軟解。如果不設置強制使用 FFmpeg 進行軟解,那麼 MediaStreamSource 會把壓縮數據直接送入 MediaElement進行播放,目前只有 mp3、aac 和 H.264 支持硬解播放。

關於 Windows 10 系統本身支持硬解的格式,可以參考 Supported codecs

除了上述三個參數,CreateFFmpegInteropMSSFromStream 方法還有一個重載接收第四個參數 PropertySet^ ffmpegOptionsffmpegOptions 用於設置 FFmpeg 中 libavformat 庫所使用的訪問資源時要求的協議。所有屬性列表可以參閱 FFmpeg Protocols

CreateFFmpegInteropMSSFromUri 方法用於播放一個 URI 提供的媒體流,其接收參數為 String^ uri, bool forceAudioDecode, bool forceVideoDecode,並且同樣有一個接收 PropertySet^ ffmpegOptions 參數的重載用於指定協議設置。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇體驗ASP.NET Web API的安全管道。這裡的安全管道是指在請求和響應過程中所經歷的各個組件或進程,比如有IIS,HttpModule,OWIN,WebAPI,等等。在這個管道中大致分兩個階段,一個是驗證階段,另一個是授權階段。在ASP.NET Web API v1版本的時候,安全管道大致
  • 1. 【二進位(0~1)、八進位(0~7)、十進位(0~9)】→十六進位(0~15,10~15→A~F) 101011→1*20+1*21+0*22+1*23+0*24+1*25=1+2+0+8+0+32=43 053→3*80+5*81=3+40=43 0x2B=B*160+2*161=11+32
  • In the previous tutorial you created an MVC application that stores and displays data using the Entity Framework and SQL Server LocalDB. In this tutor
  • 1. 2.Note It's a common practice to implement the repository pattern in order to create an abstraction layer between your controller and the data acce
  • 一、選擇器是什麼 有了jQuery的選擇器,我們幾乎可以獲取頁面上任意一個或一組對象 二、Dom對象和jQuery包裝集 1.Dom對象 JavaScript中獲取Dom對象的方式 Hello World 輸出的結果 2.jQuery包裝集 可以理解為是Dom對象的擴展,在jQuery的世界中所有的...
  • ASP.NET MVC 6:https://docs.asp.net/en/latest/mvc/index.html ASP.NET Core :https://docs.asp.net/en/latest/fundamentals/index.html cli-samples : https:/
  • 今天記錄一下自己的EntityFramework數據訪問層。這裡用通過泛型Repository的方式實現了數據的訪問。先上一張結構圖。 Configuration文件夾裡面的類是全部實體映射類。這些類全部繼承至EntityConfigurationBase類。 EntityConfiguration
  • 1.配置文件層次分類 2.運行順序 配置文件的運行順序從大到小,從公有到私有:machine.config -> (公有)web.config -> (私有)web.config 當前配置文件決定了所在目錄及其子目錄的配置信息,並且子目錄下的配置信息覆蓋其父目錄的配置,多個web.config文件時
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...