之前一直用小丸工具箱转码,转码效果不错,但速度太慢了。后来发现FFMPEG现在支持CUDA硬件加速,就稍作整理一下。
准备工作:
-
一台支持CUDA的NVIDIA显卡电脑;
-
显卡驱动更新到最新版本;
-
下载最新版本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%"=="" echo 请重新输入 && goto menu_convert
if "%METHOD%"=="" echo 请重新输入 && goto menu_convert
if "%METHOD%"=="1" set /p RATE=转换码率(10000):
if "%METHOD%"=="2" set /p CRF=CRF(18):
if "%OUTPUT%"=="" set OUTPUT=%INPUT:~0,-4%_h264_nvenc.mp4
if "%RATE%"=="" set RATE=10000
if "%CRF%"=="" set CRF=18
for /f "tokens=*" %%i in ('ffprobe -i "%INPUT%" -select_streams v:0 -show_streams ^| findstr "codec_name"') do set FORMAT=%%i
set FORMAT=%FORMAT:~11%
if "%FORMAT%"=="h264" set FORMAT=h264_cuvid
::h265硬解码,GeForce 10xx以上显卡开启
::if "%FORMAT%"=="hevc" set FORMAT=hevc_cuvid
if "%FORMAT%"=="mjpeg" set FORMAT=mjpeg_cuvid
if "%FORMAT%"=="mpeg1video" set FORMAT=mpeg1_cuvid
if "%FORMAT%"=="mpeg2video" set FORMAT=mpeg2_cuvid
if "%FORMAT%"=="mpeg4" set FORMAT=mpeg4_cuvid
if "%FORMAT%"=="vc1" set FORMAT=vc1_cuvid
::vp8,vp9硬解码,GeForce 10xx以上显卡开启
::if "%FORMAT%"=="vp8" set FORMAT=vp8_cuvid
::if "%FORMAT%"=="vp9" set FORMAT=vp9_cuvid
echo 开始转码...
if "%METHOD%"=="1" ffmpeg -hwaccel cuvid -c:v "%FORMAT%" -i "%INPUT%" -b:v "%RATE%k" -c:v h264_nvenc -acodec mp3 -ab 128k -ar 44100 -ac 2 -y "%OUTPUT%"
if "%METHOD%"=="2" ffmpeg -hwaccel cuvid -c:v "%FORMAT%" -i "%INPUT%" -crf "%CRF%" -c:v h264_nvenc -acodec mp3 -ab 128k -ar 44100 -ac 2 -y "%OUTPUT%"
: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硬解码选项开启(去掉代码中的注释::)。我的笔记本显卡太老不支持就没开启。如果遇到"
Cannot load cuvidGetDecodeStatus"
之类的错误将显卡驱动更新到最新版本
。