youtube-dl 使用记录

2019-05-03 3001点热度 1人点赞

从他人那了解到的一个新的 youtube 下载工具,可以下载 4K 以上的网站视频内容


1 、关于 youtube-dl

Github 项目地址 [ 链接 ]

youtube-dl 是一个命令行程序,适用于从 YouTube.com 等更多网站上下载视频。它需要 Python 环境,版本 2.6,2.7 或 3.2+,并且是多平台支持的。

youtube-dlc 是 社区测试合并版,因 youtube-dl 自 DCMA 事件后合并速度大幅减少而诞生 [ 链接 ]

yt-dlp 是 社区新合并版,因 youtube-dlc 维护者停止维护而诞生。 [ 链接 ]

推荐使用 yt-dlp 版本,原因是 社区活跃 可以修补大量陈旧问题


2 、安装 youtube-dl

作者提供了二进制文件,所以直接可以下载并运行

sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

然后我们可以测试 youtube-dl 是否安装成功

[root@server youtube-dl]# youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.04.30
[debug] Python version 2.7.5 (CPython) - Linux-5.0.11-1.el7.elrepo.x86_64-x86_64-with-centos-7.6.1810-Core
[debug] exe versions: none
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

当然你也可以直接通过 Python 的 pip 来安装,这样可以指定程序执行时的 python 环境。

yum install python36 python36-pip
pip3.6 install --upgrade youtube-dl

[root@server youtube-dl]# youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.04.30
[debug] Python version 3.6.6 (CPython) - Linux-5.0.11-1.el7.elrepo.x86_64-x86_64-with-centos-7.6.1810-Core
[debug] exe versions: none
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

如果你需要让 youtube-dl 自动合成下载好的视频,或者想得到更高品质的视频,都需要安装 ffmpeg 环境
(默认情况下,如果没有 ffmpeg 则只会下载同时有视频流和音频流的文件,存在低画质的问题)

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
yum install ffmpeg ffmpeg-devel -y
ffmpeg -version

Windows 的 ffmpeg 可以到 Github 下载 [ 链接 ]
Static 静态编译 / Shared 动态链接 / GPL 完全开源 / LGPL 组件开源 / Vulkan 外扩展

当你安装好 ffmpeg 后,重新查看 youtube-dl 的信息

[root@server ~]# youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.04.30
[debug] Python version 3.6.6 (CPython) - Linux-5.0.11-1.el7.elrepo.x86_64-x86_64-with-centos-7.6.1810-Core
[debug] exe versions: ffmpeg 2.8.15, ffprobe 2.8.15
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

你可以查看 youtube-dl 支持的网站列表

youtube-dl --list-extractors

3 、使用 youtube-dl

通常直接使用命令后面跟随 url 地址的方式即可

youtube-dl [url]

但是你会发现,你在这个状态下下载的视频并不是最清晰的,这时候你可以通过 -F 参数或者是 --list-formats 参数查看服务端支持的所有流
(默认情况下,youtube-dl 会尝试下载最佳可用质量,即如果你想要最好的质量,你不需要传递任何特殊选项,youtube-dl 默认会为你选择一个最好的。)

