在 Windows 系統下,將 FFmpeg 編譯為 .so 文件

1. 準備環境

確保你的 Windows 系統已安裝以下工具:

  • Android Studio

  • NDK(Native Development Kit)

  • MSYS2(用于提供類 Unix 環境)

  • FFmpeg 源碼

  • Git Bash(可選,推薦使用)

安裝 MSYS2
  1. 下載并安裝?MSYS2。

  2. 打開 MSYS2 終端,更新包管理器:

pacman -Syu

? ? ? 3.安裝必要的工具:

pacman -S make pkg-config diffutils git

2. 下載 FFmpeg 源碼

在 MSYS2 終端中,克隆 FFmpeg 源碼:

git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg

3. 配置 FFmpeg 編譯腳本

在 FFmpeg 源碼目錄中創建一個?build_android.sh?腳本,內容如下:

#!/bin/bash# 設置 NDK 路徑
NDK=/d/aaa/ndk/21.4.7075529
# 設置輸出目錄
OUTPUT=/d/output# 定義架構和 API 組合
ARCHS=("arm" "arm64")
CPUS=("armv7-a" "armv8-a")
APIS=(21 21)# 遍歷架構
for i in "${!ARCHS[@]}"; doARCH=${ARCHS[$i]}CPU=${CPUS[$i]}API=${APIS[$i]}# 設置工具鏈TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64SYSROOT=$TOOLCHAIN/sysroot# 設置編譯器和編譯選項if [ "$ARCH" == "arm" ]; thenCC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clangCROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-elseCC=$TOOLCHAIN/bin/aarch64-linux-android$API-clangCROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-fiCFLAGS="-march=$CPU -Os -fPIC -D__ANDROID_API__=$API"LDFLAGS=""# 配置 FFmpeg./configure \--prefix=$OUTPUT/$ARCH \--enable-shared \--disable-static \--disable-doc \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-symver \--disable-asm \--enable-cross-compile \--cross-prefix=$CROSS_PREFIX \--target-os=android \--arch=$ARCH \--sysroot=$SYSROOT \--cc=$CC \--extra-cflags="$CFLAGS" \--extra-ldflags="$LDFLAGS"# 編譯并安裝make cleanmake -j4make install
done

確保你的 NDK 已經解壓或安裝到?D:\aaa?目錄下。例如,NDK 的完整路徑可能是:

D:\aaa\ndk\25.1.8937393

在 FFmpeg 編譯腳本中,將 NDK 路徑設置為?D:\aaa?目錄。由于 Windows 路徑使用反斜杠?\,而在類 Unix 環境(如 MSYS2)中需要使用正斜杠?/,因此需要將路徑轉換為類 Unix 格式。

4. 運行編譯腳本

  1. 在 MSYS2 終端中,進入 FFmpeg 源碼目錄。

  2. 運行編譯腳本:

chmod +x build_android.sh
./build_android.sh

編譯完成后,.so?文件會生成在?OUTPUT?指定的目錄中。

5.檢查編譯器版本

運行以下命令檢查?gcc?或?clang?的版本:

gcc --version

clang --version

6.?升級 GCC 或 Clang

pacman -Syu
pacman -S mingw-w64-x86_64-gcc

如果報錯,檢查

7.?檢查是否安裝了 GCC

運行以下命令檢查 GCC 是否已安裝:

which gcc

pacman -Q mingw-w64-x86_64-gcc

確認 GCC 的安裝路徑

GCC 的可執行文件通常安裝在 MSYS2 的?mingw64/bin?目錄下。運行以下命令,檢查 GCC 是否存在:

ls /mingw64/bin/gcc.exe

8.配置環境變量(如果需要)

如果?gcc --version?仍然報錯,可能是因為 GCC 的路徑沒有添加到系統的環境變量中。

  • 確保 MSYS2 的?mingw64/bin?或?usr/bin?目錄在環境變量中。

  • 打開 MSYS2 終端,運行以下命令檢查路徑:

echo $PATH

如果路徑中沒有?mingw64/bin?或?usr/bin,手動添加:

export PATH=/mingw64/bin:$PATH

臨時添加(僅當前終端會話有效)

運行以下命令:

export PATH=/mingw64/bin:$PATH

永久添加(對所有終端會話有效)

編輯你的 shell 配置文件(如?~/.bashrc?或?~/.bash_profile),添加以下行:

export PATH=/mingw64/bin:$PATH

然后運行以下命令使配置生效:

source ~/.bashrc

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

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

相關文章

leetcode二叉樹3

404.左葉子之和 給定二叉樹的根節點 root ,返回所有左葉子之和。 示例 1: 輸入: root [3,9,20,null,null,15,7] 輸出: 24 解釋: 在這個二叉樹中,有兩個左葉子,分別是 9 和 15,所以返回 24示例 2: 輸入: root [1] 輸…

QT網絡通信的接口與使用

文章目錄 前言1.服務端實現流程1.1步驟 1:創建 QTcpServer 并監聽端口1.2步驟 2:處理新連接請求1.3步驟 3:接收客戶端數據1.4步驟 4:處理客戶端斷開 2.客戶端實現流程2.1步驟 1:創建 QTcpSocket 并連接服務器2.2步驟 2…

華為OD機試2025A卷七日集訓第1期 - 按算法分類,由易到難,循序漸進,玩轉OD(Python/JS/C/C++)

目錄 一、適合人群二、本期訓練時間三、如何參加四、7日集訓第1期五、精心挑選21道高頻100分經典題目,作為入門。第1天、邏輯分析第2天、邏輯分析第3天、邏輯分析第4天、邏輯分析第5天、雙指針第6天、二叉樹第7天、回溯 六、集訓總結六、國內直接使用最新GPT-4.5、滿…

