FFmpeg再学习 -- 硬件加速编解码

时间:2021-06-12 16:25:33

为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结。

一、什么是 CUDA

(1)首先需要了解一下,什么是 CUDA。

参看:百度百科 -- CUDA

参看:CUDA基础介绍

参看:cuda入门

参看:CUDA知识普及

参看:CUDA学习笔记

CUDA (Compute Unified Device Architecture,统一计算设备架构),是显卡厂商 NVIDIA 在2007年推出的并行计算平台和编程模型。它利用图形处理器 (GPU) 能力,实现计算性能的显著提高。CUDA 是一种由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题,从而能通过程序控制底层的硬件进行计算。它包含了CUDA 指令集架构 (ISA) 以及 GPU 内部的并行计算引擎。开发人员可以使用 C/C++/C++11 语言来为 CUDA 架构编写程序。CUDA 提供 host-device 的编程模式以及非常多的接口函数和科学计算库,通过同时执行大量的线程而达到并行的目的。

(2)CUDA 所支持的平台

参看:CUDA Legacy GPUs

包含 GeForce、ION、Quadro、Tesla 等系列。

举个栗子:

FFmpeg再学习 -- 硬件加速编解码

我们用的是 NVIDIA GeForce GTX 1070 新出的上面莫有.... 不过点击 GeForce Desktop Products 还是可以看到相关信息的。参看:极致性价比 GeForce GTX 1070首发评测

(3)下载

CUDA 支持 Windows, Linux 和 Mac OS 的操作系统。

下载最新版本:CUDA Toolkit 下载地址

下载以往版本:Archived Releases

FFmpeg再学习 -- 硬件加速编解码

二、CUDA 安装

前面有讲 CUDA 支持 Windows, Linux 和 Mac OS 的操作系统。 我们主要介绍Windows 和 Linux 下的安装。

参看:CUDA Toolkit Documentation v8.0
与其他版本相比添加了哪些内容:

参看:Release Notes

FFmpeg再学习 -- 硬件加速编解码

Linux下的安装

(1)前期预安装操作

参看:NVIDIA CUDA Installation Guide for Linux

参看:Ubuntu16.04安装CUDA+cuDNN+GPU版TensorFlow过程记录

《1》安装前需要确认电脑的GPU是否支持 CUDA。

$ lspci | grep -i nvidia

FFmpeg再学习 -- 硬件加速编解码

如果您没有看到任何设置,更新 Linux 的 PCI 硬件数据库维护通过输入 update-pciids (一般在/ sbin)在命令行并重新运行之前 lspci 命令。
你也可以参看: CUDA Legacy GPUs ,确认你的GPU 是否支持CUDA-capable。

《2》确认你的Linux版本支持CUDA

CUDA开发工具只支持几个特定的Linux发行版本 
FFmpeg再学习 -- 硬件加速编解码

这里要说一下,我用的是 Ubuntu 16.04,这个只能是双系统不是安装在虚拟机上的。
安装过程,参看:Ubuntu 16.04 安装基础入门教程

《3》查看你的系统信息

