searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

构建支持FFmpeg硬件加速的Docker容器

2023-07-03 01:46:08
212
0
 

简介

本文将介绍如何构建支持 FFmpeg 硬件加速的 Docker 容器。FFmpeg 是一个流行的多媒体框架,它可以对音频和视频进行编码和解码。在许多场景下,需要对大量的音视频数据进行处理,其中包括转码、切割、拼接等操作。这些操作往往需要消耗大量的计算资源,而硬件加速可以提高处理速度。因此,构建支持 FFmpeg 硬件加速的 Docker 容器可以大大提高音视频处理的效率。

构建支持 FFmpeg 硬件编解码的 Docker 容器的作用是创建一个容器环境,其中可以使用 FFmpeg 库来利用硬件加速进行音视频编解码操作。这对于需要处理大量音视频数据的应用和服务非常有用。

使用硬件加速可以显著提高音视频编解码的性能和效率。通常,软件编解码会占用大量的 CPU 资源,而硬件加速可以利用图形处理器(GPU)或其他专用硬件来执行这些任务,从而减轻 CPU 的负担并加快处理速度。

通过构建支持 FFmpeg 硬件编解码的 Docker 容器,您可以:

1.  提高音视频处理的性能:通过利用 GPU 或其他专用硬件的并行处理能力,可以加速音视频编解码、转码、滤镜处理等任务,从而大幅提高处理速度和吞吐量。

2.  实现跨平台和可移植性:Docker 容器提供了一种便捷的方式来封装应用程序及其所有依赖项,使其可以在不同的操作系统和硬件平台上运行,而无需手动配置和安装软件和库。

3.  简化环境配置和部署:通过使用 Docker 容器,您可以轻松地将支持 FFmpeg 硬件编解码的环境打包成镜像,并在任何支持 Docker 的主机上部署和运行。这简化了环境配置和应用程序的部署过程。

4.  提供可重复性和一致性:通过使用 Docker 容器,您可以确保应用程序和环境的一致性,使得您的应用在不同的环境中表现一致,并且可以轻松地在开发、测试和生产环境之间进行迁移。

准备工作

确认硬件支持情况

在开始构建支持 FFmpeg 硬件加速的 Docker 容器之前,需要确认以下几点硬件支持情况:

● 操作系统:Linux 系统

● 显卡型号:NVIDIA GPU

● 显卡驱动安装情况:已经安装最新的 NVIDIA 驱动

例如,可以使用以下命令确认 NVIDIA 驱动是否已经正确安装:

nvidia-smi

如果能够正确输出显卡信息,则说明驱动已经正确安装。

显卡信息示例:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
| 50%   49C    P0    34W / 170W |      0MiB /  797

确认 CUDA 版本

在开始构建支持 FFmpeg 硬件加速的 Docker 容器之前,需要确认 CUDA 版本是否支持硬件加速。如果使用的 CUDA 版本不支持硬件加速,则需要升级 CUDA 版本或使用支持硬件加速的版本。

例如,CUDA 11.2 及以上版本支持硬件加速。可以使用以下命令确认 CUDA 版本:

nvcc -V

如果能够正确输出 CUDA 版本信息,则说明 CUDA 已经正确安装。

CUDA 版本信息示例:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Build cuda_11.2.r11.2/compiler.29618528_0

镜像构建步骤

我们以宿主机cuda版本11.6为例,构建该cuda版本的包含FFmpeg的镜像。本文将介绍具体的步骤。

1. 指定基础镜像

首先,我们需要指定基础镜像为nvidia/cuda:11.6.1-cudnn8-runtime-centos7。

NVIDIA CUDA基础镜像是一个提供CUDA开发环境的Docker镜像。它是以NVIDIA官方提供的CUDA基础镜像为基础构建的,为CUDA开发人员和研究人员提供了一个方便的环境来进行GPU加速的计算和深度学习任务。

FROM nvidia/cuda:11.6.1-cudnn8-runtime-centos7

2. 更新yum包并安装所需工具

