一、vcpkg安裝ffmpeg 4.4.1
vcpkg的使用可以參考之前的文章:vcpkg 使用
1.1 查看vcpkg中的ffmpeg版本
查看庫的版本:vcpkg.io
1.2 vcpkg.json文件解析
創建vcpkg.json文件:
{"builtin-baseline": "984f9232b2fe0eb94f5e9f161d6c632c581fff0c","dependencies": [{"name": "ffmpeg","features": ["x264", "x265","fdk-aac","mp3lame"]}],"overrides": [{"name": "ffmpeg","version": "4.4.1","port-version": 20}]
}
說明:
builtin-baseline
:是vcpkg的commit-id
,vcpkg如果是解壓編譯的,是無法獲取該id的- 獲取commit-id:
git -C D:\Program\Vcpkg\vcpkg rev-parse HEAD
- 獲取commit-id:
dependencies
:只需要填寫庫名稱即可。name
庫名稱features
依賴庫
overrides
指定庫的版本version
:庫主版本號port-version
: vcpkg端口版本號
1.3 ffmpeg 常用feature
查找 feature:vcpkg search ffmpeg
分類 | Feature 名稱 | 描述 | 是否默認啟用 | 備注 |
---|---|---|---|---|
視頻編碼 | x264 | H.264 視頻編碼支持,使用 libx264 庫 | 否 | 需要 GPLv2+ 許可證,需手動啟用 |
x265 | H.265/HEVC 視頻編碼支持,使用 libx265 庫 | 否 | 需要 GPLv2+ 許可證,需手動啟用 | |
vpx | VP8/VP9 視頻編碼支持,使用 libvpx 庫 | 否 | 支持 WebM 編碼,需手動啟用 | |
aom | AV1 視頻編碼支持,使用 libaom 庫 | 否 | AV1 編碼,需手動啟用 | |
webp | WebP 圖像編碼支持,使用 libwebp 庫 | 否 | 用于 WebP 圖像和動畫編碼 | |
openh264 | H.264 視頻編碼支持,使用 Cisco OpenH264 庫 | 否 | 受專利限制,僅支持基線配置文件 | |
音頻編碼 | fdk-aac | AAC 音頻編碼支持,使用 Fraunhofer FDK AAC 庫 | 否 | 非自由許可證,需手動啟用 |
mp3lame | MP3 音頻編碼支持,使用 LAME 庫 | 否 | 需手動啟用,廣泛用于 MP3 編碼 | |
opus | Opus 音頻編碼支持,使用 libopus 庫 | 否 | 高質量低延遲音頻編碼,需手動啟用 | |
flac | FLAC 無損音頻編碼支持,使用 libflac 庫 | 否 | 無損音頻編碼,需手動啟用 | |
其他常用 | ffmpeg | 構建 FFmpeg CLI 工具(ffmpeg.exe) | 是 | 核心命令行工具,包含 muxer/demuxer 和基本濾鏡 |
ffprobe | 構建 ffprobe 工具,用于分析媒體文件信息 | 否 | 媒體元數據和流信息分析工具 | |
ffplay | 構建 ffplay 工具,用于媒體播放 | 否 | 需要 SDL2 依賴,簡單的媒體播放器 | |
sdl2 | SDL2 庫支持,用于 ffplay 和其他圖形/音頻輸出 | 否 | ffplay 的依賴,需手動啟用 | |
fontconfig | Fontconfig 支持,用于字幕渲染和文本濾鏡 | 否 | 需手動啟用,增強字幕渲染能力 | |
freetype | FreeType 字體渲染支持,用于字幕和文本濾鏡 | 否 | 需手動啟用,增強字幕渲染能力 | |
opencl | OpenCL 硬件加速支持,用于濾鏡和部分編碼/解碼 | 否 | 需 OpenCL 兼容硬件,實驗性支持 | |
vaapi | VAAPI 硬件加速支持(Linux),用于視頻編碼/解碼 | 否 | Linux 平臺,需 Intel/AMD GPU 支持 | |
vdpau | VDPAU 硬件加速支持(Linux),用于視頻解碼 | 否 | Linux 平臺,需 NVIDIA GPU 支持 | |
openjpeg | JPEG 2000 圖像編碼支持,使用 OpenJPEG 庫 | 否 | 需手動啟用,支持 J2K 視頻 | |
zlib | Zlib 壓縮支持,用于某些容器格式(如 PNG、ZIP) | 否 | 需手動啟用,常見依賴 | |
bzip2 | Bzip2 壓縮支持,用于某些容器格式 | 否 | 需手動啟用,較少使用 | |
lzma | LZMA 壓縮支持,用于某些容器格式(如 XZ、TIFF) | 否 | 需手動啟用,常見于高壓縮場景 | |
srt | SRT 協議支持,用于低延遲流傳輸 | 否 | 需手動啟用,適用于直播 | |
rtmp | RTMP 協議支持,用于流媒體傳輸(如 YouTube 直播) | 否 | 需手動啟用,依賴 OpenSSL 或 GnuTLS |
1.4 編譯安裝庫
# 臨時設置代理(powershell終端)
$env:HTTP_PROXY = "http://127.0.0.1:11819"
$env:HTTPS_PROXY = "http://127.0.0.1:11819"# 指定VS版本編譯,vcpkg默認使用最新版本的VS編譯【可選】
# $env:VCPKG_VISUAL_STUDIO_PATH = "D:\Program\Program Files (x86)\Microsoft Visual Studio\2017\Community"# 編譯安裝(常見Triplet類型在下面表格)
vcpkg.exe install --triplet x64-windows-release --x-install-root=.\tmp
Triplet 名稱 | 庫鏈接方式 | 運行時庫鏈接 | 構建類型 |
---|---|---|---|
x64-windows | 動態 (DLL) | 動態 (/MD ) | Debug + Release |
x64-windows-release | 動態 (DLL) | 動態 (/MD ) | Release Only |
x64-windows-static | 靜態 (LIB) | 靜態 (/MT ) | Debug + Release |
x64-windows-static-release | 靜態 (LIB) | 靜態 (/MT ) | Release Only |
x64-windows-static-md | 靜態 (LIB) | 動態 (/MD ) | Debug + Release |
x64-windows-static-md-release | 靜態 (LIB) | 動態 (/MD ) | Release Only |
注意:--x-install-root
是指定庫的安裝目錄,最終庫的目錄是:tmp\x64-windows
二、VSCode+CMake+VS2019編譯器 使用ffmpeg
項目目錄結構:
main.c文件內容:
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>int main() {// 待檢查的編解碼器列表const char *codecs[] = {"libx264", // H.264 編碼器"libx265", // HEVC 編碼器"libfdk_aac", // AAC 編碼器"libmp3lame", // MP3 編碼器NULL // 結束標記};printf("FFmpeg 集成編解碼器狀態檢查:\n");printf("===========================\n");// 遍歷并檢查每個編解碼器for (int i = 0; codecs[i] != NULL; i++) {const AVCodec *codec = avcodec_find_encoder_by_name(codecs[i]);if (!codec) {// 若編碼器未找到,嘗試查找解碼器codec = avcodec_find_decoder_by_name(codecs[i]);}if (codec) {printf("[?] %-12s : 已啟用 (類型: %s)\n", codecs[i], codec->type == AVMEDIA_TYPE_VIDEO ? "視頻" : "音頻");} else {printf("[?] %-12s : 未啟用或未編譯\n", codecs[i]);}}return 0;
}
CMakeLists.txt文件內容:
cmake_minimum_required(VERSION 3.10)
project(ffmpeg_test VERSION 1.0)set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED True)# 設置可執行文件輸出目錄為 bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/bin)# 配置FFmpeg(avcodec.lib時動態庫的導入庫)
set(FFMPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/ffmpeg_4.4.1)
include_directories(${FFMPEG_DIR}/include)
set(FFMPEG_LIBS${FFMPEG_DIR}/lib/avdevice.lib${FFMPEG_DIR}/lib/avfilter.lib${FFMPEG_DIR}/lib/avformat.lib${FFMPEG_DIR}/lib/avcodec.lib${FFMPEG_DIR}/lib/swscale.lib${FFMPEG_DIR}/lib/swresample.lib${FFMPEG_DIR}/lib/avutil.lib
)# 編譯和鏈接依賴庫
add_executable(${PROJECT_NAME} src/main.c)
target_link_libraries(${PROJECT_NAME} PRIVATE ${FFMPEG_LIBS} )# 使用file(GLOB)獲取所有DLL文件
file(GLOB FFMPEG_DLLS "${FFMPEG_DIR}/bin/*.dll")# 添加自定義命令,在構建后復制DLL文件到輸出目錄
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different${FFMPEG_DLLS}"${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)
構建命令
# 生成構建系統(在項目根目錄下執行)
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE --no-warn-unused-cli -S./ -B./build -G "Visual Studio 16 2019" -T host=x64 -A x64# 編譯(在build目錄下執行)
cmake --build . --config Release
通過cmake插件生成構建系統文件: