ubuntu中使用ffmpeg庫進行api調用開發

一般情況下,熟悉了ffmpeg的命令行操作,把他當成一個工具來進行編解碼啥的問題不大,不過如果要把功能集成進自己的軟件中,還是要調用ffmpeg的api才行。

ffmpeg的源碼和外帶的模塊有點太多了,直接用官網別人編譯好的庫就可以了,下面的操作就是演示使用cmake調用ffmpeg的庫,來進行api的開發。

我把最后的工程包放到了我的下載資源里面了:ubuntu中使用ffmpeg庫進行開發的cmake工程資源-CSDN文庫

1 下載編譯好的ffmpeg庫

去如下網址下載自己想要的平臺的庫文件:??

Releases · BtbN/FFmpeg-Builds · GitHub

?對于ubuntu,下載linux amd64版本。

2 新建cmake工程文件夾架構

就是新建一個工程文件夾,里面包含幾個子文件夾,把ffmpeg的庫放到lib文件夾里面。

├── build
├── CMakeLists.txt
├── inc
├── lib
│???├── CMakeLists.txt
│???└── ffmpeg_lib
└── src
? ? ├── CMakeLists.txt
? ? ├── module
? ? └── system

上面是我的一個文件夾結構,我把ffmpeg的庫放到lib文件夾中,自己的代碼放到src里面,頂層有CMakeLists.txt,各個子文件夾有各自的CMakeLists.txt。

3 編寫CMakeLists.txt,然后編譯

頂層的cmakelists.txt


#version required
cmake_minimum_required(VERSION 3.22.1)#project name
project(ffmpeg_test VERSION 1.0.0)#include dir
include_directories(inc)
link_directories(lib)#ffmpeg lib
include_directories(lib/ffmpeg_lib/include)
link_directories(lib/ffmpeg_lib/lib)#configs
set(BUILD_SHARED_LIBS on)   #shared libs
set(CMAKE_BUILD_TYPE debug) #debug modemessage(STATUS build_type:${CMAKE_BUILD_TYPE})
if(CMAKE_BUILD_TYPE)set(CMAKE_C_FLAGS_DEBUG "-O2 -DDEBUG")message(STATUS c_flags:${CMAKE_C_FLAGS_DEBUG})
else()message(STATUS build_type:${CMAKE_BUILD_TYPE})
endif()#subdirectory
add_subdirectory(src)
add_subdirectory(lib)message(STATUS "project version:${PROJECT_VERSION}")
message(STATUS system_name:${CMAKE_HOST_SYSTEM_NAME}) 
message(STATUS system_processor:${CMAKE_HOST_SYSTEM_PROCESSOR}) 
message(STATUS host_system:${CMAKE_HOST_SYSTEM}) 
message(STATUS system_version:${CMAKE_HOST_SYSTEM_VERSION})

lib文件夾的cmakelists.txt


set(ffmpeg_lib_dir, ffmpeg_lib/lib)
set(ffmpeg_header_dir, ffmpeg_lib/include)#IMPORT exist SHARED libs
add_library( avcodec SHARED IMPORTED)
add_library( avfilter SHARED IMPORTED )
add_library( swresample SHARED IMPORTED )
add_library( swscale SHARED IMPORTED )
add_library( avformat SHARED IMPORTED )
add_library( avutil SHARED IMPORTED )#set lib link dir
set_target_properties( avcodec PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavcodec.so )
set_target_properties( avfilter PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavfilter.so )
set_target_properties( swresample PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libswresample.so )
set_target_properties( swscale PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libswscale.so )
set_target_properties( avformat PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavformat.so )
set_target_properties( avutil PROPERTIES IMPORTED_LOCATION ${ffmpeg_lib_dir}/libavutil.so )#add include and library directories to system
include_directories(ffmpeg_lib/include)
link_directories(ffmpeg_lib/lib)#link librarys to system
#target_link_libraries(${PROJECT_NAME}  avcodec avformat avutil swresample swscale swscale avfilter )#get_property(inc_dirs DIRECTORY ./ PROPERTY INCLUDE_DIRECTORIES)
#get_property(lib_dirs DIRECTORY ./ PROPERTY LINK_DIRECTORIES)
#message("cmake ffmpeg... \n include_dirs=${inc_dirs} \n lib_dirs=${lib_dirs}")

src文件夾的cmakelists.txt


#include directory
include_directories(module)
link_directories(module)#subdirectory
add_subdirectory(module)
add_subdirectory(system)get_property(inc_dirs DIRECTORY ./ PROPERTY INCLUDE_DIRECTORIES)
get_property(lib_dirs DIRECTORY ./ PROPERTY LINK_DIRECTORIES)
message("cmake src... \n include_dirs=${inc_dirs} \n lib_dirs=${lib_dirs}")

system子文件夾的cmakelists.txt