[root@server youtube-dl]# youtube-dl -F https://www.youtube.com/watch?v=PWeH_CcTq_8
[ youtube ] PWeH_CcTq_8: Downloading webpage
[ youtube ] PWeH_CcTq_8: Downloading video info webpage
[ info ] Available formats for PWeH_CcTq_8:
format code  extension  resolution note
249          webm       audio only DASH audio   61k , opus @ 50k, 4.63MiB
250          webm       audio only DASH audio   77k , opus @ 70k, 6.13MiB
140          m4a        audio only DASH audio  128k , m4a_dash container, mp4a.40.2@128k, 12.45MiB
251          webm       audio only DASH audio  145k , opus @160k, 12.17MiB
171          webm       audio only DASH audio  174k , vorbis@128k, 12.76MiB
160          mp4        256x110    144p   88k , avc1.4d400b, 24fps, video only, 7.53MiB
278          webm       256x110    144p  119k , webm container, vp9, 24fps, video only, 6.98MiB
133          mp4        426x182    240p  191k , avc1.4d400d, 24fps, video only, 16.14MiB
242          webm       426x182    240p  253k , vp9, 24fps, video only, 15.22MiB
243          webm       640x274    360p  489k , vp9, 24fps, video only, 28.08MiB
134          mp4        640x274    360p  494k , avc1.4d4015, 24fps, video only, 41.07MiB
244          webm       854x366    480p  708k , vp9, 24fps, video only, 50.57MiB
135          mp4        854x366    480p  914k , avc1.4d401e, 24fps, video only, 76.10MiB
247          webm       1280x548   720p 1250k , vp9, 24fps, video only, 100.90MiB
136          mp4        1280x548   720p 1845k , avc1.4d401f, 24fps, video only, 148.01MiB
248          webm       1920x822   1080p 2466k , vp9, 24fps, video only, 178.39MiB
137          mp4        1920x822   1080p 3379k , avc1.640028, 24fps, video only, 268.37MiB
18           mp4        640x274    medium , avc1.42001E, mp4a.40.2@ 96k, 66.18MiB
43           webm       640x360    medium , vp8.0, vorbis@128k, 83.68MiB
22           mp4        1280x548   hd720 , avc1.64001F, mp4a.40.2@192k (best)

你可以通过手工指定 --format 的方式下载对应流,一个完整的视频一般需要 [ 视频流+视频流+音频流+音频流+字幕流+字幕流 ]
(如果中间是逗号则不合并仅分开下载)

youtube-dl -f '137+171' https://www.youtube.com/watch?v=PWeH_CcTq_8

在这里提醒一下

1 、如果你没有安装 ffmpeg,则你无参数时下载的是第 22 号格式代码的文件,此文件包含了音频和视频,但并不是分辨率最大的选择。
2 、如果你已经安装了 ffmpeg,则你下载的是第 137 号与第 171 号格式代码的文件,然后由 ffmpeg 合并成最终视频并自动删除合并前文件。
3 、如果你没有安装 ffmpeg,并且采用手工指定的方式下载,你只会下载到两个文件,不会合并成最终文件。

一般没有参数时等同于下面这样手动指定的方式,

youtube-dl -f 'bestvideo+bestaudio' [url]

以及如果你想手工的限制下载时的最大分辨率,你可以在后面额外添加 [] 并指定信息。
(本例限制视频流最大高度不得超过 1080P,如果服务器没分视频流和音频流则下载最大高度不超过 720P 的文件)

youtube-dl -f 'bestvideo[height<=1080]+bestaudio/best[height<=720]' [url]

这里的文字参数一共有六种,分别如下

best:选择具有视频和音频的单个文件所代表的最佳质量格式。
worst:选择具有视频和音频的单个文件所代表的最差质量格式。
bestvideo:选择最佳质量的仅视频格式(例如 DASH 视频)。可能无法使用。
worstvideo:选择质量最差的纯视频格式。可能无法使用。
bestaudio:选择质量最佳的音频格式。可能无法使用。
worstaudio:选择质量最差的音频格式。可能无法使用。

如果希望合成为 MP4 文件,因为 Ubuntu 的 ffmpeg 无法将 webm 音频 直接与 mp4 合并,所以需要使用 m4a 音频格式
关于格式,webm 和 mp4 都作为容器,实际视频编码为 vp8 或者 avc1

youtube-dl -f 'bestvideo+(bestaudio[ext=m4a]/bestaudio)' --merge-output-format mp4 [url]

如果你希望指定文件名,可以使用 --output 指定

youtube-dl --output [url]

如果你希望下载视频封面和视频简介,会在同级文件夹下创建两个新文件储存信息

youtube-dl --write-thumbnail --write-description

如果你的下载客户端在国内,你可能需要手动指定代理,通常有两种方式指定

youtube-dl --http-proxy HOST:PORT [url]
youtube-dl --socks-proxy HOST:PORT [url]

