FFmpeg开发笔记(七十四)Windows给FFmpeg集成二维码图像的编解码器

《FFmpeg开发实战:从零基础到短视频上线》一书的"7.1.1 添加图片标志"介绍了如何给视频添加图片标志,比如给视频画面添加一张二维码图像。不过前提条件是存在二维码图片,因为FFmpeg本身不支持根据文本生成二维码图像。幸而从FFmpeg 7.0开始,通过第三方的libqrencode和libquirc库实现了二维码的读写功能,这样处理视频中的二维码图像就方便多了。

接下来以微软的视窗系统为例,介绍如何在Windows环境给FFmpeg集成二维码的编解码器libqrencode和libquirc,具体的操作步骤说明如下:

一、配置libqrencode

libqrencode是一个快速紧凑的二维码编码库,支持将文本、URL、电话号码等信息转换为二维码图像。libqrencode的源码托管页面在https://github.com/fukuchi/libqrencode,最新版为2020年9月推出的libqrencode-4.1.1,下载地址是https://codeload.github.com/fukuchi/libqrencode/tar.gz/refs/tags/v4.1.1。

先下载最新的qrencode源码,再把qrencode源码包复制到MSYS环境的/usr/local/src目录下。接着在MSYS控制台执行下面命令解压源码包:

复制代码
tar zxvf libqrencode-4.1.1.tar.gz
cd libqrencode-4.1.1

然后执行下面命令配置qrencode:

复制代码
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=1 ..

配置完毕,会在build目录下找到QRencode.sln,这就是qrencode的Visual Studio项目工程文件。

二、编译libqrencode

打开Visual Studio 2022,在欢迎页面单击右侧的"打开项目或解决方案",在弹出的文件对话框中选择libqrencode-4.1.1\build目录下的QRencode.sln。

打开qrencode工程后,依次选择顶部菜单:生成→配置管理器,在打开的配置管理器窗口上,找到左上角的"活动解决方案配置"下拉框,把Debug模式改为Release模式,再单击窗口右下角的关闭按钮。

依次选择顶部菜单:生成→Build ALL_BUILD,Visual Studio就开始编译qrencode模块。编译过程可在Visual Studio界面下方观察,直到编译完成如下图所示。

此时可在libqrencode-4.1.1\Release目录下找到qrencode.lib和qrencode.dll,这两个文件就是编译生成的libqrencode库文件。

三、安装libqrencode

确保Windows系统已经按照《FFmpeg开发实战:从零基础到短视频上线》第一章"1.3 Windows系统安装FFmpeg"的说明安装配置了MSYS,再按照以下步骤在MSYS环境安装libqrencode。

1、在msys64的/usr/local目录下新建libqrencode目录,并在该目录下创建lib子目录;

2、把qrencode工程中Release目录下的qrencode.lib和qrencode.dll两个文件复制到第一步创建的lib目录;

3、在lib目录下创建pkgconfig子目录,并把qrencode工程的build\libqrencode.pc复制到pkgconfig目录;然后打开libqrencode.pc,把开头四行改成下面这样。

复制代码
prefix=/usr/local/libqrencode
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

4、在msys64的/usr/local/libqrencode目录下创建include目录,然后把qrencode工程的qrencode.h文件复制到刚才创建的include目录;

经过以上步骤操作后的libqrencode目录结构如下所示。

复制代码
/usr/local/libqrencode
 |--------------- lib
 |                 |----- qrencode.lib
 |                 |----- qrencode.dll
 |                 |----- pkgconfig
 |                           |----- libqrencode.pc
 |--------------- include
 |                 |----- qrencode.h

四、编译libquirc

libquirc是一个从图像中提取并解析二维码的开源库,它的源码托管页面在https://github.com/dlbeer/quirc,最新版为2023年5月推出的quirc-1.2,下载地址是https://codeload.github.com/dlbeer/quirc/tar.gz/refs/tags/v1.2。

先下载最新的quirc源码,再把quirc源码包复制到MSYS环境的/usr/local/src目录下。接着在MSYS控制台执行下面命令解压源码包:

复制代码
tar zxvf quirc-1.2.tar.gz
cd quirc-1.2

接着打开quirc源码目录下的Makefile,找到下面这行:

复制代码
all: libquirc.so qrtest

在其后补充下面两行用于编译Windows环境需要的dll文件和lib文件:

复制代码
lib: $(LIB_OBJ)
    $(CC) -shared -o quirc.dll $(LIB_OBJ) $(LDFLAGS) -lm -Wl,--out-implib,quirc.lib

保存Makefile文件后执行以下命令编译quirc:

复制代码
make lib

编译完毕会在quirc源码目录下生成quirc.dll和quirc.lib两个文件。

五、安装libquirc

确保Windows系统已经按照《FFmpeg开发实战:从零基础到短视频上线》第一章"1.3 Windows系统安装FFmpeg"的说明安装配置了MSYS,再按照以下步骤在MSYS环境安装libquirc。

1、在msys64的/usr/local目录下新建libquirc目录,并在该目录下创建lib子目录;

2、把quirc源码目录下的quirc.lib和quirc.dll两个文件复制到第一步创建的lib目录;

