FFmpeg开发笔记(六十一)Linux给FFmpeg集成H.266编码器vvenc
<span data-cke-copybin-start="1"><span data-cke-copybin-start="1"></span></span>《FFmpeg开发实战:从零基础到短视频上线》该书的第一章介绍了如何在Linux环境给FFmpeg集成H.264和H.265的编码器,如今H.266的编码器vvenc也日渐成熟,从7.1版本开始的最新FFmpeg源码已经支持H.266的编码器vvenc。<p> H.266是H.265的升级版本,H.265的视频编码标准为HEVC(High Efficiency Video Coding,高效视频编码),H.266的视频编码标准为VVC(Versatile Video Coding,多功能视频编码)。其中VVC是HEVC的后继者,目标是在相同视觉质量下将比特率降低50%。<br>
至于VVEnc(Versatile Video Encoder)是一个开源的高效视频编码器,它实现了最新的视频编码标准VVC,能够把视频数据按照H.266标准编码为VVC格式。VVEnc的源码托管地址为https://github.com/fraunhoferhhi/vvenc,国内的镜像地址为https://gitee.com/mirrors/vvenc。<br>
接下来以华为的欧拉系统为例,介绍如何在Linux环境给FFmpeg集成H.266的编码器vvenc,具体的操作步骤说明如下:</p>
<h1>一、编译安装VVEnc</h1>
<p>先下载最新的vvenc源码,再把vvenc源码包上传到Linux服务器的/usr/local/src目录下。接着登录Linux服务器的控制台,执行下面命令解压源码包:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="10" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22cd%20%2Fusr%2Flocal%2Fsrc%5Cnunzip%20vvenc-v1.13.1.zip%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">cd /usr/local/src
unzip vvenc-v1.13.1.zip</code></pre>
</div>
<p>然后执行下面命令配置vvenc的编译环境:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="9" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22cd%20vvenc-v1.13.1%5Cnmkdir%20build%5Cncd%20build%5Cncmake%20-DBUILD_SHARED_LIBS%3D1%20--install-prefix%3D%2Fusr%2Flocal%20..%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">cd vvenc-v1.13.1
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=1 --install-prefix=/usr/local ..</code></pre>
</div>
<p>如果看到cmake命令返回类似下面的“Configuring done”和“Generating done”字样,就表示配置好了vvenc的编译环境:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="8" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22--%20VVENC_ENABLE_THIRDPARTY_JSON%3A%20ON%5Cn--%20Performing%20Test%20SUPPORTED_mxsave%5Cn--%20Performing%20Test%20SUPPORTED_mxsave%20-%20Success%5Cn--%20Performing%20Test%20SUPPORTED_msse4_2%5Cn--%20Performing%20Test%20SUPPORTED_msse4_2%20-%20Success%5Cn--%20Performing%20Test%20SUPPORTED_mavx2%5Cn--%20Performing%20Test%20SUPPORTED_mavx2%20-%20Success%5Cn--%20Configuring%20done%5Cn--%20Generating%20done%5Cn--%20Build%20files%20have%20been%20written%20to%3A%20%2Fusr%2Flocal%2Fsrc%2Fvvenc-v1.13.1%2Fbuild%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">-- VVENC_ENABLE_THIRDPARTY_JSON: ON
-- Performing Test SUPPORTED_mxsave
-- Performing Test SUPPORTED_mxsave - Success
-- Performing Test SUPPORTED_msse4_2
-- Performing Test SUPPORTED_msse4_2 - Success
-- Performing Test SUPPORTED_mavx2
-- Performing Test SUPPORTED_mavx2 - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/src/vvenc-v1.13.1/build</code></pre>
</div>
<p>于是执行下面命令编译和安装vvenc,编译完成的vvenc库将会安装到cmake指定的/usr/local目录。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="7" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22make%5Cnmake%20install%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">make
make install</code></pre>
</div>
<h1>二、编译安装FFmpeg</h1>
<p>先下载最新的FFmpeg源码(版本号需大于等于7.1),再把FFmpeg源码包上传到Linux服务器的/usr/local/src目录下。接着登录Linux服务器的控制台,执行下面命令解压源码包:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="6" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22cd%20%2Fusr%2Flocal%2Fsrc%5Cnunzip%20ffmpeg-n7.1.1.zip%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">cd /usr/local/src
unzip ffmpeg-n7.1.1.zip</code></pre>
</div>
<p>确保Linux环境已经按照《FFmpeg开发实战:从零基础到短视频上线》该书第一章的“1.2 Linux系统安装FFmpeg”安装了H.264的编码器libx264和H.265的编码器libx265,然后执行下面命令配置FFmpeg的编译环境:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="5" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22cd%20ffmpeg-n7.1.1%5Cnexport%20LD_LIBRARY_PATH%3D%2Fusr%2Flocal%2Flib64%3A%24LD_LIBRARY_PATH%5Cnexport%20PKG_CONFIG_PATH%3D%2Fusr%2Flocal%2Flib64%2Fpkgconfig%3A%24PKG_CONFIG_PATH%5Cn.%2Fconfigure%20--prefix%3D%2Fusr%2Flocal%2Fffmpeg%20--enable-shared%20--disable-static%20--disable-doc%20--enable-zlib%20--enable-libx264%20--enable-libx265%20--enable-libvvenc%20--enable-iconv%20--enable-gpl%20--enable-nonfree%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">cd ffmpeg-n7.1.1
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-libvvenc --enable-iconv --enable-gpl --enable-nonfree</code></pre>
</div>
<p>配置完毕执行下面命令编译和安装FFmpeg,编译完成的ffmpeg库将会安装到configure指定的/usr/local/ffmpeg目录。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="4" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22make%5Cnmake%20install%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">make
make install</code></pre>
</div>
<h1>三、查看FFmpeg的安装结果</h1>
<p>运行下面命令查看FFmpeg的安装版本:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="3" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22ffmpeg%20-version%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">ffmpeg -version</code></pre>
</div>
<p>上面命令返回的FFmpeg版本信息如下:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="2" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22ffmpeg%20version%207.1.1%20Copyright%20(c)%202000-2025%20the%20FFmpeg%20developers%5Cnbuilt%20with%20gcc%2010.3.1%20(GCC)%5Cnconfiguration%3A%20--prefix%3D%2Fusr%2Flocal%2Fffmpeg%20--enable-shared%20--disable-static%20--disable-doc%20--enable-zlib%20--enable-libx264%20--enable-libx265%20--enable-libvvenc%20--enable-iconv%20--enable-gpl%20--enable-nonfree%5Cnlibavutil%20%C2%A0%20%C2%A0%20%C2%A059.%2039.100%20%2F%2059.%2039.100%5Cnlibavcodec%20%C2%A0%20%C2%A0%2061.%2019.101%20%2F%2061.%2019.101%5Cnlibavformat%20%C2%A0%20%C2%A061.%20%C2%A07.100%20%2F%2061.%20%C2%A07.100%5Cnlibavdevice%20%C2%A0%20%C2%A061.%20%C2%A03.100%20%2F%2061.%20%C2%A03.100%5Cnlibavfilter%20%C2%A0%20%C2%A010.%20%C2%A04.100%20%2F%2010.%20%C2%A04.100%5Cnlibswscale%20%C2%A0%20%C2%A0%20%C2%A08.%20%C2%A03.100%20%2F%20%C2%A08.%20%C2%A03.100%5Cnlibswresample%20%C2%A0%205.%20%C2%A03.100%20%2F%20%C2%A05.%20%C2%A03.100%5Cnlibpostproc%20%C2%A0%20%C2%A058.%20%C2%A03.100%20%2F%2058.%20%C2%A03.100%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 10.3.1 (GCC)
configuration: --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-libvvenc --enable-iconv --enable-gpl --enable-nonfree
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</code></pre>
</div>
<p>根据以上返回的版本信息,可知已安装的FFmpeg版本号为7.1.1,同时configuration这行找到“--enable-libvvenc”,说明FFmpeg已经启用了H.266的编码器libvvenc。</p>
<p>更多详细的FFmpeg开发知识参见<span class="cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_selected" data-cke-display-name="a" data-cke-filter="off" data-cke-widget-id="1" data-cke-widget-wrapper="1">《FFmpeg开发实战:从零基础到短视频上线》一书。</span></p><br><br>
来源:https://www.cnblogs.com/aqi00/p/18895292
頁:
[1]