ffmpeg cuda视频转码
maebari
编辑于 2020年02月15日 21:09

之前一直用小丸工具箱转码,转码效果不错,但速度太慢了。后来发现FFMPEG现在支持CUDA硬件加速,就稍作整理一下。

准备工作:

  1. 一台支持CUDA的NVIDIA显卡电脑;

  2. 显卡驱动更新到最新版本;

  3. 下载最新版本ffmpeg:https://ffmpeg.zeranoe.com/builds/

下载完ffmpeg后解压,进入bin文件夹,将以下内容复制保存到该文件夹下的ffconvert.bat文件(如果汉字为乱码,用notepad++将编码格式转换成ANSI)。

@echo off

color A

setlocal

title ffmpeg-cuda视频转码 ver 1.2

:menu_convert

set /p INPUT=输入文件路径:

set /p OUTPUT=输出文件路径:

set /p METHOD=选择转换方式[1:BitRate 2:CRF]:

if "%INPUT%&#​34;=="&#​34; echo 请重新输入 && goto menu_convert

if "%METHOD%&#​34;=="&#​34; echo 请重新输入 && goto menu_convert

if "%METHOD%&#​34;=="1&#​34; set /p RATE=转换码率(10000):

if "%METHOD%&#​34;=="2&#​34; set /p CRF=CRF(18):

if "%OUTPUT%&#​34;=="&#​34; set OUTPUT=%INPUT:~0,-4%_h264_nvenc.mp4

if "%RATE%&#​34;=="&#​34; set RATE=10000

if "%CRF%&#​34;=="&#​34; set CRF=18

for /f "tokens=*&#​34; %%i in ('ffprobe -i &#​34;%INPUT%" -select_streams v:0 -show_streams ^| findstr "codec_name&#​34;') do set FORMAT=%%i

set FORMAT=%FORMAT:~11%

if "%FORMAT%&#​34;=="h264&#​34; set FORMAT=h264_cuvid

::h265硬解码,GeForce 10xx以上显卡开启

::if "%FORMAT%&#​34;=="hevc&#​34; set FORMAT=hevc_cuvid

if "%FORMAT%&#​34;=="mjpeg&#​34; set FORMAT=mjpeg_cuvid

if "%FORMAT%&#​34;=="mpeg1video&#​34; set FORMAT=mpeg1_cuvid

if "%FORMAT%&#​34;=="mpeg2video&#​34; set FORMAT=mpeg2_cuvid

if "%FORMAT%&#​34;=="mpeg4&#​34; set FORMAT=mpeg4_cuvid

if "%FORMAT%&#​34;=="vc1&#​34; set FORMAT=vc1_cuvid

::vp8,vp9硬解码,GeForce 10xx以上显卡开启

::if "%FORMAT%&#​34;=="vp8&#​34; set FORMAT=vp8_cuvid

::if "%FORMAT%&#​34;=="vp9&#​34; set FORMAT=vp9_cuvid

echo 开始转码...

if "%METHOD%&#​34;=="1&#​34; ffmpeg -hwaccel cuvid -c:v "%FORMAT%&#​34; -i "%INPUT%&#​34; -b:v "%RATE%k&#​34; -c:v h264_nvenc -acodec mp3 -ab 128k -ar 44100 -ac 2 -y "%OUTPUT%&#​34;

if "%METHOD%&#​34;=="2&#​34; ffmpeg -hwaccel cuvid -c:v "%FORMAT%&#​34; -i "%INPUT%&#​34; -crf "%CRF%&#​34; -c:v h264_nvenc -acodec mp3 -ab 128k -ar 44100 -ac 2 -y "%OUTPUT%&#​34;

:menu_clear

set INPUT=

set OUTPUT=

set METHOD=

set RATE=

set CRF=

set FORMAT=

goto menu_convert

1. 运行该脚本首先输入源文件路径;

2. 输出文件路径可以忽略(直接回车),默认输出文件路径在输入文件路径下,带”_h264_nvenc.mp4“后缀的文件;

3. 转换方式有两种选择,1是码率BitRate,默认10000(直接回车);2是CRF,默认18(直接回车);均可手动调整。经过测试,码率10000的转换效果和文件大小与小丸工具箱crf=21的效果相当。crf参数某些情况下测试效果不太好。

转换过程如下图:

转码过程中可以看到任务管理器中GPU Video Encode/Video Decode资源占用情况。经过测试,小丸工具箱转码半小时的视频经过CUDA加速后几分钟就结束了。10代以上型号的显卡可以将以上代码中的h265,vp8,vp9硬解码选项开启(去掉代码中的注释::)。我的笔记本显卡太老不支持就没开启。如果遇到"之类的错误将显卡驱动更新到最新版本