如果你下载的网站需要登陆才可以访问的资源,你可以添加账号密码参数
也可以通过创建 .netrc 文件来储存账号密码(不推荐)参见 [ 链接 ]

youtube-dl -u "yourname" -p "yourpass"  [url]

4 、使用 youtube-dl 获取字幕

查看视频的字幕类型清单

youtubd-dl --list-subs [url]

下载视频并额外下载英文的 vtt 格式的字幕文件

youtubd-dl --write-sub --sub-lang en [url]

下载视频并额外下载中文的 vtt 格式的字幕文件,并直接合并到视频文件中(需要 ffmpeg 支持)

youtubd-dl --write-sub --sub-lang zh --embed-sub [url]

不下载视频,只下载英文的 vtt 格式的字幕文件

youtube-dl --write-sub --skip-download [url]

下载视频并额外下载所有语言的 vtt 格式的字幕文件

youtube-dl --write-sub --all-subs [url]

如果你想将 VTT 字幕转换为 SRT 纯文字字幕,你可以设置字幕保存的格式

youtube-dl --write-sub --sub-format "ass/srt/best" --convert-subs "srt"' [url]

又或者想下载流媒体,但是 m3u8 格式需要合并

ffmpeg -i [url] -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4

又或者需要对视频进行转码(CRF 越大文件越小)

ffmpeg -i [file] -c:v libx264 -crf 16 -c:a copy output.mp4

5 、使用 Cookie 解开订阅限制

有一些视频存在版权或订阅限制,又或者网站通过 Cookie 追踪用户并限制访问方式

此时我们需要添加 Cookie 信息,并在下载时指定 Cookie 信息。

注意本方式提取 Cookie 的浏览器不可注销用户(限定登陆状态)

Chrome 打开目标网站,访问页面后,按 F12 启用开发者工具 DevTools,选择 网络,按 F5 刷新网页,找到等同于地址栏请求 URL 的第一个报文 类型 document 状态 200 后,点击标头,在请求标头内容中提取 cookie: ABC******DEF 相关字符串。

提取到该字符串后,我们可以在命令中直接增加该字段,此时将携带身份访问目标服务器。

youtube-dl --add-header "Cookie: ABC******DEF" [url]

或者我们可以保存为一个文件,并通过读取该文件的方式长期使用。

youtube-dl --add-header "Cookie: $(cat youtube-header.txt)" [url]

root@server:~#cat youtube-header.txt
PREF=tz=Asia.Shanghai;__Secure-3PAPISID=QWERTYUIOP

如果认为该方式提取的 Cookie 信息实在过多,而且使用的时候可能会有其他的麻烦(比如跨域访问)

我们可以通过指定 Netscape 格式的 Cookie 进行挂载

youtube-dl --cookies cookies.txt [url]

所以我们需要提取我们用得到的 Cookie 来使用,此时我们需要 了解 Netscape Cookie 格式
注意 Netscape 文件首行必须存在标识 # Netscape HTTP Cookie Fileile 同时使用 Tab 做分隔符(不能用空格

# Netscape HTTP Cookie Fileile
# Useage Example 
#   1) wget -x --load-cookies cookies.txt [url]
#   2) curl --cookie cookies.txt [url]
#   3) aria2c --load-cookies cookies.txt [url]
#   4) youtube-dl --cookies cookies.txt [url]
# ------------
# Domain        HTTP      Path    Secure  Timestamp   Name                Value
.youtube.com    TRUE      /       TRUE    0           PREF                tz=Asia.Shanghai
.youtube.com    TRUE      /       TRUE    0           __Secure-3PAPISID   QWERTYUIOP

本格式为通用 Cookie 储存格式,对应浏览器 F12 中的 储存 Cookie 部分

懒人 Chrome 的 Cookie 脚本 [ 链接 ] (不建议)

我们可以直接使用 js 脚本读取浏览器中的 cookie 并保存到本地(仅限本域,小心泄露)

(function() {
  let S = '# Netscape HTTP Cookie File\n';
  for (raw_cookie of document.cookie.split(';')) {
    let cookie = raw_cookie.trim();
    let separator = cookie.indexOf('=');
    let name = cookie.substring(0, separator);
    let value = cookie.substring(separator + 1);

    let domain = window.location.hostname;
    // hopefully this will convert domains like `www.test.com` and `test.com` into `.test.com`
    domain = domain.replace('www.', '.');
    if (domain[0] !== '.') {
        domain = '.' + domain;
    }

    // netscape cookie file format:
    // # domain  HTTP PATH SECURE timestamp name  value
    // .test.com TRUE /    FALSE  123456789 token 1234abcdef
    S += `${domain}\tTRUE\t/\tTRUE\t0\t${name}\t${value}\n`
  }

  console.log(S)
})();

注意 Cookie 含有一个选项为 HTTPOnly,该选项启用时会限制非 http 请求读取该 cookie(如 JS 脚本 读 Cookie)
所以如果通过浏览器,我们可以看到更多的 http only 启用的 Cookie 但无法被脚本读取。

注意 Cookie 含有一个选项为 Secure,该选项启用时会限制非 安全/加密 请求读取该 cookie(如 http 读 Cookie)

还可以使用命令读取浏览器所有 Cookie(完全模拟用户)

yt-dlp --cookies youtube-cookie.txt --cookies-from-browser chrome

但因为所有 Cookie 都会被导出,极高风险,慎重考虑


6 、使用 yt-dlp 支持更多选项

6.1 、 youtube-dl 与 yt-dlp 的显著区别

社区版和官方版本还是有很多区别的。

youtube-dl 采用 best 而非 (bestvideo+bestaudio)/best
yt-dlp 采用 (bestvideo*+bestaudio)/best(如果最高分辨率的文件同时含有音频,则直接使用该文件)

youtube-dl 允许 多视频或多音频 的合并
yt-dlp 禁止 多视频或多音频 的合并,需要手动开启以支持多轨合并

youtube-dl 不支持 喜好 --format-sort 参数
yt-dlp 支持 喜好 --format-sort 参数以调节匹配优先级

youtube-dl 默认输出模板 %(title)s-[%(id)s].%(ext)s
yt-dlp 默认输出模板 含空格 为 %(title)s [%(id)s].%(ext)s

当需要展示视频所支持的格式时,两者也有不同。(best 标记变成 ~ 符号放在 文件大小 前面)

root@server:~# yt-dlp -F https://www.youtube.com/watch?v=PWeH_CcTq_8
[ youtube] PWeH_CcTq_8: Downloading webpage
[ youtube] PWeH_CcTq_8: Downloading android player API JSON
[ info] Available formats for PWeH_CcTq_8:
ID  EXT   RESOLUTION FPS │   FILESIZE   TBR PROTO │ VCODEC          VBR ACODEC      ABR     ASR MORE INFO
─────────────────────────────────────────────────────────────────            
sb2 mhtml 48x27          │                  mhtml │ images                                      storyboard
sb1 mhtml 105x45         │                  mhtml │ images                                      storyboard
sb0 mhtml 210x90         │                  mhtml │ images                                      storyboard
139 m4a                  │    4.78MiB   48k https │ audio only          mp4a.40.5   48k 22050Hz low, m4a_dash
249 webm                 │    4.63MiB   47k https │ audio only          opus        47k 48000Hz low, webm_dash
250 webm                 │    6.13MiB   62k https │ audio only          opus        62k 48000Hz low, webm_dash
140 m4a                  │   12.69MiB  129k https │ audio only          mp4a.40.2  129k 44100Hz medium, m4a_dash
251 webm                 │   12.17MiB  124k https │ audio only          opus       124k 48000Hz medium, webm_dash
394 mp4   256x110     24 │    5.22MiB   53k https │ av01.0.00M.08   53k video only              144p, mp4_dash
160 mp4   256x110     24 │    9.07MiB   92k https │ avc1.4d400b     92k video only              144p, mp4_dash
278 webm  256x110     24 │    6.98MiB   71k https │ vp9             71k video only              144p, webm_dash
17  3gp   176x144     12 │    7.65MiB   78k https │ mp4v.20.3       78k mp4a.40.2    0k 22050Hz 144p
395 mp4   426x182     24 │   10.95MiB  111k https │ av01.0.00M.08  111k video only              240p, mp4_dash
133 mp4   426x182     24 │   22.78MiB  232k https │ avc1.4d400d    232k video only              240p, mp4_dash
242 webm  426x182     24 │   15.22MiB  155k https │ vp9            155k video only              240p, webm_dash
396 mp4   640x274     24 │   23.21MiB  236k https │ av01.0.01M.08  236k video only              360p, mp4_dash
134 mp4   640x274     24 │   43.24MiB  441k https │ avc1.4d4015    441k video only              360p, mp4_dash
18  mp4   640x274     24 │   66.18MiB  675k https │ avc1.42001E    675k mp4a.40.2    0k 44100Hz 360p
243 webm  640x274     24 │   28.08MiB  286k https │ vp9            286k video only              360p, webm_dash
397 mp4   854x366     24 │   41.70MiB  425k https │ av01.0.04M.08  425k video only              480p, mp4_dash
135 mp4   854x366     24 │   62.26MiB  635k https │ avc1.4d401e    635k video only              480p, mp4_dash
244 webm  854x366     24 │   50.57MiB  516k https │ vp9            516k video only              480p, webm_dash
398 mp4   1280x548    24 │   84.04MiB  857k https │ av01.0.05M.08  857k video only              720p, mp4_dash
136 mp4   1280x548    24 │   98.44MiB 1004k https │ avc1.4d401f   1004k video only              720p, mp4_dash
22  mp4   1280x548    24 │ ~113.75MiB 1133k https │ avc1.64001F   1133k mp4a.40.2    0k 44100Hz 720p
247 webm  1280x548    24 │  100.90MiB 1029k https │ vp9           1029k video only              720p, webm_dash
399 mp4   1920x822    24 │  147.40MiB 1504k https │ av01.0.08M.08 1504k video only              1080p, mp4_dash
137 mp4   1920x822    24 │  296.28MiB 3023k https │ avc1.640028   3023k video only              1080p, mp4_dash
248 webm  1920x822    24 │  178.39MiB 1820k https │ vp9           1820k video only              1080p, webm_dash

个人常用的文件下载及字幕联合处理方式(1080P MP4 内嵌 SRT 字幕 / 4K WEBM 外挂 VTT 字幕)

yt-dlp --merge-output-format mp4 --format-sort "res:1080,vcodec:av1" --format '(bestvideo*+bestaudio)/best' --write-thumbnail --write-description --write-subs --sub-langs "zh-CN,zh-TW,en,ja" --sub-format "ass/srt/vtt/best" --convert-subs "srt" --embed-sub [url]
yt-dlp --merge-output-format webm --format-sort "res:2160,vcodec:av1" --format '(bestvideo*+bestaudio)/best' --write-thumbnail --write-description --write-subs --sub-langs "zh-CN,zh-TW,en,ja" --sub-format "ass/srt/vtt/best" [url]

6.2 、多线程下载

或许我们可能需要多线程下载,但通常受限于网速,单线程已经拉满了。

默认的线程数是 1 ,未开启多线程下载同时也是减少 被降速 的可能性

yt-dlp --concurrent-fragments 8 [url]

同时额外增加一个选项为 失败后重试下载,默认重试次数 10

yt-dlp --retries 10 [url]

6.3 、低速重新下载

在批量下载视频时经常会遇到一个情况:速度本来 10MB/s 回头一看 10KB/s

这是因为 CDN 或 站点策略 限制了用户反复爬取,而网页的解决方式是 刷新页面

对于 yt-dlp 而言,社区增加了一个解决方案,使用一个参数作为最低速度限制,低于则重新下载 [ 链接 ]

yt-dlp --throttled-rate 100K [url]

6.4 、优先级排序方式

ytdlp 支持 --format-sort 管理优先级顺序,也可以通过 --format 参数使用用户指定参数

两者参数优先级不同,--format 的优先级高于 --format-sort 的优先级

