FFmpeg在 Windows 环境编译(64位)支持h264,h265,和Intel QSV,Nvidia Cuda,AMD amf 硬件加速

这篇具有很好参考价值的文章主要介绍了FFmpeg在 Windows 环境编译(64位)支持h264,h265,和Intel QSV,Nvidia Cuda,AMD amf 硬件加速。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

前言

一. 源码包下载

1. FFmpeg源码下载

2. MSYS2安装

  2.1 执行下面命令配置环境

  2.2 安装完成后将MSYS2安装路径下的mingw64/bin配置到windows环境变量中

  2.3 安装其他工具( 默认全部安装 ):

3. 安装CMake工具

  3.1 将CMake加入环境变量

4. 下载x264,x265

  4.1 x264源码下载:

  4.2 x265源码下载(直接git):

二. 开始编译

1. 编译x264

2. 编译x265

3. 编译FFmpeg

三. 功能验证

1. x264验证

2. x265验证

3. FFmpeg验证

四. FFmpeg支持 Intel,Nvidia,AMD 硬件加速

1. 支持Intel QSV硬件加速

2. 支持 Nvidia nvenc,cuda,cuvid 硬件加速

3. AMD amf 硬件加速支持

4. 完整的 build-ffmpeg.sh 脚本文件代码

五. 硬件加速功能测试

1. Intel QSV 硬件加速编解码测试

2. Nvidia 硬件加速测试

3. AMD 硬件加速测试

六. 可能存在的问题

1. 可能缺少某些依赖库

2. 如何查看我们编译好的 FFmpeg 依赖哪些库?

3. Nvidia 部分依赖库 libnpp 支持