接下来,我们需要更新yum包管理器,并安装一些编译FFmpeg所需的工具。

RUN yum update -y && \
    yum install -y epel-release && \
    yum install -y autoconf automake bzip2 cmake freetype-devel gcc gcc-c++

3. 安装FFmpeg的依赖库

为了成功编译FFmpeg,我们需要安装一些依赖库。

RUN yum install -y git libtool make mercurial pkgconfig zlib-devel yasm nasm openssl-devel

4. 创建存放FFmpeg源代码和依赖库的目录

接下来,我们创建一个目录用于存放FFmpeg的源代码和依赖库。

RUN mkdir ~/ffmpeg_sources

5. 安装nasm编译器

安装NASM的作用是提供一个汇编语言编译器,用于编译和生成优化的汇编代码。NASM(Netwide Assembler)是一款广泛使用的汇编语言编译器,专门用于x86和x86-64架构的开发。NASM提供了丰富的指令集和优化选项,可以针对不同的处理器架构生成高效的机器码。这样可以提高FFmpeg在执行音视频编解码、滤镜和其他操作时的速度和效率。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar xjvf nasm-2.13.02.tar.bz2 \
    && cd nasm-2.13.02 \
    && ./autogen.sh \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" \
    && make \
    && make install

6. 安装yasm编译器

安装Yasm的作用是提供一个汇编语言编译器,用于编译和生成优化的汇编代码。Yasm(Yet Another Assembler)是一款汇编语言编译器,特别用于x86和x86-64架构的开发。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar xzvf yasm-1.3.0.tar.gz \
    && cd yasm-1.3.0 \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" \
    && make \
    && make install

7. 编译安装x264视频编码库

编译安装x264视频编码库的作用是为FFmpeg和其他多媒体应用程序提供高质量的视频编码功能。x264是一个开源的、高性能的H.264/AVC视频编码器,它能够将视频数据压缩为H.264格式,实现高效的视频压缩和高质量的图像编码。

RUN cd ~/ffmpeg_sources \
    && git clone  \
    && cd x264 \
    && PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-asm \
    && make \
    && make install

8. 编译安装x265视频编码库

接下来,我们需要编译安装x265视频编码库。x265是一个开源的视频编码器,用于将视频数据压缩为高效的HEVC(High Efficiency Video Coding)/H.265格式。它是H.265标准的一种实现,可以提供更高的视频压缩效率和更好的图像质量。

RUN cd ~/ffmpeg_sources \
    && git clone  \
    && cd ~/ffmpeg_sources/x265_git/build/linux/ \
    && cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source \
    && make \
    && make install

9. 编译安装fdk-aac音频编码库

fdk-aac是一种音频编码库,我们需要编译安装。fdk-aac提供了AAC(Advanced Audio Coding)音频编码的功能和支持。它是由Fraunhofer IIS(德国Fraunhofer研究机构的一个部门)开发的,被认为是一种优秀的AAC编码器。

RUN cd ~/ffmpeg_sources \
    && git clone --depth 1 --branch v0.1.6  \
    && cd fdk-aac \
    && autoreconf -fiv \
    && ./configure --prefix="$HOME/ffmpeg_build" --disable-shared \
    && make \
    && make install

10. 编译安装lame音频编码库

lame是一种音频编码库,用于将音频数据压缩为MP3格式。它提供了高质量的MP3音频编码功能和支持。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar xzvf lame-3.100.tar.gz \
    && cd lame-3.100 \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm \
    && make \
    && make install

11. 编译安装libvpx

libvpx是一个开源的视频编解码库,用于对视频数据进行压缩和解压缩,支持VP8和VP9视频编解码格式。它是由Google开发的,旨在提供高效的开源视频编解码实现。

RUN cd ~/ffmpeg_sources \
    && git clone --depth 1  \
    && cd libvpx \
    && ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm \
    && make \
    && make install

12. 安装NVIDIA Video Codec SDK