yt-dlp --format 'bestvideo[vcodec^=avc1]+bestaudio' --format-sort "vcodec:av01"

此时虽然优先级排序会将 av01 类型作为优先选择项,但因为 --format 指定了 vcodec^=avc1 而将 下载选择 限定在 avc1 格式

更多优先级顺序可以参考 [ 链接 ]


6.5 、限定访问所使用的 IP 协议

IPV6 是很优秀,但经常能遇到 IPV6 无法打开或下载的情况。

yt-dlp --force-ipv4 [url]

7 、 FFmpeg 使用

有些情况下,还是需要直面 FFmpeg 的命令

7.1 、 FFmpeg 常用命令

ffmpeg -c:v hevc -r 30 -i "input.mp4" -r 25 -c:v libx265 -b:v 2000k -s 1280x720 -c:a aac -vf "fps=30,ass=someone.ass" -ss 00:00:20 -to 00:03:40 "output.mp4"

7.2 、 FFmpeg 硬件加速

默认 FFmpeg 是依靠 CPU 软编解码,如果我们有 Nvidia 等硬件加速设备,完全可以使用显卡处理

关于 Nvidia 硬件加速 FFmpeg 的说明 [ 链接 ]

首先需要确认当前硬件设备的支持条件,从官网下载最新版本的 FFmpeg 和 Cuda(AMD 不需要)

Nvidia 显卡的编码与解码支持列表 [ 链接 ]

FFmpeg 硬件加速的编码与解码支持列表 [ 链接 ]

Windows 下 PowerShell 查询 FFmpeg 硬件加速支持的命令

查询当前硬件设备下 FFmpeg 与 硬件加速 支持情况
PS > ffmpeg -hwaccels

Hardware acceleration methods:
qsv
cuda
dxva2
opencl
d3d11va
vulkan

qsv:intel 显卡的快速视频同步技术(quick sync video)
amf:amd 显卡的 amf 硬件编码器(amd hardware encoder)
cuda: nvidia 显卡的硬件视频编码器与解码器(替代名称)
nvenc:nvidia 显卡的硬件视频编码器(不同代名)
nvdec:nvidia 显卡的硬件视频解码器(不同代名)
cuvid:nvidia 显卡的硬件视频解码器(不同代名)
vulkan:跨平台 流加速 与 编解码 支持(但是大概率不会自带所属的编解码器)
opencl:标准 OpenCL 所支持的 CPU+GPU 滤波器合集(可对应下属五个类型)
*dxva2:仅 NV12 表面,所有平台(Direct -X Video Acceleration API)
*d3d11va:仅 Intel 的 NV12 纹理
*VAAPI:所有表面类型。
*ARM Mali:所有表面类型,通过 DRM 对象共享。
*libmfx:仅 NV12 表面,通过 VAAPI 或 DXVA2 。
查询当前硬件设备下 FFmpeg 解码支持情况
PS > ffmpeg -decoders | sls nvidia

 V..... av1_cuvid            Nvidia CUVID AV1 decoder (codec av1)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
查询当前硬件设备下 FFmpeg 编码支持情况
PS > ffmpeg -encoders | sls nvidia

 V....D av1_nvenc            NVIDIA NVENC av1 encoder (codec av1)
 V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V....D hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)

根据上方我们可以知道,本机支持 CUDA 并能调用 cuvid 与 nvenc 两者。
此时我们可以添加硬件编解码的参数给 FFmpeg 了,注意前后顺序,先解码,再编码

ffmpeg -hwaccel cuda -c:v hevc_cuvid -i video.mp4 -c:v h264_nvenc output.mp4

顺序是 指定硬件编码方式 cuda,指定解码方式,指定输入文件,指定编码方式,指定输出文件


8 、相关链接

youtube-dl 使用小记 [ 链接 ]

更好理解 youtube-dl 该如何使用 [ 链接 ]

FFmpeg 硬件加速介绍 [ 链接 ]

FFmpeg 使用显卡加速转码 [ 链接 ]

StarryVoid

Have a good time