3、在lib目录下创建pkgconfig子目录,并在pkgconfig目录下新建文件libquirc.pc,给该pc文件填入以下的配置内容。

复制代码
prefix=/usr/local/libquirc
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: libquirc
Description: A QR Code extracting and decoding library
Version: 1.2
Libs: -L${libdir} -lquirc
Libs.private: 
Cflags: -I${includedir}

4、在msys64的/usr/local/libquirc目录下创建include目录,然后把quirc源码目录的lib\quirc.h文件复制到刚才创建的include目录;

经过以上步骤操作后的libquirc目录结构如下所示。

复制代码
/usr/local/libquirc
 |--------------- lib
 |                 |----- quirc.lib
 |                 |----- quirc.dll
 |                 |----- pkgconfig
 |                           |----- libquirc.pc
 |--------------- include
 |                 |----- quirc.h

六、编译安装FFmpeg

先下载最新的FFmpeg源码(版本号需大于等于7.0),再把FFmpeg源码包复制到MSYS环境的/usr/local/src目录下。接着在MSYS控制台执行下面命令解压源码包:

复制代码
cd /usr/local/src
unzip ffmpeg-n7.1.1.zip

确保MSYS环境已经按照《FFmpeg开发实战:从零基础到短视频上线》该书第八章的"8.1.1 给FFmpeg集成x264"和"8.1.5 给FFmpeg集成x265"安装了H.264的编码器libx264和H.265的编码器libx265,也按照该书第十章的"10.1.1 FFmpeg集成SDL"安装了Windows系统的SDL2库,并且按照之前的文章安装了H.266的编码器libvvenc,然后执行下面命令配置FFmpeg的编译环境:

复制代码
cd ffmpeg-n7.1.1
export PKG_CONFIG_PATH=/usr/local/libqrencode/lib/pkgconfig:$PKG_CONFIG_PATH
./configure --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-static --disable-doc --enable-libx264 --enable-libx265 --enable-libvvenc --enable-liblc3 --enable-librist --enable-libdav1d --enable-libaom --enable-libsvtav1 --enable-libxevd --enable-libxeve --enable-libqrencode --enable-libquirc --enable-sdl2 --enable-gpl --enable-nonfree --enable-iconv --enable-zlib --extra-cflags='-I/usr/local/libquirc/include' --extra-ldflags='-L/usr/local/libquirc/lib' --cross-prefix=x86_64-w64-mingw32- --target-os=mingw32

配置完毕执行下面命令编译和安装FFmpeg,编译完成的ffmpeg库将会安装到configure指定的/usr/local/ffmpeg目录。

复制代码
make
make install
cp /usr/local/libqrencode/lib/qrencode.dll /usr/local/ffmpeg/bin
cp /usr/local/libquirc/lib/quirc.dll /usr/local/ffmpeg/bin

七、查看FFmpeg的安装结果

运行下面命令查看FFmpeg的安装版本:

复制代码
ffmpeg -version

上面命令返回的FFmpeg版本信息如下:

复制代码
ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
configuration: --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-static --disable-doc --enable-libx264 --enable-libx265 --enable-libvvenc --enable-liblc3 --enable-librist --enable-libdav1d --enable-libaom --enable-libsvtav1 --enable-libxevd --enable-libxeve --enable-libqrencode --enable-libquirc --enable-sdl2 --enable-gpl --enable-nonfree --enable-iconv --enable-zlib --extra-cflags=-I/usr/local/libquirc/include --extra-ldflags=-L/usr/local/libquirc/lib --cross-prefix=x86_64-w64-mingw32- --target-os=mingw32
libavutil      59. 39.100 / 59. 39.100
libavcodec     61. 19.101 / 61. 19.101
libavformat    61.  7.100 / 61.  7.100
libavdevice    61.  3.100 / 61.  3.100
libavfilter    10.  4.100 / 10.  4.100
libswscale      8.  3.100 /  8.  3.100
libswresample   5.  3.100 /  5.  3.100
libpostproc    58.  3.100 / 58.  3.100

根据以上返回的版本信息,可知已安装的FFmpeg版本号为7.1.1,同时configuration这行找到"--enable-libqrencode --enable-libquirc",说明FFmpeg已经启用了二维码的编解码器libqrencode和libquirc。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

相关推荐
菜包eo17 分钟前
如何使用数字化动态水印对教育视频进行加密?
音视频·同态加密
ViiTor_AI1 小时前
语音对话秒译 + 视频悬浮字 + 相机即拍即译:ViiTor 如何破局跨语言场景?
音视频·机器翻译·视频翻译工具
安特尼3 小时前
Datawhale AI夏令营:基于带货视频评论的用户洞察挑战赛
机器学习·语言模型·音视频
嘉恩督4 小时前
视频人脸处理——人脸面部动作提取
python·音视频
九流下半7 小时前
window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
windows·ffmpeg·harmonyos·编译·openharmony·三方库
小雪人8289 小时前
如何批量旋转视频90度?
音视频
apihz11 小时前
通用图片搜索-搜狗源免费API接口使用指南
android·java·python·php·音视频
Antonio91511 小时前
【音视频】HLS拉流抓包分析
音视频