#bin file, before libs
#aux_source_directory(./ system_files)
#add_executable(${PROJECT_NAME} ${system_files})
#add_executable(${PROJECT_NAME} mux.c)
#add_executable(${PROJECT_NAME} demux_decode.c)
add_executable(${PROJECT_NAME} decode_filter_video.c)#libs
target_link_libraries(${PROJECT_NAME} PRIVATE   module                  #link local module libavcodec avformat avutil swresample swscale swscale avfilter #link ffmpeg libm)                      #link libm.so for math operationsset(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

進入build文件夾,執行命令:

cmake ../
make
oushaojun@oushaojun-virtual-machine:~/Desktop/ffmpeg/cmake_project/build$ cmake ../
-- build_type:debug
-- c_flags:-O2 -DDEBUG
cmake src... include_dirs=/home/oushaojun/Desktop/ffmpeg/cmake_project/inc;/home/oushaojun/Desktop/ffmpeg/cmake_project/lib/ffmpeg_lib/include;/home/oushaojun/Desktop/ffmpeg/cmake_project/src/module lib_dirs=/home/oushaojun/Desktop/ffmpeg/cmake_project/lib;/home/oushaojun/Desktop/ffmpeg/cmake_project/lib/ffmpeg_lib/lib;/home/oushaojun/Desktop/ffmpeg/cmake_project/src/module
-- project version:1.0.0
-- system_name:Linux
-- system_processor:x86_64
-- host_system:Linux-6.8.0-49-generic
-- system_version:6.8.0-49-generic
-- Configuring done
-- Generating done
-- Build files have been written to: /home/oushaojun/Desktop/ffmpeg/cmake_project/build
oushaojun@oushaojun-virtual-machine:~/Desktop/ffmpeg/cmake_project/build$ make
Consolidate compiler generated dependencies of target module
[ 50%] Built target module
Consolidate compiler generated dependencies of target ffmpeg_test
[100%] Built target ffmpeg_test
oushaojun@oushaojun-virtual-machine:~/Desktop/ffmpeg/cmake_project/build$ 

去build/bin中就可以看到最后的可執行文件了,當前的可執行程序都是官方的demo,要寫自己的代碼一樣的套路。

ffmpeg的api使用不是很復雜,不過比較底層,要想集成進自己的項目里面,工作量不小。

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

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

相關文章

Chrome擴展插件案例:單詞查詢

Chrome擴展插件案例:單詞查詢 在頁面內選中單詞,右鍵菜單中顯示詞典連接,自動將選中單詞發送至該詞典查詢 創建項目文件夾,在文件夾內創建一下文件 manifest.json: {"manifest_version":2,//版本號,由goo…

Leetcode SQL 刷題與答案-基礎篇

數據科學家 算法工程師 面試準備 全套-github.com/LongxingTan/Machine-learning-interview 1050. 合作過至少三次的演員和導演 SELECT actor_id, director_id FROM ActorDirector GROUP BY actor_id, director_id HAVING COUNT(*) > 3;1076. Project Employees II SELEC…

實現 DataGridView 下拉列表功能(C# WinForms)

本文介紹如何在 WinForms 中使用 DataGridViewComboBoxColumn 實現下拉列表功能,并通過事件響應來處理用戶的選擇。以下是實現步驟和示例代碼。 1. 效果展示 該程序的主要功能是展示如何在 DataGridView 中插入下拉列表,并在選擇某一項時觸發事件。 2.…

Docker Compose實戰一( 輕松部署 Nginx)

通過過前面的文章(Docker Compose基礎語法)你已經掌握基本語法和常用指令認識到Docker Compose作為一款強大工具的重要性,它極大地簡化了多容器Docker應用程序的部署與管理流程。本文將詳細介紹如何使用 Docker Compose 部署 Nginx&#xff0…

【免費】如何考取HarmonyOS應用開發者基礎認證和高級認證(詳細教程)

HarmonyOS應用開發者認證考試PC網址 基礎:華為開發者學堂 高級:華為開發者學堂 注:免費認證,其中基礎認證有免費的課程,瀏覽器用Edge。 (新題庫有點懶,不更新了,點贊收藏后找我要新題庫 2024…

解決ThreadLocal在項目中的線程數據共享問題

目錄 ThreadLocal 簡介 問題描述 為什么會有這個問題 解決方案 1. 使用請求作用域存儲 2. 使用 HTTP Session 存儲 3. 使用 Spring Security 4. 確保 ThreadLocal 的正確使用 5.通常解決方法 結論 在多線程環境中,ThreadLocal 是一種非常有用的工具&#…

瑞芯微開發板 燒寫固件問題

自用rk3568-firefly-itx-3568q核心板fpga自研底板,因底板所需外設、功能與原廠有較大差異,故裁剪相應sdk,編譯新的內核進行燒寫。然而在更改設備樹過程中kernel/drivers/media/i2c/fpga.c中的像素格式MEDIA_BUS_FMT_YUYV8_2X8誤改成MEDIA_BUS…

photoblog解題過程

本題要求:通過sql注入,找到數據庫中的賬號密碼,并成功登錄。登錄后利用文件上傳,將一句話木馬上傳到數據庫中,然后并對網站進行控制。 解題過程 1、通過在靶機中輸入ifconfig,查到ip為192.168.80.153&…

QT獲取tableview選中的行和列的值

查詢數據庫數據放入tableview(tableView_database)后 QSqlQueryModel* sql_model new QSqlQueryModel(this);sql_model->setQuery("select * from dxxxb_move_lot_tab");sql_model->setHeaderData(0, Qt::Horizontal, tr("id&quo…

「Mac玩轉倉頡內測版46」小學奧數篇9 - 基礎概率計算

本篇將通過 Python 和 Cangjie 雙語實現基礎概率的計算,幫助學生學習如何解決簡單的概率問題,并培養邏輯推理和編程思維。 關鍵詞 小學奧數Python Cangjie概率計算 一、題目描述 假設有一個袋子中有 5 個紅球和 3 個藍球,每次從袋子中隨機…

Face2QR:可根據人臉圖像生成二維碼,還可以掃描,以后個人名片就這樣用了!

今天給大家介紹的是一種專為生成個性化二維碼而設計的新方法Face2QR,可以將美觀、人臉識別和可掃描性完美地融合在一起。 下圖展示為Face2QR 生成的面部圖像(第一行)和二維碼圖像(第二行)。生成的二維碼不僅忠實地保留…

電子商務人工智能指南 1/6 - 搜索、廣告和發現

介紹 81% 的零售業高管表示, AI 至少在其組織中發揮了中等至完全的作用。然而,78% 的受訪零售業高管表示,很難跟上不斷發展的 AI 格局。 近年來,電子商務團隊加快了適應新客戶偏好和創造卓越數字購物體驗的需求。采用 AI 不再是一…

Python快速入門二:Python3 基礎語法

一、編碼 默認情況下,Python 3 源碼文件以 UTF-8 編碼,所有字符串都是 unicode 字符串。 當然你也可以為源碼文件指定不同的編碼: # -*- coding: cp-1252 -*-上述定義允許在源文件中使用 Windows-1252 字符集中的字符編碼,對應適…

nextcloud云盤的部署

借鑒鏈接:https://blog.csdn.net/guigenyi/article/details/126692747 創建自定義 Docker 網絡 docker network create nextcloud-network 創建mysql的賬號密碼都是root 并將其連接到自定義網絡 docker run --name mysql-container --network nextcloud-network -e…

圖(dfs與bfs)算法1

開辟新專題!不擅長的圖它來了來了!(莫名激動 進度:10/100 另:沒想到給自己挖了個坑,可以用dfs的基本上也可以用bfs,看來要雙線并行了。 補:圖算法是我近期得有30%的焦慮來源了&am…

Ruby On Rails 筆記3——表的增刪改查

1.Migration Migrations是一種便利的方法,能以重現的方式隨時間推移改變數據庫schema. 使用Ruby Domain Specific Language (DSL),因此你不用手寫SQL,進而使你的schema和changes與數據庫獨立。 可以把每次migration看作是數據庫的一個新“版本”。A schema開始時什么都沒有…

一、測試工具LoadRunner Professional腳本編寫-錄制前設置

設置基于URL的腳本 原因:基于HTML的腳本會導致login接口不能正確錄制 設置UTF-8 原因:不勾選此項會導致腳本中文變為亂碼

14、鴻蒙學習——管理通知角標

針對未讀的通知,系統提供了角標設置接口,將未讀通知個數顯示在桌面圖標的右上角角標上。 通知增加時,角標上顯示的未讀通知個數需要增加。 通知被查看后,角標上顯示的未讀通知個數需要減少,沒有未讀通知時&#xff0…

Thonny IDE + MicroPython + ESP32 + GY-302 測量環境中的光照強度

GY-302是一款基于BH1750FVI光照強度傳感器芯片的模塊。該模塊能夠直接測量出環境中的光照強度,并將光照強度轉換為數字信號輸出。其具體參數如下表所示。 參數名稱 參數特性 測量范圍 0-65535 LX 測量精度 在環境光下誤差小于20%,能夠自動忽略50/60…

AJAX和XHR、fetch、axios的關系

AJAX中有兩套原生的API,一個是XHR(XMLHttpRequest),一個是Fetch API axios是第三方庫,在瀏覽器環境中使用的是XHR umi-request也是第三方庫,在瀏覽器環境中使用的是Fetch 在 AJAX(Asynchronous JavaScript and XML&am…