4. Error: operand type mismatch for `shr'

参考博客链接


前言

        最近完成了 FFmpeg 在 Windows 环境下的编译工作,在查询了大量的官方文档和牛人博客,并且踩了N多坑后,总结出了比较完善的编译方式。

一. 源码包下载

1. FFmpeg源码下载

下载地址: FFmpeg

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

2. MSYS2安装

下载地址:MSYS2

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

  2.1 执行下面命令配置环境

pacman -Syu

输入y选择全部更新,更新完成后再次执行

pacman -Syu

安装基础工具(默认全部安装):

pacman -S base-devel

安装编译工具(默认全部安装):

pacman -S mingw-w64-x86_64-toolchain

如果是要编译32位的FFmpeg,则需要在MSYS的MinGW32里运行如下命令:

pacman -S mingw-w64-i686-toolchain

  2.2 安装完成后将MSYS2安装路径下的mingw64/bin配置到windows环境变量中

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

  2.3 安装其他工具( 默认全部安装 ):

pacman -S yasm
pacman -S nasm
pacman -S make

3. 安装CMake工具

CMake下载地址:Download | CMake

  3.1 将CMake加入环境变量

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

安装完成之后我们在 msys2 中是找不到 cmake 命令的,这里我们把 windows path 添加到 msys2 中。在 windows 环境变量中新建一个名为 MSYS2_PATH_TYPE 的环境变量,值改为 inherit,然后重启msys2就可以在msys2中使用安装的cmake了。

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

4. 下载x264,x265

  4.1 x264源码下载

  下载地址:x264

  4.2 x265源码下载(直接git):

  下载地址:

git clone https://bitbucket.org/multicoreware/x265_git.git

二. 开始编译

1. 编译x264

(1)把下载的x264源码包解压到msys64的home目录下,即 c/msys64/home/xxx (这里的xxx是用户名)

(2)进入x264源码目录中新建脚本 build-x264.sh ,脚本内容如下:

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)

echo ${basepath}
cd ${basepath}

pwd
./configure --prefix=${basepath}/x264_install --enable-static --enable-shared \
--extra-ldflags=-Wl,--output-def=libx264.def
make -j8
make install

在msys2中执行脚本文件:

sh build-x264.sh

等待编译完成后,在x264_install下会生成动态库,头文件和静态库

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

bin 中存放的是动态库

include 中存放的是头文件

lib 中存放的是静态库,给后面 FFmpeg 链接使用

假如我们需要使用动态库的话,还缺少一个 .lib 文件

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

.lib 文件可以由 .dll 直接生成,也可以由 .def 生成,这里我们可以用 .def 文件生成,在x264源码目录下有生成 libx264.def 文件

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

把 libx264.def 拷贝到和 libx264-164.dll 同一级目录下

然后打开VS命令行工具:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

进入 VC\Tools\MSVC\14.29.30133(这里根据实际情况来,按tab可自动填充)\bin\Hostx64\x64

执行命令:

lib.exe /out:输出.lib的路径加文件名 /machine:x64 /def:输入def文件的路径和文件名

如:

lib.exe /out:C:\msys64\home\Administrator\x264-master\x264_install\bin\libx264-164.lib /machine:x64 /def:C:\msys64\home\Administrator\x264-master\x264_install\bin\libx264.def

执行成功后,如下图所示:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

执行完成后在 x264_install/bin 目录中就会生成 .lib 文件

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

2. 编译x265

 (1)在msys中进入 x265_git/build/msys 下,执行下面命令生成 makefile:

cd x265_git/build/msys

sh make-Makefiles.sh

在弹出的窗口中先修改安装路径,然后点击configure,再点 generate 生成 makefile,最后关闭窗口

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(2)开始编译

make -j8

(3)安装

make install

编译和安装完成后,在 x265_git/x265_install/bin 目录中就可以看到生成的文件了

 ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

3. 编译FFmpeg

(1)把下载好的FFmpeg源码包解压到msys2中的 home/xxx 目录下

(2)进入FFmpeg源码包,新建脚本 build-ffmpeg.sh ,脚本内容如下:

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)

echo ${basepath}
cd ${basepath}

#添加x264 x265的pkg路径
x264_pkg_path=/home/Administrator/x264-master/x264_install/lib/pkgconfig
x265_pkg_path=/home/Administrator/x265_git/x265_install/lib/pkgconfig
export PKG_CONFIG_PATH=$x264_pkg_path:$x265_pkg_path:$PKG_CONFIG_PATH

./configure --prefix=${basepath}/ffmpeg_5.1.3_install --disable-static --enable-shared \
--enable-libx264 --enable-libx265 --enable-gpl
make -j8
make install

(3)然后在msys2中进入 FFmpeg 源码包目录下执行脚本:

sh build-ffmpeg.sh

等待编译完成后,就可以在 ffmpeg_5.1.3_install 中看到生成了以下目录:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

三. 功能验证

1. x264验证

进入 x264-master/x264_install/bin 目录下,执行下面命令,如果能够输出版本信息,说明正常

./x264.exe --version

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

2. x265验证

进入 x265_git/x265_install/bin 目录下,执行下面命令,如果能够得到版本信息,说明正常

./x265.exe --version

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

3. FFmpeg验证

(1)需要把x264和x265生成的动态库bin目录中的文件全部拷贝到 FFmpeg 生成目录的bin中。(和ffmpeg.exe同一级目录,因为编译好的 FFmpeg 依赖于它们的 dll 库)

(2)msys2中进入 ffmpeg_5.1.3_install/bin 目录下,执行以下命令,如果能够输出版本信息,则说明正常

./ffmpeg.exe -version

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

四. FFmpeg支持 Intel,Nvidia,AMD 硬件加速

1. 支持Intel QSV硬件加速

(1)首先从 github 上下载 mfx_dispatch,通过这个生成 libmfx

mfx_dispatch 下载网址: mfx_dispatch

(2)进入下载好的 mfx_dispatch源码包中,用Notepad++打开Makefile.am文件,将下面四个 *.a 改为 *.la

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

修改完后记得保存并关闭 Makefile.am 文件

(3)打开msys, 执行以下命令

cd mfx_dispatch

pacman -S automake

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

然后再 autoupdate

autoupdate

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

这样就可以下载autoreconf 了

autoreconf --install

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

然后再执行下面的命令安装一些包:

pacman -S perl
pacman -S libtool
pacman -S pkg-config

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

接下来重命名 /usr/bin/link.exe , 避免冲突

cd /usr/bin
mv link.exe link.bak

如果提示如下信息,则不用理会,继续执行后面的操作

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

which cl link yasm cpp

执行上面命令后如果没有找到cl,link,则代表是VS

然后重新进入 mfx_dispatch 目录

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

执行以下命令生成 libmfx ,--prefix 是指定 libmfx 生成在哪个目录,--host 是指定用什么编译器

autoreconf -i
./configure --prefix=/c/msys64/home/Administrator/libmfx --host=x86_64-w64-mingw32
make -j
make install

PS:如果要编译32位的FFmpeg,则应该修改 --host 的值

--host=i686-w64-mingw32

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

安装完毕后,你就能看到生成的 libmfx 目录了

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(4)接下来我们进入 FFmpeg 目录,将 build-ffmpeg.sh 脚本文件修改为支持 libmfx

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

然后在msys中进入 FFmpeg 源码包下执行脚本文件 build-ffmpeg.sh

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

等待编译完成后,我们在msys中进入 ffmpeg_5.1.3_install/bin 目录,执行以下命令就可以看到FFmpeg已经支持 Intel QSV 硬件加速了

./ffmpeg.exe -hwaccels

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

2. 支持 Nvidia nvenc,cuda,cuvid 硬件加速

(1)集成Nvidia硬件加速需要先下载 nv-codec-headers 和 CUDA Toolkit

        nv-codec-headers 历史版本下载地址:https://github.com/FFmpeg/nv-codec-headers/releases

        CUDA Toolkit 历史版本下载地址:CUDA Toolkit Archive | NVIDIA Developer

        本文选择的 nv-codec-headers 版本是:9.1.23.3

        本文选择的 CUDA Toolkit 版本是:10.1-update2

(2)下载完CUDA Toolkit后进行安装,安装选项选择自定义

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

安装完毕后,在CMD窗口输入 nvcc -V 显示如下信息则表示安装成功

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(3)安装完成后,在 c/msys64/usr/local/include 下新建一个目录 nv_sdk_10.1 用来存放头文件。

把 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include 下面所有的头文件复制到 nv_sdk_10.1 目录

如下:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

把 ​​ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64​​  里面所有的 lib 库全部复制到  c/msys64/​​usr/local/lib/x64 下

如下:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(4)下载好 nv-codec-headers 后,我们在msys中进入 nv-codec-headers ,执行命令

make && make install

如图所示:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

执行完上述命令后,我们在 c/msys64/usr/local/include 中可以看到生成的 ffnvcodec 文件夹

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(5)接下来我们修改 build-ffmpeg.sh 脚本文件,添加支持 nvenc,cuda和cuvid 的配置

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

修改完成后,我们在msys中进入 FFmpeg 源码目录,执行脚本文件

 ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

等待编译完成后,我们进入 ffmpeg_5.1.3_install/bin 目录下,执行命令

./ffmpeg.exe -hwaccels

可以看到 FFmpeg 已经支持 Nvidia 的硬件加速了

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

3. AMD amf 硬件加速支持

(1)AMF声明文件下载:AMF

下载完成后,在 c/msys64/usr/local/include 目录下新建 AMF文件夹,将下载文件的 AMF/amf/public/include 下的两个文件夹复制到刚才新建的AMF文件夹中,如图所示:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(2)接下来修改 build-ffmpeg.sh 脚本文件,添加支持 amf

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

修改完成后,在msys中进入 FFmpeg 源码目录,执行脚本

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(3)等待编译完成后,可以看到 FFmpeg 已经支持 AMD 的 amf 硬件加速了

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

4. 完整的 build-ffmpeg.sh 脚本文件代码

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}
cd ${basepath}
 
#添加x264 x265的pkg路径
x264_pkg_path=/home/Administrator/x264-master/x264_install/lib/pkgconfig
x265_pkg_path=/home/Administrator/x265_git/x265_install/lib/pkgconfig
mfx_pkg_path=/home/Administrator/libmfx/lib/pkgconfig
ffnvcodec_pkg_path=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH=$x264_pkg_path:$x265_pkg_path:$mfx_pkg_path:$ffnvcodec_pkg_path:$PKG_CONFIG_PATH

#Intel
#Nvidia
#AMD  
./configure --prefix=${basepath}/ffmpeg_5.1.3_install --disable-static --enable-shared \
--enable-libx264 --enable-libx265 --enable-gpl \
--enable-libmfx --enable-encoder=h264_qsv --enable-decoder=h264_qsv \
--enable-nonfree --enable-ffnvcodec --enable-libnpp --arch=x86_64 --enable-postproc --enable-nvenc --enable-cuda --enable-cuvid --enable-encoder=h264_nvenc --enable-decoder=h264_cuvid \
--enable-amf \
--extra-cflags=-I/c/msys64/home/Administrator/libmfx/include --extra-ldflags=-L/c/msys64/home/Administrator/libmfx/lib \
--extra-cflags=-I/usr/local/include/ffnvcodec \
--extra-cflags=-I/usr/local/include/nv_sdk_10.1 --extra-ldflags=-L/usr/local/lib/x64 \
--extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
make -j8
make install

五. 硬件加速功能测试

1. Intel QSV 硬件加速编解码测试

(1)准备一个命名为 input.mp4 的视频放到 ffmpeg_5.1.3_install/bin 目录下,如图:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

(2)在msys中进入 ffmpeg_5.1.3_install/bin 目录下运行以下命令,可以看到在同目录下生成了相应的名为 h264_qsv_output.mp4 的视频

./ffmpeg.exe -i input.mp4 -b:v 2000k -c:v h264_qsv -c:a copy h264_qsv_output.mp4

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

若视频能正常打开,则说明Intel QSV硬件加速编解码成功

2. Nvidia 硬件加速测试

同理,运行以下命令,若生成的视频能正常打开,则说明编解码成功

./ffmpeg.exe -i input.mp4 -b:v 2000k -c:v h264_nvenc -c:a copy h264_nvenc_output.mp4

3. AMD 硬件加速测试

同理,运行以下命令,若生成的视频能正常打开,则说明编解码成功

./ffmpeg.exe -i input.mp4 -b:v 2000k -c:v h264_amf -c:a copy h264_amf_output.mp4

PS:特别注意!!!以上命令需要在各自硬件支持或驱动支持的情况下才能正常生成视频!

六. 可能存在的问题

1. 可能缺少某些依赖库

我们编译好的 FFmpeg 可能依赖某些dll库,如果我们打包的时候没有把这些dll库放到 ffmpeg_5.1.3_install/bin 目录下,在其他环境下运行 ffmpeg.exe 时可能会报类似于下面的错误:

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

一种解决办法是可以在FFmpeg源码的 configure 文件中看哪些库可以在脚本文件中disable,不过有三个基本的库是在 configure 里没有禁掉选项的,这时我们就需要把这几个库复制到ffmpeg_5.1.3_install/bin 目录下。

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

这几个dll库都可以在 C:\msys64\mingw64\bin 里面找到。

2. 如何查看我们编译好的 FFmpeg 依赖哪些库?

编译好的FFmpeg有两个最重要的dll库, avcodec-59.dll 和 avutil-57.dll  而这两个库可以在 dumpbin 里面查看它们依赖哪些库。

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

我们可以在VS命令行工具里面运行以下 dumpbin 命令查看依赖库

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

先 cd C:\msys64\home\Administrator\ffmpeg-5.1.3\ffmpeg_5.1.3_install\bin

然后执行以下命令:

dumpbin -imports avcodec-59.dll

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

查看avcodec-59.dll 依赖于哪些库后, 再查看一下 avutil-57.dll 依赖哪些库。把除了系统库之外一些能找到的 dll 库放到 ffmpeg_5.1.3_install/bin 中即可。

3. Nvidia 部分依赖库 libnpp 支持

如果我们编译脚本时,加入了 --enable-libnpp 选项,则可能还需要 libnpp 这几个库

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

而上面的这几个库在 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin 下,我们把它们复制到 ffmpeg_5.1.3_install\bin 中就好了

ffmpeg win64,音视频FFmpeg编解码,ffmpeg,windows,视频编解码,h.264,h.265,音视频

总结就是,缺少哪些库,我们就把这些库放到 ffmpeg_5.1.3_install/bin 目录下,或者看看能不能直接在编译的时候就 disable

4. Error: operand type mismatch for `shr'

      在使用 13.2.0 或以上版本的gcc编译 FFmpeg 时可能会出现这个问题,这是汇编代码中存在类型不匹配的错误导致的,如下:

C:\msys64\tmp\ccUxvBjQ.s: Assembler messages:
C:\msys64\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:470: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:645: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:713: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:781: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:866: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:951: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:1036: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:1133: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:1405: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:1514: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:1638: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:1797: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:2137: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:2242: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:2368: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:2553: Error: operand type mismatch for `shr'
C:\msys64\tmp\ccUxvBjQ.s:2703: Error: operand type mismatch for `shr'
make: *** [ffbuild/common.mak:60: libavformat/adtsenc.o] Error 1
make 编译过程中的出现上面错误

我这里之前使用13.1.0 版本的gcc时没有这个问题,更新到13.2.0后编译就报这个错误了,但是msys2的gcc版本又不能回退,所以我们现在编译FFmpeg时需要修改FFmpeg的源码:

首先,找到FFmpeg源码中的mathops.h文件,具体路径如下:

我这里是在  ffmpeg-5.0.3/libavcodec/x86/mathops.h

然后修改mathops.h中以下几个函数的定义(将 ci 改为 c):

#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{
    int rt, dummy;
    __asm__ (
        "imull %3               \n\t"
        "shrdl %4, %%edx, %%eax \n\t"
        :"=a"(rt), "=d"(dummy)
        //:"a"(a), "rm"(b), "ci"((uint8_t)shift)
        :"a"(a), "rm"(b), "c"((uint8_t)shift)
    );
    return rt;
}
#define NEG_SSR32 NEG_SSR32
static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
    __asm__ ("sarl %1, %0\n\t"
         : "+r" (a)
         //: "ci" ((uint8_t)(-s))
         : "c" ((uint8_t)(-s))
    );
    return a;
}
#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
    __asm__ ("shrl %1, %0\n\t"
         : "+r" (a)
         //: "ci" ((uint8_t)(-s))
         : "c" ((uint8_t)(-s))
    );
    return a;
}