Qt 重入和線程安全

重入和線程安全 在整個文檔中,"重入"和 "線程安全 "這兩個術語被用來標記類和函數,以表明它們在多線程應用程序中的使用方式: 線程安全函數可以同時被多個線程調用,即使調用使用的是共享數據,因…

Elasticsearch:構建 AI 驅動的搜索體驗

Elasticsearch 介紹 當你開始使用 Elastic 時,你將使用 Elasticsearch Relevance Engine?(ESRE),它專為 AI 搜索應用程序提供支持。借助 ESRE,你可以利用一整套開發者工具,包括 Elastic 的文本搜索、向量…

鴻蒙生態開發

鴻蒙生態開發概述 鴻蒙生態是華為基于開源鴻蒙(OpenHarmony)構建的分布式操作系統生態,旨在通過開放共享的模式連接智能終端設備、操作系統和應用服務,覆蓋消費電子、工業物聯網、智能家居等多個領域。以下從定義與架構、核心技術…

JVM如何處理Java中的精度轉換: 從源碼到字節碼

你好,我是 shengjk1,多年大廠經驗,努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注!你會有如下收益: 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么,評論或者私信告訴我! 文章目錄 一…

vue-next-admin修改配置指南

官方文檔地址:vue-next-admin 1.如何開啟側邊欄logo 在scr-layout-navbars-topBar-setings.vue中添加 getThemeConfig.value.isShowLogo true; 設置為true即可默認打開 2.修改側邊欄頂部的logo與文字 先把想要的圖標存到我的項目然后下載 然后把后面的幾個文件拉…

gin學習

gin學習筆記,不僅包含了基本的增刪查改外,還包括參數傳遞,上傳下載,模版、session與中間件等,方便收藏自習可用 文章目錄 獲得個請求get打印字符串get請求xmlget請求跳轉http方法路由可以通過Context的Param方法來獲取…

Flutter運行錯誤:UG! exception in phase ‘semantic analysis‘

最近在Mac Mini M4上通過Android Studio導入Flutter項目并運行,結果一直跑不起來,錯誤日志如下: 執行命令查看版本信息: flutter doctor --verbose通過輸出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…

【計算機網絡運輸層詳解】

文章目錄 一、前言二、運輸層的功能1. 端到端通信2. 復用與分用3. 差錯檢測4. 流量控制5. 擁塞控制 三、運輸層協議:TCP 和 UDP1. TCP:面向連接的可靠傳輸協議2. UDP:無連接的傳輸協議 四、端口號與進程通信1. 端口號分類2. 端口通信模型 五、…

51單片機和STM32 入門分析

51單片機和STM32是嵌入式開發中兩種主流的微控制器,它們在架構、性能、應用場景等方面存在顯著差異。以下是兩者的對比分析及選擇建議: 1. 51單片機與STM32的定義與特點 51單片機 定義:基于Intel 8051內核的8位微控制器,結構簡單…

開源視覺語言模型MiniMax-VL-01:動態分辨率+4M超長文本,性能比肩GPT-4o

在人工智能領域,構建能夠像人類一樣理解、思考和行動的智能體(AI Agent)一直是研究人員的終極目標之一。而實現這一目標的關鍵在于模型是否具備足夠強大的感知能力、記憶能力和推理能力。近期,國內人工智能公司MiniMax重磅開源了其…

excel 列單元格合并(合并列相同行)

代碼 首先自定義注解CellMerge,用于標記哪些屬性需要合并,哪個是主鍵**(這里做了一個優化,可以標記多個主鍵)** import org.dromara.common.excel.core.CellMergeStrategy;import java.lang.annotation.*;/*** excel…

flowable適配達夢7 (2.1)

經過第一版的問題解決,后端項目可以啟動,前端頁面也集成進去。 前端在流程設計頁面報錯 之后發現主要是組件中modelerStore這個值沒有 解決方法:在data增加對象 給component/process/designer.vue 中涉及到的每個子組件傳入 :modelerStore“modeler…

Prometheus Exporter系列-Mysql_Exporter一鍵部署

新項目舊項目都需要給研發配置mysql監控,這里mysql監控對應aws 阿里云 騰訊云 華為云的云mysql產品或開源自建mysql。 exporter安裝雖然簡單,經常手動操作不免讓人心煩,一鍵完成省去繁瑣的常規操作。 配置信息對的情況下測試多次都可以正常安…

2025年移動端開發性能優化實踐與趨勢分析

啟動速度優化 本質:縮短首次可見幀渲染時間。 方法: iOS:利用Core ML本地模型輕量化部署,減少云端等待。Android:強制啟用SplashScreen API,通過setKeepOnScreenCondition控制動畫時長。冷啟動需將耗時操…

【MySQL篇】DEPENDENT SUBQUERY(依賴性子查詢)優化:從百秒到秒級響應的四種優化辦法

💫《博主介紹》:?又是一天沒白過,我是奈斯,從事IT領域? 💫《擅長領域》:??擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對SQLserver、NoSQL(…

全文 - MLIR Toy Tutorial Chapter 1: Toy Language and AST

Toy 語言 本教程,將會借助一個玩具語言來講解,這個語言我們稱其為 Toy。Toy 是一個基于張量的語言,它允許你定義函數,執行一些數學計算,并且打印結果。做這樣的設定,是因為我們希望讓教程保持簡明&#xff…

排序復習_代碼純享

頭文件 #pragma once #include<iostream> #include<vector> #include<utility> using std::vector; using std::cout; using std::cin; using std::endl; using std::swap;//插入排序 //1、直接插入排序&#xff08;穩定&#xff09; void InsertSort(vecto…