关于在windows系统中编译ffmpeg并导入到自己项目中这件事

关于在windows系统中编译ffmpeg并导入到自己项目中这件事

前因(可跳过不看)

前阵子由于秋招需求,写了一个简易的安卓播放器,最终因为时间问题还有一些功能没有实现着实可惜,如:倍速播放,快进操作,从其它渠道获取音视频流进行播放。由于对安卓开发的不熟悉,在安卓平台上调试问题的手段比较有限,比较疑惑的是有时候打断点可以走到程序中的某一步,有时候走不到。因此现在打算开发一款基于QT的音视频播放器,把遗憾一次性补齐。

编译ffmpeg

先前是在linux服务上使用ndk工具链编译的ffmpeg源代码,而windows操作系统中由于不具备一些必备的环境,网上也搜索了很多文章,最后断定windows中编译ffmpeg极具难度,不好直接编译,因此就需要在windows环境中构建linux环境。这里博主参考了网上用的比较多的方案MSYS.使用windows中的c语言编译器,Mingw64进行编译,那么废话不多说,下面看看需要准备哪些前提:

  • MSYS: 你可以把它理解成,是在windows环境下,模拟了linux操作系统,但是本质还是windows,但是它具备linux中的常用工具,相当于是把linux中的一些常用命令搬到windows上了
  • FFMPEG 4.3.8: ffmpeg的源码,我用的这个版本,可自行选择版本
  • CLION: JetBrain出的一款很好用的c语言IDE,从java转过来的觉得很亲切,可以很方便的在windows环境中使用cmake进行管理项目。

MSYS的准备工作

进入到MSYS的官网进行下载

下载完成之后直接无脑下一步安装就好了,中间有一步需要选择安装根目录,我这里怕出幺蛾子,直接默认路径了。

安装完成之后,可以在所选根路径下看到如下内容(博主这里不是刚下完之后的截图,但是大差也不差)

从开始处可以看到如下内容。

我们这里主要使用MingW64环境对ffmpeg项目进行编译处理。因此打开MSYS2 MINGW64

刚安装完这边应该是没有gcc,cmake,make这些环境的,因此需要进行安装。MSYS2环境中安装使用的是pacman命令,这里默认是请求的外网,没有科技的小伙伴可能访问速度较慢(压根没办法访问)。因此需要先把镜像源换成清华镜像源。执行如下命令即可。

sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*

安装依赖包

pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-gdb
pacman -S mingw-w64-x86_64-toolchain git make automake autoconf perl libtool mingw-w64-x86_64-cmake pkg-config yasm diffutils nasm

安装完成之后,可以输入命令尝试一下。像下面这样子基本就ok了

至此MSYS的前置工作就ok了。

FFMPEG的准备工作

进入到ffmpeg的官网下载ffmpeg源码,此处需要一点魔法,没有魔法的可以下载我上传至网盘中的源码。

通过网盘分享的文件:ffmpeg-4.3.8.tar.bz2
链接: https://pan.baidu.com/s/18ldKGCp0-O1D2WezloY-vQ?pwd=tq29 提取码: tq29 
--来自百度网盘超级会员v6的分享

下载完成后解压到MSYS安装的路径中,如下:

编写脚本编译ffmpeg。(这里编译过程是不带H264库的,需要h264的可自行先在msys中编译安装h264,再在ffmpeg的configure阶段选择h264)

basepath=$(cd `dirname $0`; pwd)

build_ffmpeg() {
    cd $basepath/ffmpeg-4.3.8
    pwd
    ./configure --prefix=${basepath}/ffmpeg_install \
                --enable-static \
                --enable-shared \
                --enable-gpl
    make
    make install
}
build_ffmpeg

运行脚本即可完成ffmpeg安装,安装目录内容如下:

主要使用bin目录下的dll动态库和include目录下的头文件。

创建项目导入ffmpeg

使用CLION创建项目,将ffmpeg编译好的四个文件夹,放到项目根目录下。

编辑CMakeLists.txt配置文件,内容如下:

cmake_minimum_required(VERSION 3.22)

project(THIRDPART_TEST)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/ffmpeg)
add_definitions(-D__STDC_CONSTANT_MACROS=1)

# 相当于-I
include_directories(${FFMPEG_DIR}/include)
# 相当于-L
link_directories(${FFMPEG_DIR}/bin)
add_executable(test main.cpp)


# 添加ffmpeg的动态库
target_link_libraries(test avcodec-58 avdevice-58 avfilter-7 avformat-58 avutil-56 postproc-55 swresample-3 swscale-5)
# 配置运行时链接地址rpath,没有这个的话,运行的时候链接不到动态库
set_target_properties(test PROPERTIES
    LINK_FLAGS "${LINK_FLAGS} -Wl,--enable-auto-import,-rpath,${FFMPEG_DIR}/bin"
)

至此ffmpeg就导入到项目中了,运行效果如下:

由于ffmpeg是一个纯C的库,因此当在c++项目中使用的时候导入头文件时,需要加入extern "C",否则会报链接不到的错误如下,我之前还一直以为是我库导入失败了,浪费了不少时间,罪过罪过,以后得注意了。

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值