修改完成后保存并关闭文件,然后重新编译FFmpeg应该就能解决上述问题了

参考博客链接

1. ffmpeg5.0+h264+h265 windows下编译ffmpeg-5.0.1支持x265编解码_老吕丶的博客-CSDN博客​​​​​

2. windows下编译FFMPEG开启硬件加速(INTEL,NVIDIA,AMD)selivert的博客-CSDN博客

3. FFmpeg引入NVIDIA硬件编解码扩展_mb628cd5266c9eb的技术博客_51CTO博客

4. 音视频开源基础学习 – 编译ffmpeg(音视频开发进阶) | 半码博客

5. ffmpeg编译 Error: operand type mismatch for `shr‘文章来源地址https://www.toymoban.com/news/detail-667459.html

到了这里,关于FFmpeg在 Windows 环境编译(64位)支持h264,h265,和Intel QSV,Nvidia Cuda,AMD amf 硬件加速的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中使用EasyPlayer播放监控视频HLS,H265、H264

    1.使用npm下载依赖 2.将EasyPlayer-lib.min.js文件、EasyPlayer.wasm文件、libDecoder.wasm文件放置到public下 3.创建components,html代码如下 4.使用props接收数据 5.在父组件中引入,传递props中的数据即可运行即可

    2024年02月03日
    浏览(46)
  • wireshark提取视频数据之RTP包中提取H264和H265

    在流媒体相关问题分析时,抓包分析是非常重要的手段,比如播放有码流无图像、流媒体协议对接问题、码流花屏卡顿等问题,很多问题都可以通过抓包然后分析包数据来定位出问题,抓包最常用的工具是wireshark,其能从数据链路层、IP层、传输层、应用层等各层进行分析,

    2024年02月02日
    浏览(55)
  • ffmpeg支持libx264和libx265的安装方法

    使用如下命令推流时: 如果出现错误:Unknown encoder ‘libx264’,提示缺少libx264库,需要安装该库。 缺少libx265库,需要安装该库: 需要重新编译安装ffmpeg 配置ffmpeg时,加上x264,如: 此时,输入ffmpeg时,可能会出现错误: 修改ld.so.conf文件 修改如下 使之生效 为 FFmpeg 加入环

    2023年04月26日
    浏览(42)
  • Linux Qt5.15.2 编译QWebEngine源码支持音视频H264

    默认自带的QWebEngine 因版权问题不支持音视频功能,需要自己编译源码以支持。 平台:Linux(UOS V20 1050) Qt:5.15.2 下载 Qt 5.15.2 对应版本源码,使用镜像网站或者Qt Maintenance Tool工具下载。 配置 Qt 环境变量 将以下内容追加到bashrc文件后 刷新使其生效 这个阶段可以预先安装所

    2024年02月05日
    浏览(64)
  • 如何在armv6 armv7 armv8(aarch64)嵌入式板子上面安装nginx服务器,支持H265码流

    为什么要在板子瑞芯微rv1126核心板上面安装nginx服务器,是因为我的项目需要用到拉到连接在板子上面的摄像头,由于是摄像头是直连摄像头的只能通过板子上面的wifi热点设备,先连接这个热点才能获取到这个网络摄像头,那么就需要板子做一个推流的服务器让摄像头的画面

    2024年02月15日
    浏览(51)
  • 支持 flv+h265 的ffmpeg编译安装

    ffmpeg 官方分支没有支持flv+h265,国内金山云发了补丁版本,地址: 1. h264 2. h265 更多操作可参考:https://blog.csdn.net/xundh/article/details/100760114 3. 编译ffmpeg 如果不成功,可以尝试在最后添加: --pkg-config=\\\"pkg-config --static\\\" 4. 截屏命令示例 1. x264_bit_depth 未定义 原因:应该是x264的x26

    2023年04月12日
    浏览(46)
  • 解决FFmpeg播放RTSP推送的H265码流报错问题

    RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个 应用层 协议。 RTP(Real-time Transport Protocol)实时传输协议,是一个网络传输协议,它位于 传输层 ,但通常运行在UDP协议之上。 去年我写过两篇关于使用RTSP推送H265码流并拉流显示的文章。实现HEVC码流R

    2024年02月15日
    浏览(47)
  • 【FFmpeg学习】H264 视频码流分析

    NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。 VCL层:(Video Coding L

    2024年02月02日
    浏览(45)
  • FFmpeg解码H264视频裸流(直接可用)

    1、写在前面 此文章主要包含解码H264视频流数据,主要有以下几点: 1、H264视频帧为Annex B格式,若使用AVCC格式可自行研究; 2、H264视频裸流,非解码视频文件(若有需要我后期可添加这部分代码); 3、支持输出RGB24或YUV420格式,其他可自行修改; 4、FFmpeg官网代码迭代及接口变

    2024年04月25日
    浏览(43)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包