NVIDIA Video Codec SDK是用于硬件加速的库,它提供了NVIDIA GPU编解码器的头文件和接口,用于在编译和开发过程中与NVIDIA GPU编解码器进行交互。这个项目主要用于支持基于NVIDIA GPU的硬件加速视频编解码。

RUN cd ~/ffmpeg_sources \
    && git clone  \
    && cd nv-codec-headers \
    && make PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin" \
    && make install PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin"

13. 编译安装FFmpeg

最后,我们需要编译安装最新版的FFmpeg,并启用硬件加速。根据这些编译选项,安装的 FFmpeg 版本将包括对 libfdk_aac、libmp3lame、libvpx、libx264、libx265 等库的支持,以及其他功能和支持选项,如 CUDA、CUVID、NVENC 和 OpenSSL。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar -xzf ffmpeg-4.4.tar.gz \
    && cd ffmpeg-4.4 \
    && PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$_CONFIG_PATH" ./configure \
      --prefix="$HOME/ffmpeg_build" \
      --pkg-config-flags="--static" \
      --extra-cflags="-I$HOME/ffmpeg_build/include" \
      --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
      --extra-libs=-lpthread \
      --extra-libs=-lm \
      --bindir="$HOME/bin" \
      --enable-gpl \
      --enable-libfdk_aac \
      --enable-libmp3lame \
      --enable-libvpx \
      --enable-libx264 \
      --enable-libx265 \
      --enable-nonfree \
      --enable-cuda \
      --enable-cuvid \
      --enable-nvenc \
      --enable-openssl \
    && make \
    && make install

14. 刷新路径环境变量

最后一步是刷新路径环境变量。

RUN hash -r

RUN echo 'PATH="$HOME/bin:$PATH"' >> ~/.bashrc \
    && source ~/.bashrc

现在,我们已经成功构建了一个包含FFmpeg的镜像。

0条评论
0 / 1000
范****荣
4文章数
0粉丝数
范****荣
4 文章 | 0 粉丝
原创

构建支持FFmpeg硬件加速的Docker容器

2023-07-03 01:46:08
212
0
 

简介

本文将介绍如何构建支持 FFmpeg 硬件加速的 Docker 容器。FFmpeg 是一个流行的多媒体框架,它可以对音频和视频进行编码和解码。在许多场景下,需要对大量的音视频数据进行处理,其中包括转码、切割、拼接等操作。这些操作往往需要消耗大量的计算资源,而硬件加速可以提高处理速度。因此,构建支持 FFmpeg 硬件加速的 Docker 容器可以大大提高音视频处理的效率。

构建支持 FFmpeg 硬件编解码的 Docker 容器的作用是创建一个容器环境,其中可以使用 FFmpeg 库来利用硬件加速进行音视频编解码操作。这对于需要处理大量音视频数据的应用和服务非常有用。

使用硬件加速可以显著提高音视频编解码的性能和效率。通常,软件编解码会占用大量的 CPU 资源,而硬件加速可以利用图形处理器(GPU)或其他专用硬件来执行这些任务,从而减轻 CPU 的负担并加快处理速度。

通过构建支持 FFmpeg 硬件编解码的 Docker 容器,您可以:

1.  提高音视频处理的性能:通过利用 GPU 或其他专用硬件的并行处理能力,可以加速音视频编解码、转码、滤镜处理等任务,从而大幅提高处理速度和吞吐量。

2.  实现跨平台和可移植性:Docker 容器提供了一种便捷的方式来封装应用程序及其所有依赖项,使其可以在不同的操作系统和硬件平台上运行,而无需手动配置和安装软件和库。

3.  简化环境配置和部署:通过使用 Docker 容器,您可以轻松地将支持 FFmpeg 硬件编解码的环境打包成镜像,并在任何支持 Docker 的主机上部署和运行。这简化了环境配置和应用程序的部署过程。

4.  提供可重复性和一致性:通过使用 Docker 容器,您可以确保应用程序和环境的一致性,使得您的应用在不同的环境中表现一致,并且可以轻松地在开发、测试和生产环境之间进行迁移。