$ uname -m && cat /etc/*release

FFmpeg再学习 -- 硬件加速编解码

x86_64 表示为 64 位系统。

《4》查证你是否安装了gcc

$ gcc --version

FFmpeg再学习 -- 硬件加速编解码

《5》验证系统已经正确安装内核头文件和开发方案

CUDA驱动程序要求在驱动程序安装时以及驱动程序重建时安装运行的内核版本的内核头文件和开发包。 例如,如果您的系统运行内核版本3.17.4-301,则还必须安装3.17.4-301内核头和开发包。
虽然Runfile安装不执行程序包验证,但如果当前没有安装这些程序包的版本,驱动程序的RPM和Deb安装将尝试安装内核头文件和开发包。 但是,它将安装这些软件包的最新版本,这可能与您的系统正在使用的内核版本不一致。 因此,最好在安装CUDA驱动程序之前以及每当更改内核版本时手动确保安装内核头文件和开发包的正确版本。
系统内核运行的版本可以通过运行下面的命令:

$uname - r

这是在安装 CUDA 驱动程序之前必须安装的内核头文件和开发包的版本。 下面将多次使用此命令来指定要安装的软件包的版本。 请注意,以下是内核使用的常见情况。 更高级的案例(如自定义内核分支)应确保其内核头和源与正在运行的内核构建相匹配。

我只介绍 Ubuntu 下的,其他操作系统的请自行查看。

Ubuntu 当前运行的内核的内核头文件和开发包安装:

$ sudo apt-get install linux-headers-$(uname -r)

《6》选择安装方法

CUDA工具包可以使用两种不同的安装机制来安装:特定于分发的软件包(runfile)或独立于分发的软件包(deb)。 独立于发行版的软件包具有跨越更广泛的 Linux 发行版的优势,但不会更新发行版的本机包管理系统。 分发专用软件包与发行版的本机软件包管理系统进行了接口。 建议尽可能使用特定于发行版本的软件包
注意:独立安装程序不提供用于除 x86_64 版本之外的体系结构。 对于本地和跨开发,必须使用特定于分发的安装程序来安装该工具包。 有关详细信息,请参阅“CUDA跨平台安装”部分。

上面这句话到到半天,其意思就是选择安装版本选择 runfile [local]

FFmpeg再学习 -- 硬件加速编解码

《7》下载 NVIDIA CUDA 工具包

下载最新版本:CUDA Toolkit 下载地址

《8》处理冲突的安装方法

在安装 CUDA 之前,应该卸载任何可能发生冲突的先前安装(第一次安装就不用卸载)。 这不会影响以前没有安装 CUDA 的系统,或者保存安装方法的系统(RPM / Deb vs. Runfile)。 有关详细信息,请参见以下图表:
FFmpeg再学习 -- 硬件加速编解码
使用以下命令卸载工具包 runfile 安装:
$ sudo /usr/local/cuda-X.Y/bin/uninstall_cuda_X.Y.pl

使用以下命令卸载一个runfile 驱动安装:

$ sudo /usr/bin/nvidia-uninstall

使用下面的命令卸载一个RPM / Deb安装:

$ sudo apt-get --purge remove <package_name>          # Ubuntu

(2)软件包管理器安装  (不必看,安装的是 .run 文件)

软件包管理器安装与系统的软件包管理系统相连接。 当使用 RPM 或 Deb 时,下载的软件包是存储库包。 这样的包只通知包管理器在哪里找到实际的安装包,但是不会安装它们。
如果这些软件包在在线存储库中可用,它们将在以后的步骤中自动下载。 否则,存储库包还将在系统上安装包含安装包的本地存储库。 无论存储库是在线还是在本地安装,安装过程都是相同的,由几个步骤组成。

我只介绍 Ubuntu 下的,其他操作系统的请自行查看。

《1》执行上面的预安装操作

《2》安装存储库元数据

注意:使用具有 aptitude 的代理服务器时,请确保在安装 cuda-repo 包之前,将 wget设 置为使用相同的代理设置。

$ sudo dpkg -i cuda-repo-<distro>_<version>_<architecture>.deb

《3》更新Apt存储库缓存

$ sudo apt-get update

《4》安装 CUDA

$ sudo apt-get install cuda

(3)额外的包管理器功能  (不必看,这些都什么鬼)

以下是用户可以利用的包管理器的一些附加功能。

《1》可用包

推荐的安装包是 cuda 包。此软件包将安装本机开发所需的全套其他 CUDA 软件包,并应涵盖大多数情况。
cuda软件包安装所有可用的软件包用于本地开发。这包括编译器,调试器,分析器,数学库...对于x86_64 patform,这还包括 NSight Eclipse Edition 和可视化分析器它还包括 NVIDIA 驱动程序包。
在支持的平台上,cuda-cross-armhf,cuda-cross-aarch64 和 cuda-cross-ppc64el 软件包分别将跨平台开发所需的所有软件包安装到 ARMv7,ARMv8 和 POWER8。还安装了目标架构的显示驱动程序包的库和头文件,以实现驱动程序应用程序的交叉编译。 cuda-cross <arch>软件包不安装本机显示驱动程序。
上述软件包安装的软件包也可以通过明确指定其名称来单独安装。可用包的列表可以通过以下方式获得:

$ cat /var/lib/apt/lists/*cuda*Packages | grep "Package:"      # Ubuntu

《2》套餐升级

cuda包指向CUDA工具包的最新稳定版本。 当有新版本可用时,请使用以下命令升级工具包和驱动程序:

$ sudo apt-get install cuda                                    # Ubuntu

cuda-cross <arch> 包也可以以相同的方式进行升级。
cuda-drivers 软件包指向 CUDA 存储库中最新的驱动程序版本。 当有新版本可用时,请使用以下命令升级驱动程序:

$ sudo apt-get install cuda-drivers                            # Ubuntu

某些桌面环境(例如GNOME或KDE)将在新软件包可用时显示通知警报。
为了避免任何自动升级,并将工具包安装锁定到X.Y版本,请安装 cuda-X-Y 或 cuda-cross <arch> -X-Y 软件包。
支持并排安装。 例如,要安装 X.Y CUDA 工具包和 X.Y + 1 CUDA 工具包,请安装 cuda-X.Y 和 cuda-X.Y + 1 软件包。

《3》元数据包

元数据包是不包含(或少量)文件但具有多个依赖关系的 RPM / Deb 软件包。 当您可能不知道所需软件包的详细信息时,它们用于安装许多 CUDA 软件包。 以下是元数据包的列表。

FFmpeg再学习 -- 硬件加速编解码

(4)运行文件安装  (重点)

本节介绍使用独立安装程序时 CUDA 的安装和配置。 独立安装程序是一个“.run”文件,是完全独立的。

《1》执行预安装操作。

《2》禁止 Nouveau 驱动

要安装显示驱动程序,必须首先禁用 Nouveau 驱动程序。 Linux 的每个分发都有不同的方法来禁用新版本。
如果以下命令打印任何内容,说明已加载新版驱动程序:
$ lsmod | grep nouveau

在/etc/modprobe.d/blacklist-nouveau.conf中创建一个文件,内容如下:

blacklist nouveau
options nouveau modeset=0

重新生成内核initramfs:

$ sudo update-initramfs -u

《3》重新启动到文本模式(运行级别3)。

进入文本模式方式:CTRL+ALT+F1
退出文件模式方式:CTRL+ALT+F7
我们之前有讲过,参看:UNIX再学习 -- 进程关系

方法是 ctrl + alt + F1 进入tty1,登录,
输入init 3,进入纯字符界面。
可以按ctrl+alt+F7验证,无法返回xWindow了,说明关闭成功。
再次 ctrl + alt + F1 返回tty1。
输入startx ,  会再次恢复启动xWinow。 ctrl+atl +f7 即可进入。
如果 init 3 & startx 不行,可以用 sudo service lightdm start/stop 命令,关闭或重启左面服务。

由于 NVIDIA 驱动程序尚未安装,文本终端可能无法正确显示。 暂时将“nomodeset”添加到系统的内核启动参数可能会解决这个问题。
有关如何使上述引导参数更改的信息,请参阅系统的引导加载程序文档。
重新启动需要完全卸载 Nouveau 驱动程序,并阻止图形界面加载。 在加载新版驱动程序或图形界面处于活动状态时,CUDA驱动程序无法安装。

《4》验证新的驱动程序是否未加载

如果新版驱动程序仍然加载,请查阅发行版的文档,看看是否需要进一步的步骤来禁用 Nouveau。

《5》运行安装程序并按照屏幕上的提示操作:

$ sudo sh cuda_<version>_linux.run

安装程序将提示以下内容:
EULA验收
CUDA驱动程序安装
CUDA工具包安装,位置和 /usr/local/cuda 符号链接
CUDA样品安装和位置

FFmpeg再学习 -- 硬件加速编解码
工具包和示例的默认安装位置为:
FFmpeg再学习 -- 硬件加速编解码
/usr/local/cuda 符号链接指向安装 CUDA Toolkit 的位置。此链接允许项目使用最新的 CUDA 工具包,无需任何配置文件更新。

必须以足够的权限执行安装程序才能执行某些操作。当当前权限不足以执行操作时,安装程​​序将要求用户的密码尝试以 root 用户权限进行安装。导致安装程序尝试使用root权限安装的操作是:
    安装CUDA驱动程序
    将CUDA工具包安装到用户没有写入权限的位置
    将CUDA样本安装到用户无权写入的位置
    创建 /usr/local/cuda 符号链接
使用 sudo 运行安装程序,如上所示,将允许安装到需要 root 权限的目录。使用 sudo 运行安装程序时创建的目录和文件将具有根所有权。
如果安装驱动程序,安装程序也会询问是否应该安装 openGL 库。如果用于显示的 GPU 不是 NVIDIA GPU,则不应安装 NVIDIA OpenGL 库。否则,非 NVIDIA GPU 的图形驱动程序使用的 openGL 库将被覆盖,GUI 将无法正常工作。如果执行静默安装,则应使用 --no-opengl-libs 选项来防止安装 openGL 库。有关详细信息,请参阅高级选项部分。
如果用于显示器的 GPU 是 NVIDIA GPU,则可能需要修改X服务器配置文件 /etc/X11/xorg.conf。在某些情况下, nvidia-xconfig 可用于自动生成适用于系统的 xorg.conf 文件。对于非标准系统,如具有多个 GPU 的系统,建议手动编辑 xorg.conf 文件。有关更多信息,请参阅 xorg.conf 文档。
注意:安装 Mesa 可能会覆盖以前由 NVIDIA 驱动程序安装的 /usr/lib/libGL.so,因此安装这些库后可能需要重新安装 NVIDIA 驱动程序。

《6》重新启动系统以重新加载图形界面。

《7》验证设备节点是否正确创建。

检查设备文件 /dev/nvidia* 是否存在并具有正确的(0666)文件权限。 CUDA 驱动程序使用这些文件与 NVIDIA 驱动程序的内核模式部分进行通信。 使用 NVIDIA 驱动程序(如 CUDA 应用程序或X服务器(如果有的话))的应用程序通常会使用与 NVIDIA 驱动程序捆绑在一起的 setuidnvidia-modprobe 工具丢失,自动创建这些文件。 但是,某些系统不允许使用 setuid 二进制文件,因此如果这些文件不存在,您可以使用如下所示的启动脚本手动创建它们。
#!/bin/bash

/sbin/modprobe nvidia

if [ "$?" -eq 0 ]; then
  # Count the number of NVIDIA controllers found.
  NVDEVS=`lspci | grep -i NVIDIA`
  N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
  NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`

  N=`expr $N3D + $NVGA - 1`
  for i in `seq 0 $N`; do
    mknod -m 666 /dev/nvidia$i c 195 $i
  done

  mknod -m 666 /dev/nvidiactl c 195 255

else
  exit 1
fi

/sbin/modprobe nvidia-uvm

if [ "$?" -eq 0 ]; then
  # Find out the major device number used by the nvidia-uvm driver
  D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`

  mknod -m 666 /dev/nvidia-uvm c $D 0
else
  exit 1
fi

《8》执行安装后的操作

安装后的操作必须手动执行。 这些操作被分为强制性,推荐和可选部分。

强制性操作

在安装CUDA Toolkit和Driver之前,必须采取一些措施。

环境设置:
PATH变量需要包含 /usr/local/cuda-8.0/bin 要将此路径添加到PATH变量中:
$ export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}

另外,当使用 runfile 安装方法时,LD_LIBRARY_PATH 变量需要在 64 位系统上包含 /usr/local/cuda-8.0/lib64,或 32 位系统上的 /usr/local/cuda-8.0/lib
要更改64位操作系统的环境变量:

$ export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

要更改32位操作系统的环境变量:

$ export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib\
                         ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

需要注意,使用带有runfile安装方法的自定义安装路径时,上述路径会发生变化。

推荐操作  (可看可不看)

建议使用其他操作来验证安装的完整性。
安装可写样本
为了修改,编译和运行样本,样本必须安装有写入权限。 提供了一个方便的安装脚本:
$ cuda-install-samples-8.0.sh <dir>

该脚本与cuda-samples-8-0软件包一起安装。 cuda-samples-8-0软件包仅在/usr/local/cuda-8.0/samples中安装只读副本。

验证安装
在继续之前,重要的是要验证CUDA工具包是否能够与支持CUDA的硬件找到并正确通信。 为此,您需要编译并运行一些包含的示例程序。
注意:确保PATH,如果使用runfile安装方法,LD_LIBRARY_PATH变量设置正确。
验证驱动程序版本
如果您安装了驱动程序,请验证其正确版本是否已加载。 如果您没有安装驱动程序,或者正在使用未通过内核模块(如L4T)加载驱动程序的操作系统,请跳过此步骤。
当驱动程序加载时,可以通过执行命令找到驱动程序版本。
$ cat /proc/driver/nvidia/version

FFmpeg再学习 -- 硬件加速编解码
请注意,此命令在iGPU / dGPU系统上不起作用。

编写实例
可以通过在终端窗口中运行 nvcc -V 来检查 CUDA 工具包的版本。 nvcc 命令运行编译 CUDA 程序的编译器驱动程序。 它调用 C 代码的 gcc 编译器和CUDA代码的NVIDIA PTX编译器。
FFmpeg再学习 -- 硬件加速编解码
NVIDIA CUDA工具包包含源代码示例程序。 您应该通过更改为〜/ NVIDIA_CUDA-8.0_Samples并键入make来编译它们。 所生成的二进制文件将被放置在〜/ NVIDIA_CUDA-8.0_Samples / bin下。

输入 nvidia-smi 就会显示一堆如图的东西,说明安装驱动成功。
FFmpeg再学习 -- 硬件加速编解码

运行二进制文件
编译后,在〜/ NVIDIA_CUDA-8.0_Samples下查找并运行deviceQuery。 如果CUDA软件安装和配置正确,则deviceQuery的输出应与图1所示的输出类似。
图1. deviceQuery CUDA示例的有效结果
FFmpeg再学习 -- 硬件加速编解码
您的系统上的确切外观和输出线可能不同。 重要的结果是找到设备(第一个突出显示的行),设备与系统上的设备(第二个突出显示的行)匹配,测试通过(最后突出显示的行)。
如果安装了支持CUDA的设备和CUDA驱动程序,但是deviceQuery报告没有支持CUDA的设备,这可能意味着/ dev / nvidia *文件丢失或权限错误。
在启用SELinux的系统上,您可能需要暂时禁用此安全功能才能运行deviceQuery。 为此,请键入:
$ setenforce 0

从命令行作为超级用户。
运行 bandwidthTest 程序可确保系统和支持CUDA的设备能够正常通信。 其输出如图2所示。bandwidthTest CUDA示例的有效结果:

FFmpeg再学习 -- 硬件加速编解码

《9》高级选项

FFmpeg再学习 -- 硬件加速编解码

《10》卸载

要卸载CUDA Toolkit,请运行该工具包bin目录中提供的卸载脚本。 默认情况下,它位于/usr/local/cuda-8.0/bin中:
$ sudo /usr/local/cuda-8.0/bin/uninstall_cuda_8.0.pl

要卸载NVIDIA驱动程序,请运行nvidia-uninstall:

$ sudo /usr/bin/nvidia-uninstall

要启用 Nouveau 驱动程序,请删除在《2》禁止 Nouveau 驱动 部分中创建的黑名单文件,并按照该部分所述重新生成内核 initramfs/initrd。


Windows 下的安装 (以后再写)

参看:CUDA Installation Guide for Microsoft Windows


三、ffmpeg对NVIDIA GPU的支持

上面balala那么多,因为是英文手册,我看着都头疼。翻译成中文也是前后语言不通顺。
因为我用的电脑上,CUDA 是已经安装好的。所有没有真正的自己安装操作一遍...
不过,下面的任务就是该我做了。

(1)ffmpeg 安装

参看:ffmpeg再学习 -- Linux 安装说明

写的很清楚了,然后主要是 x264 和 mp3lame 需要下载安装。

再然后,写配置脚本:

#! /bin/bash
./configure \
    --enable-shared \
    --disable-static \
    --disable-yasm \
    --disable-doc \
    --enable-gpl \
    --enable-pthreads \
    --disable-w32threads \
    --disable-os2threads \
    --enable-debug  \
    --enable-nvenc \
    --enable-cuda \
    --enable-cuvid \
    --extra-cflags="-Invidia_sdk -I/usr/local/cuda-8.0/include" \
    --extra-ldflags="-Lnvidia_sdk -L/usr/local/cuda-8.0/lib64" \
    --enable-nonfree \
    --enable-libfreetype \
    --enable-libfontconfig \
    --enable-libnpp \
    --enable-gpl \
    --prefix=/usr/local/ffmpeg \
    --enable-libx264 \
    --enable-libmp3lame \

(2)FFmpeg 测试

运行 ffmpeg -codecs | grep cuvid   (硬解码)

FFmpeg再学习 -- 硬件加速编解码

运行 ffmpeg -codecs | grep nvenc   (硬编码)
FFmpeg再学习 -- 硬件加速编解码

参看:NVIDIA VIDEO CODEC SDK

里面就有说明硬编/解码的类型了,这里面还有一些性能比较。我就不一一说明了。

从硬件上来说,Nvidia GPU有一到多个编解码器(解码器又称硬件加速引擎),它们独立于CUDA核。从视频格式上来说,编码支持H.264、H.265、无损压缩,位深度支持8bit、10bit,色域空间支持YUV 4:4:4和4:2:0,分辨率支持最高8K;解码支持MPEG-2、VC1、VP8、VP9、H.264、H.265、无损压缩,位深度支持8 bit、10bit、12bit,色域空间支持YUV 4:2:0,分辨率支持最高8K。Video Codec SDK已经被集成在ffmpeg工程中,但是ffmpeg对编解码器配置参数较少,如果需要充分的发挥编解码器特性,还需要直接使用SDK进行编程。

FFmpeg再学习 -- 硬件加速编解码

上述编解码的比较:

参看:说说4K硬解那些事儿【转自超能网】

(3)编解码器使用方法

参看:FFmpeg / libav

FFmpeg GPU HW加速的支持表:

FFmpeg再学习 -- 硬件加速编解码

将单个H.264解码为YUV
要将单个H.264编码的基本比特流文件解码为YUV,请使用以下命令:

FFMPEG: ffmpeg -vsync 0 -c:v h264_cuvid -i <input.mp4> -f rawvideo <output.yuv>
LIBAV: avconv -vsync 0 -c:v h264_cuvid -i <input.mp4> -f rawvideo <output.yuv>

将单个YUV文件编码为比特流
要将单个YUV文件编码为H.264 / HEVC比特流,请使用以下命令:
H.264

FFMPEG: ffmpeg -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -c:v h264_nvenc -preset slow -cq 10 -bf 2 -g 150 <output.mp4>
LIBAV: avconv -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -c:v h264_nvenc -preset slow -cq 10 -bf 2 -g 150 <output.mp4> 

HEVC (No B-frames)

FFMPEG: ffmpeg -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -vcodec hevc_nvenc -preset slow -cq 10 -g 150 <output.mp4>
LIBAV: avconv -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -vcodec hevc_nvenc -preset slow -cq 10 -g 150 <output.mp4>

转码单个视频文件
要执行1:1转码,请使用以下命令:

FFMPEG: ffmpeg -hwaccel cuvid -c:v h264_cuvid -i <input.mp4> -vf scale_npp=1280:720 -c:v h264_nvenc <output.mp4>
LIBAV: avconv -hwaccel cuvid -c:v h264_cuvid -i <input.mp4> -vf scale_npp=1280:720 -c:v h264_nvenc <output.mp4>

将单个视频文件转换为N个流
要执行1:N转码,请使用以下命令:

FFMPEG: ffmpeg -hwaccel cuvid -c:v h264_cuvid -i <input.mp4> -vf scale_npp=1280:720 -vcodec h264_nvenc <output0.mp4> -vf scale_npp 640:480 -vcodec h264_nvenc <output1.mp4>
LIBAV: avconv -hwaccel cuvid -c:v h264_cuvid -i <input.mp4> -vf scale_npp=1280:720 -vcodec h264_nvenc <output0.mp4> -vf scale_npp 640:480 -vcodec h264_nvenc <output1.mp4>

(4)实验

将一张图片循环20000次生成视频,一个是硬编码一个是软编码,比较它们运行时间。
# time ./ffmpeg -f image2 -stream_loop 20000 -i 1.jpg -vcodec h264_nvenc -b:v 200k -r 10 -s 1920x1080 -y 2.mp4
# time ./ffmpeg -f image2 -stream_loop 20000 -i 1.jpg -vcodec libx264 -b:v 200k -r 10 -s 1920x1080 -y 2.mp4