汕头企业自助建站系统,小视频制作软件,wordpress文字中间,微营销推广前言
在Android音视频开发中#xff0c;网上知识点过于零碎#xff0c;自学起来难度非常大#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》#xff0c;结合我自己的工作学习经历#xff0c;我准备写一个音视频系列blog。本文是音视频系…前言
在Android音视频开发中网上知识点过于零碎自学起来难度非常大不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》结合我自己的工作学习经历我准备写一个音视频系列blog。本文是音视频系列blog的其中一个 对应的要学习的内容是FFmpeg4.3.1h264在windows下如何编译以及编译之后的内容如何在VS2017项目集成还有Ubuntu编译FFmpeg与macOS编译FFmpeg。 音视频系列blog
音视频系列blog: 点击此处跳转查看. 目录 1.1 FFmpeg编译
macOS、Ubuntu、window下都可以编译ffmpegmacOS、Ubuntu这两种环境编译ffmpeg相对来说比较简单window环境下编译ffmpeg可以说是一步一个坑这篇文章具体讲一下ffmpeg4.3.1 h264在windows下编译方法以及编译后的代码如何集成到VS2017项目中。当然了如果你不想编译我已经把编译过的内容放到了源代码中源代码链接在最后可以直接使用。 1.2 ffmpeg4.3.1h264在windows下编译
1.2.1 安装MSYS2
MSYS2Minimal SYStem 2是一个软件环境它提供了类似于Linux的工具和库可以在Windows操作系统上进行开发和编译。它主要用于在Windows上进行类Unix开发环境的搭建使开发者能够在Windows上使用像GCC、make、bash等工具以便更方便地进行跨平台开发。
要在Windows上安装MSYS2可以按照以下步骤进行 下载安装器访问MSYS2官方网站https://www.msys2.org/并下载最新版本的安装器。通常有32位和64位版本可供选择。 运行安装器双击下载的安装器文件按照提示进行安装。安装程序会询问你有关安装路径、启动菜单等选项。 安装所需工具要安装特定的开发工具可以使用以下命令。例如要安装编译程序 pacman -S make gcc diffutils pkg-config可能需要多尝试几次安装过程时间有点长如果不安装 pkg-config运行./configure 的时候会出现如下 warning。 找到安装路径比如D:\msys2找到msys2_shell.cmd这个文件做以下修改 rem set MSYS2_PATH_TYPEinherit
改为
set MSYS2_PATH_TYPEinherit找到安装路径比如D:\msys2\usr\bin找到link.exe这个文件将这个文件改名为link.exe.bak.2023。 配置mingw64的环境变量找到安装路径比如D:\msys2\mingw64\bin)添加windows环境变量。 1.2.2 下载YASM
下载地址http://yasm.tortall.net/Download.html找到Win64 .exe点击下载。
下载后将 yasm-1.3.0-win64.exe 改名为 yasm.exe并放置于D:\msys2\usr\bin这是我的安装路径找到你自己的MSYS2安装路径下面涉及到路径使用你自己的路径我就不再提示目录中。 1.2.3 下载FFmpeg源码
下载 ffmpeg 代码版本FFmpeg 4.3.1 http://www.ffmpeg.org/releases/ffmpeg-4.3.1.tar.gz
下载之后解压到D:\ffmpeg-4.3.1\下面会用到。 1.2.4 更新msys64并改用国内镜像
进入D:\msys2\etc\pacman.d\这个文件夹中修改3个文件的镜像
mirrorlist.mingw32将下面内容添加到mirrorlist.mingw32的最上面然后保存。
Server http://mirrors.ustc.edu.cn/msys2/mingw/i686/
Server http://repo.msys2.org/mingw/i686
Server http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/i686
Server http://www2.futureware.at/~nickoe/msys2-mirror/i686/
mirrorlist.mingw64将下面内容添加到mirrorlist.mingw64的最上面然后保存。
Server http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
Server http://repo.msys2.org/mingw/x86_64
Server http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/x86_64
Server http://www2.futureware.at/~nickoe/msys2-mirror/x86_64/
mirrorlist.msys将下面内容添加到mirrorlist.msys的最上面然后保存。
Server http://mirrors.ustc.edu.cn/msys2/msys/$arch/
Server http://repo.msys2.org/msys/$arch
Server http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/$arch
Server http://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/在安装路径中找到mingw64.exe以管理员身份运行使用下面的命令行更新 mingw-w64-x86_64-toolchain 工具链如果没有上面修改上面3个文件的镜像那么这个更新将非常慢。
pacman -S mingw-w64-x86_64-toolchain1.2.5 编译x264
x264下载地址http://download.videolan.org/pub/videolan/x264/snapshots/
我下载的是这个版本x264-snapshot-20170208-2245-stable.tar.bz2
将下载的压缩包放到一个文件夹D:\x264然后解压。
找到mingw64.exe以管理员身份运行将目录切换到x264解压文件夹中
cd /d/x264/x264-snapshot-20170208-2245-stable/使用以下命令行编译x26432位
./configure --prefix/usr/local/x264 --hosti686-w64-mingw32 --enable-shared --disable-thread --disable-avs --extra-ldflags-Wl,--output-deflibx264.def这个过程比较慢请耐心等待
make -j4make install当编译成功后D:\msys2\usr\local\这个目录下就会出现x264文件夹这个文件夹中有3个文件夹binincludelib证明你编译x264成功。 1.2.6 编译ffmpeg4.3.1集成x264
找到mingw64.exe以管理员身份运行将目录切换到D:\ffmpeg-4.3.1\中ffmpeg源代码目录
cd /d/ffmpeg-4.3.1/使用以下命令行编译ffmpeg4.3.1集成x264
./configure --enable-yasm --enable-asm --enable-shared --disable-static --prefix/usr/local/ffmpeg431 --enable-libx264 --enable-gpl --extra-cflags-I/usr/local/x264/include --extra-ldflags-L/usr/local/x264/lib这个过程更慢请耐心等待
make -j4这个过程也慢请耐心等待
make install当编译成功后D:\msys2\usr\local\这个目录下就会出现ffmpeg431文件夹这个文件夹中有4个文件夹binincludelibshare,证明你编译ffmpeg4.3.1集成x264成功。 1.3 Ubuntu编译FFmpeg
以下是在Ubuntu上编译FFmpeg的一般步骤 安装依赖项 打开终端并运行以下命令来安装编译FFmpeg所需的依赖项 sudo apt update
sudo apt install build-essential yasm nasm cmake libx264-dev libx265-dev libnuma-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libass-dev获取FFmpeg源代码 可以从FFmpeg官方网站下载源代码或者通过使用Git进行克隆。以下是使用Git克隆FFmpeg源代码的示例 git clone https://git.ffmpeg.org/ffmpeg.git配置和编译 进入FFmpeg源代码目录并进行配置和编译。可以根据自己的需求启用或禁用不同的组件和库。 cd ffmpeg
./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libass
make -j$(nproc)这里使用的configure命令启用了一些常用的库。您可以根据需要自行修改。 安装 安装编译完成的FFmpeg sudo make install验证安装 运行以下命令来验证FFmpeg是否已成功安装 ffmpeg -version1.4 macOS编译FFmpeg
以下是在macOS上编译FFmpeg的一般步骤 安装依赖项 打开终端并安装一些必要的依赖项可以使用Homebrew来简化这个过程。如果尚未安装Homebrew请打开终端并运行以下命令 /bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)然后安装编译FFmpeg所需的依赖项 brew install nasm yasm x264 x265 libvpx lame opus libass获取FFmpeg源代码 可以从FFmpeg官方网站下载源代码或者通过使用Git进行克隆。以下是使用Git克隆FFmpeg源代码的示例 git clone https://git.ffmpeg.org/ffmpeg.git配置和编译 进入FFmpeg源代码目录并进行配置和编译。可以根据需要启用或禁用不同的组件和库。 cd ffmpeg
./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libmp3lame --enable-libopus --enable-libass
make -j$(sysctl -n hw.ncpu)安装 安装编译完成的FFmpeg sudo make install验证安装 运行以下命令来验证FFmpeg是否已成功安装 ffmpeg -version1.5 创建VS2017项目集成编译的FFmpeg代码
在1.2中已经成功编译ffmpeg4.3.1集成x264得到了一个ffmpeg431文件夹在以后的项目中我们就会使用该文件夹的内容进行相关开发我就对ffmpeg431文件夹进一步整理简化。如果你不想编译ffmpeg源代码可以直接使用我的编译之后的简化版ffmpeg431dev。
ffmpeg编译简化版ffmpeg431dev
VS2017项目中引用ffmpeg开发库一共分3步
1dll运行时库
2头文件
3库文件 1.5.1 创建VS2017项目添加dll运行时库
打开VS2017创建项目HelloFFmpeg将ffmpeg431dev直接放到HelloFFmpeg项目中点击运行HelloFFmpeg项目出现Debug文件夹。
将ffmpeg431dev的dll文件夹中的8个dll文件复制到Debug文件夹中。 1.5.2 添加头文件库文件
设置包含目录和库目录
右键单击项目选择 “属性”。在 “VC 目录” - “包含目录” 中添加FFmpeg头文件的路径比如 ../ffmpeg431dev/include。在 “VC 目录” - “库目录” 中添加FFmpeg库文件的路径比如 ../ffmpeg431dev/lib。 添加链接器依赖项
在 “链接器” - “输入” - “附加依赖项” 中添加FFmpeg库文件名如 avformat.lib, avcodec.lib, avutil.lib 等项目中需要什么lib就添加什么。 1.5.3 编写代码 引入头文件 #include iostream
#include string
extern C
{#include libavformat/avformat.h
}这些是引入所需的C标准库和FFmpeg库的头文件。 初始化网络模块 avformat_network_init();这一行代码初始化了FFmpeg的网络模块以便在需要时能够处理网络资源。 打开视频文件 AVFormatContext* formatContext nullptr;
if (avformat_open_input(formatContext, D:/input.mp4, nullptr, nullptr) ! 0)
{std::cerr Error opening input file std::endl;return 1;
}这段代码尝试打开指定的视频文件。 查找流信息 if (avformat_find_stream_info(formatContext, nullptr) 0)
{std::cerr Error finding stream information std::endl;avformat_close_input(formatContext);return 1;
}这部分代码查找并获取视频文件的流信息。 查找视频流索引 int videoStreamIndex -1;
for (unsigned int i 0; i formatContext-nb_streams; i)
{if (formatContext-streams[i]-codecpar-codec_type AVMEDIA_TYPE_VIDEO){videoStreamIndex i;break;}
}这个循环用于找到第一个视频流的索引。 获取视频帧的宽度和高度 AVCodecParameters* videoCodecParams formatContext-streams[videoStreamIndex]-codecpar;
int frameWidth videoCodecParams-width;
int frameHeight videoCodecParams-height;这部分代码从视频流的参数中获取帧的宽度和高度。 输出视频帧的宽度和高度 std::cout Video frame width: frameWidth std::endl;
std::cout Video frame height: frameHeight std::endl;这里将视频帧的宽度和高度信息输出到控制台。 关闭视频文件和清理资源 avformat_close_input(formatContext);最后这行代码关闭已经打开的视频文件并释放相应的资源。
运行结果 源代码欢迎star FFmpeg4.3.1h264在windows下编译与VS2017项目集成