准备工作

确认硬件支持情况

在开始构建支持 FFmpeg 硬件加速的 Docker 容器之前,需要确认以下几点硬件支持情况:

● 操作系统:Linux 系统

● 显卡型号:NVIDIA GPU

● 显卡驱动安装情况:已经安装最新的 NVIDIA 驱动

例如,可以使用以下命令确认 NVIDIA 驱动是否已经正确安装:

nvidia-smi

如果能够正确输出显卡信息,则说明驱动已经正确安装。

显卡信息示例:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03    Driver Version: 460.91.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:01:00.0 Off |                  N/A |
| 50%   49C    P0    34W / 170W |      0MiB /  797

确认 CUDA 版本

在开始构建支持 FFmpeg 硬件加速的 Docker 容器之前,需要确认 CUDA 版本是否支持硬件加速。如果使用的 CUDA 版本不支持硬件加速,则需要升级 CUDA 版本或使用支持硬件加速的版本。

例如,CUDA 11.2 及以上版本支持硬件加速。可以使用以下命令确认 CUDA 版本:

nvcc -V

如果能够正确输出 CUDA 版本信息,则说明 CUDA 已经正确安装。

CUDA 版本信息示例:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Build cuda_11.2.r11.2/compiler.29618528_0

镜像构建步骤

我们以宿主机cuda版本11.6为例,构建该cuda版本的包含FFmpeg的镜像。本文将介绍具体的步骤。

1. 指定基础镜像

首先,我们需要指定基础镜像为nvidia/cuda:11.6.1-cudnn8-runtime-centos7。

NVIDIA CUDA基础镜像是一个提供CUDA开发环境的Docker镜像。它是以NVIDIA官方提供的CUDA基础镜像为基础构建的,为CUDA开发人员和研究人员提供了一个方便的环境来进行GPU加速的计算和深度学习任务。

FROM nvidia/cuda:11.6.1-cudnn8-runtime-centos7

2. 更新yum包并安装所需工具

接下来,我们需要更新yum包管理器,并安装一些编译FFmpeg所需的工具。

RUN yum update -y && \
    yum install -y epel-release && \
    yum install -y autoconf automake bzip2 cmake freetype-devel gcc gcc-c++

3. 安装FFmpeg的依赖库

为了成功编译FFmpeg,我们需要安装一些依赖库。

RUN yum install -y git libtool make mercurial pkgconfig zlib-devel yasm nasm openssl-devel

4. 创建存放FFmpeg源代码和依赖库的目录

接下来,我们创建一个目录用于存放FFmpeg的源代码和依赖库。

RUN mkdir ~/ffmpeg_sources

5. 安装nasm编译器

安装NASM的作用是提供一个汇编语言编译器,用于编译和生成优化的汇编代码。NASM(Netwide Assembler)是一款广泛使用的汇编语言编译器,专门用于x86和x86-64架构的开发。NASM提供了丰富的指令集和优化选项,可以针对不同的处理器架构生成高效的机器码。这样可以提高FFmpeg在执行音视频编解码、滤镜和其他操作时的速度和效率。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar xjvf nasm-2.13.02.tar.bz2 \
    && cd nasm-2.13.02 \
    && ./autogen.sh \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" \
    && make \
    && make install

6. 安装yasm编译器

安装Yasm的作用是提供一个汇编语言编译器,用于编译和生成优化的汇编代码。Yasm(Yet Another Assembler)是一款汇编语言编译器,特别用于x86和x86-64架构的开发。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar xzvf yasm-1.3.0.tar.gz \
    && cd yasm-1.3.0 \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" \
    && make \
    && make install

7. 编译安装x264视频编码库

编译安装x264视频编码库的作用是为FFmpeg和其他多媒体应用程序提供高质量的视频编码功能。x264是一个开源的、高性能的H.264/AVC视频编码器,它能够将视频数据压缩为H.264格式,实现高效的视频压缩和高质量的图像编码。

