youtube-dl、you-get、ffmpeg 和批处理文件

youtube-dl、you-get的安装

在安装这两个命令行下载工具前需要先安装Python和ffmpeg

1
2
pip3 install youtube-dl
pip3 install you-get
检验安装是否成功
1
2
youtube-dl --version
you-get --version
更新
1
2
pip3 install --upgrade youtube-dl
pip3 install --upgrade you-get

Install Python on Windows

Python安装的详细图文教程可参看这里

Installing FFmpeg in Windows

详细的安装图文教程可参考这里

FFmpeg下载地址

FFmpeg下载页面

根据自己的操作系统选择下载最新的64位或32位静态程序版本: 下载的Win10 64位静态程序版本名称大致长这样:

ffmpeg-20200225-36451f9-win64-static.zip

解压下载好的FFmpeg程序压缩包,将其目录下的bin子目录添加至系统环境变量

FFmpeg程序包解压后的文件结构

然后在命令行窗口输入以下命令并执行,不报错说明安装成功

1
ffmpeg -version

youtube-dl、you-get的使用(国外网站推荐前者,国内推荐后者)

youtube-dl的GitHub站点

you-get wiki 中文说明

1
youtube-dl [OPTIONS] URL [URL...]

查看视频的信息

1
2
youtube-dl -F "your_video_url"
you-get -i "your_video_url"
下载
1
2
youtube-dl "your_video_url"
you-get "your_video_url"

下载播放列表(推荐用 youtube-dl

貌似会自动识别列表,可以不用加 --yes-playlist 选项

1
youtube-dl -f "bestvideo+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 --yes-playlist "playlist_url"
从播放列表的第5个视频开始下载
1
youtube-dl -f "bestvideo+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 --playlist-start=5 "playlist_url"
从播放列表里面选择性下载
1
youtube-dl -f "bestvideo+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 --playlist-item=3,6,9-12 "playlist_url"
将字幕软嵌到视频里并获得高质量的MP4格式(需要特定播放器,这些视频上传b站貌似看不到字幕)
1
youtube-dl -f "bestvideo+bestaudio[ext=m4a]/bestvideo+bestaudio/best" --merge-output-format mp4 --write-sub --sub-lang=en --convert-subs=ass --playlist-item=8,9 --embed-subs "playlist_url"

列出视频对应的所有字幕(自动字幕、上传字幕) List all available subtitles for the video
1
youtube-dl --list-subs "video_url"
例如:
1
youtube-dl --list-subs "https://youtu.be/WUvTyaaNkzM"
前面为自动字幕,最后面的几个为上传字幕,默认格式为vtt

同时下载视频和自动英文字幕(并将字幕格式vtt转换为srt,便于后面用FFmpeg烧录字幕)

这时字幕的名称会在视频名称的后面加上.en, 比如:file_name.mp4file_name.en.srt

1
youtube-dl --sub-lang=en --write-auto-sub --convert-subs=srt "video_url"

同时下载视频和上传的英文字幕

1
youtube-dl --sub-lang=en --write-sub --convert-subs=srt "video_url"

you-get 下载特定清晰度的视频

1
you-get --itag=18 'https://www.youtube.com/watch?v=jNQXAC9IVRw'

youtube-dl 的配置文件

On Windows, the user wide configuration file locations are %APPDATA%\youtube-dl\config.txt or C:\Users\<username>\youtube-dl.conf. Note that by default configuration file may not exist so you may need to create it yourself.

youtube-dl.conf
1
2
3
4
5
6
7
8
# Use this proxy
--proxy "socks5://127.0.0.1:1080"
# delete id from default output file names.
-o "%(title)s.%(ext)s"
# choose best video and audio
-f "bestvideo+bestaudio[ext=m4a]/bestvideo+bestaudio/best"
# finally get all the mp4 format (follow the 3rd setting)
--merge-output-format mp4

You can use --ignore-config if you want to disable the configuration file for a particular youtube-dl run.

You can also use --config-location if you want to use custom configuration file for a particular youtube-dl run.

FFmpeg的使用

合并多个 mp4 视频文件

更加具体的参考下面两个链接: Concatenating media files -- FFmpeg

How to concatenate two MP4 files using FFmpeg?

my_merge.bat
1
2
3
4
5
:: Automatically generating the input file
(for %%i in ("*.mp4") do @echo file '%%i') > mylist.txt

:: The -safe 0 is not required if the paths are relative.
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

用法:先将需要合并的视频放在一个空的文件夹内(文件夹路径最好不要带中文和一些特殊字符?), 此时最好将这些文件排好序,因为合并是按 mylist.txt 中的文件顺序进行依次合并的, 将上述代码保存为.bat格式的文件,放到空的文件夹内,双击即可,此时会跳出来黑色的命令行窗口,等待其合并。

当然最保险是将上述 bat 代码拆分为两个,第一步操作完后,打开 mylist.txt 检查文件顺序是否是你想要的,不是可以对其顺序进行调整。

其中第一步是将需要的 MP4 文件名打印到 mylist.txt,这个 txt 文件将作为第二步的输入文件。mylist.txt 的内容长下面这样:

mylist.txt
1
2
3
4
# this is a comment
file "/path/to/file1.mp4"
file "/path/to/file2.mp4"
file "/path/to/file3.mp4"
当然也可以在命令行里面操作,输入以下命令即可(先 cd 到需要合并文件的目录)

On Windows Command-line:

1
(for %i in ("*.mp4") do @echo file "%i") > mylist.txt

第二步开始调用 ffmpeg 按次序合并 mylist.txt 文件中的视频。

将ts视频文件转为mp4单文件

1
ffmpeg -i "la72.ts" -vcodec copy -acodec copy "ola72.mp4"

多个转换,批处理文件

1
2
for %%a in ("*.ts") do ffmpeg -i "%%a" -vcodec copy -acodec copy "newfiles\%%~na.mp4"
pause

将srt字幕内嵌到mp4文件中

单个视频

1
ffmpeg -i "w55.mp4" -vf "subtitles='w55.srt:force_style=FontName=Segoe UI,Fontsize=22'" "ow55.mp4"

1
2
for %%a in ("*.mp4") do ffmpeg -i "%%a" -vf "subtitles='%%~na.en.srt:force_style=FontName=Segoe UI,Fontsize=22'" "merge\%%~na.mp4"
pause

bat批处理文件

如果中文乱码,将bat文件编码另存为ANSI编码

替换当前目录和字目录文件的字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@echo off

set /p str1= 请输入要替换的文件(文件夹)名字符串(可替换空格):

set /p str2= 请输入替换后的文件(文件夹)名字符串(去除则直接回车):

echo.

echo 正在修改文件(夹)名中,请稍候……

for /f "delims=" %%a in ('dir /s /b ^|sort /+65535') do (

if "%%~nxa" neq "%~nx0" (

set "file=%%a"

set "name=%%~na"

set "extension=%%~xa"

call set "name=%%name:%str1%=%str2%%%"

setlocal enabledelayedexpansion

ren "!file!" "!name!!extension!" 2>nul

endlocal

)

)

exit

删除当前目录和子目录特定文件格式的前N个字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off
setlocal enabledelayedexpansion

::批量去掉文件名前N个字符,如果有文件夹会搜索文件夹下的每个文件进行修改
set /p format=请输入需要操作的文件格式:
set /p deletenum=请输入需要删除文件名前多少个字符:
for /r %%i in (.) do (
for /f "delims=" %%a in (' dir /b "%%i\*.%format%" 2^>nul ') do (
set "t=%%~na"
ren "%%i\%%a" "!t:~%deletenum%!%%~xa"
)
)

pause

删除文件名中某个特殊字符到最后 (待完善)

起因:用youtube-dl下载播放列表老是在文件名添加一些标识信息?如:原本所需文件名-sdngj17eerw.mp4

这个问题已得到解决,因为youtube-dl的下载文件名默认带有id,The current default template is %(title)s-%(id)s.%(ext)s. 只需在下载时再加一个参数:-o "%(title)s.%(ext)s"

1
2
3
@echo off
for /f "tokens=1,2* delims=[]" %%a in ('dir /a-d/b') do if exist "%%~a[]%%~b" ren "%%~a[]%%~b" "%%~a%%~xb"
pause

[]替换成你需要的特殊字符:

1
2
3
@echo off
for /f "tokens=1,2* delims=-" %%a in ('dir /a-d/b') do if exist "%%~a-%%~b" ren "%%~a-%%~b" "%%~a%%~xb"
pause
示例(对含有两个特殊字符无效):
1
2
3
abc-wee123.txt
sddf-tthh.txt
qaq-dff-ghh.txt
将变成
1
2
3
abc.txt
sddf.txt
qaq-dff-ghh.txt

将当前目录和子目录(不限层级)下的所有文件列出

然后可以对其复制或者剪切操作

操作前
操作后
正在加载今日诗词....
buy me a cup of coffee ☕️