RUN cd ~/ffmpeg_sources \
    && git clone  \
    && cd x264 \
    && PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-asm \
    && make \
    && make install

8. 编译安装x265视频编码库

接下来,我们需要编译安装x265视频编码库。x265是一个开源的视频编码器,用于将视频数据压缩为高效的HEVC(High Efficiency Video Coding)/H.265格式。它是H.265标准的一种实现,可以提供更高的视频压缩效率和更好的图像质量。

RUN cd ~/ffmpeg_sources \
    && git clone  \
    && cd ~/ffmpeg_sources/x265_git/build/linux/ \
    && cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source \
    && make \
    && make install

9. 编译安装fdk-aac音频编码库

fdk-aac是一种音频编码库,我们需要编译安装。fdk-aac提供了AAC(Advanced Audio Coding)音频编码的功能和支持。它是由Fraunhofer IIS(德国Fraunhofer研究机构的一个部门)开发的,被认为是一种优秀的AAC编码器。

RUN cd ~/ffmpeg_sources \
    && git clone --depth 1 --branch v0.1.6  \
    && cd fdk-aac \
    && autoreconf -fiv \
    && ./configure --prefix="$HOME/ffmpeg_build" --disable-shared \
    && make \
    && make install

10. 编译安装lame音频编码库

lame是一种音频编码库,用于将音频数据压缩为MP3格式。它提供了高质量的MP3音频编码功能和支持。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar xzvf lame-3.100.tar.gz \
    && cd lame-3.100 \
    && ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm \
    && make \
    && make install

11. 编译安装libvpx

libvpx是一个开源的视频编解码库,用于对视频数据进行压缩和解压缩,支持VP8和VP9视频编解码格式。它是由Google开发的,旨在提供高效的开源视频编解码实现。

RUN cd ~/ffmpeg_sources \
    && git clone --depth 1  \
    && cd libvpx \
    && ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm \
    && make \
    && make install

12. 安装NVIDIA Video Codec SDK

NVIDIA Video Codec SDK是用于硬件加速的库,它提供了NVIDIA GPU编解码器的头文件和接口,用于在编译和开发过程中与NVIDIA GPU编解码器进行交互。这个项目主要用于支持基于NVIDIA GPU的硬件加速视频编解码。

RUN cd ~/ffmpeg_sources \
    && git clone  \
    && cd nv-codec-headers \
    && make PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin" \
    && make install PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin"

13. 编译安装FFmpeg

最后,我们需要编译安装最新版的FFmpeg,并启用硬件加速。根据这些编译选项,安装的 FFmpeg 版本将包括对 libfdk_aac、libmp3lame、libvpx、libx264、libx265 等库的支持,以及其他功能和支持选项,如 CUDA、CUVID、NVENC 和 OpenSSL。

RUN cd ~/ffmpeg_sources \
    && curl -O -L  \
    && tar -xzf ffmpeg-4.4.tar.gz \
    && cd ffmpeg-4.4 \
    && PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$_CONFIG_PATH" ./configure \
      --prefix="$HOME/ffmpeg_build" \
      --pkg-config-flags="--static" \
      --extra-cflags="-I$HOME/ffmpeg_build/include" \
      --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
      --extra-libs=-lpthread \
      --extra-libs=-lm \
      --bindir="$HOME/bin" \
      --enable-gpl \
      --enable-libfdk_aac \
      --enable-libmp3lame \
      --enable-libvpx \
      --enable-libx264 \
      --enable-libx265 \
      --enable-nonfree \
      --enable-cuda \
      --enable-cuvid \
      --enable-nvenc \
      --enable-openssl \
    && make \
    && make install

14. 刷新路径环境变量

最后一步是刷新路径环境变量。

RUN hash -r

RUN echo 'PATH="$HOME/bin:$PATH"' >> ~/.bashrc \
    && source ~/.bashrc

现在,我们已经成功构建了一个包含FFmpeg的镜像。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
1
1