一直用命令行youtube-dl下载视频,觉得好用,对能用它的个把参数控制下载播放列表的指定视频很是满意。不学无术的我呀,一直以来都是够用就行,绝不肯为难自己多学一点点,生怕把自己累着,所以我一直以为youtube-dl只能在代码体外以命令的形式工作。
如前所述用youtube-dl下载了一堆视频,为了把视频转成音频,找了第三方模块moviepy完成批量处理任务,还挺得意省却了些许麻烦。唯一不足的是得自己动手在终端敲youtube-dl命令,还得自己动手运行mp4到mp3的转换程序。能不能合起来,把youtube-dl下载程序这一步也整合到代码中呢?我想至少可以用subprocess让youtube-dl命令在代码中启动下载吧。
到网上一搜才发现原来人家youtube-dl本来就是个第三方模块,完全可以在python中import使用;再定睛一个,额滴个老天嘢呀,居然还自己带下载音频的参数!眼前不由闪过一片小阴影,之前不是白费功夫么
试了一下下载音频的参数,发现只能有啥下啥,就是说它有才有的下,它没有你还非指定要音频就会报错。而且视频网站提供啥格式音频文件,则只有那些格式的音频文件可以下。我试的时候是下了一堆的webm和m2a的音频,心里略安,看来没白费功夫,这一堆哪有mp3格式的顺眼and整齐啊。
万万没想到再仔细看下去,又发现了个参数。这个参数再配合另一个ffmpeg模块居然...居然可以把视频转化成mp3音频,而且强大到不限定必须是mp4视频,也不限定必须是mp3音频。
youtube-dl功能很强大,但参数也是真烦杂,真要研究明白且得花些功夫,幸好我不需要研究明白,只把自己需要的整明白就行啦。程序里能实现的,命令行加参数都可以实现。
1、如果视频网站有提供视频对应的音频,可以直接下载它的音频
先给个视频的链接:油管有提供该视频对应的音频,然后你还不嫌乎音频的格式,那么可以用以下代码直接下载油管提供的视频对应的音频。但是如果网站没提供音频文件(比如B站好像就没有视频对应的音频),你还非要给这个网站的视频链接,则程序会毫不犹豫地报错。为了不模糊焦点,代码没有对“意外”的处理部分:
# 指定视频链接,用youtube-dl下载视频网站提供的音频文件# 如果视频网站没有提供音频文件则会报错import youtube_dl # 先安装第三方模块youtube-dlaudioFile = '/Users/shiying/Documents/PythonABC_Book/bookProg/demo/tmp/'# 音频文件存放的目标字串# 下载视频的链接,油管有提供视频对应的音频videoPage = 'https://www.youtube.com/watch?v=FLhzB_DJQb4'ydl_opts = { # ydl_opts很重要,是个字典,所有参数在这里设置 'outtmpl': audioFile+'%(title)s.%(ext)s', # 定义输出模版:指定输出的文件夹+保存的文件名 # title:视频的标题,比如将多个pdf文件合并成一个;ext:扩展名,比如m2a # 所以视频或音频的文件名就是:将多个pdf文件合并成一个.m2a 'format': 'bestaudio', # 不止一个音频文件时,选择音质最好(format标注为bestaudio)的音频下载 # 但是如果视频网站没有提供对应的音频文件,则会报错 }ydl = youtube_dl.YoutubeDL(ydl_opts) # 生成下载对象with ydl: ydl.download([videoPage]) # 下载视频,参数是列表,列表的每个元素是视频的链接
2、如果视频网站没有提供视频对应音频,或者您对视频网站提供的音频格式不满意,youtube-dl参数配合ffmpeg可以自动完成视频向音频的转换
首先要安装第三方模块ffmpeg,然而光安装第三方模块ffmpeg还不够,这个第三方模块只是包裹真正的ffmpeg的外壳,在Mac上真正的ffmpeg要用安装工具brew来安装,windows用户登陆到ffmpeg网站上下载解压文件,而后添加到Path里,具体怎么操作自己用搜索引擎搜哈。这里只说Mac上的:
安装homebrew这个安装工具本身(如果已经安装请忽略)
搜索homebrew找到它的老巢(brew.sh),拷贝主页上的安装命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
到Mac的终端,安装这个安装工具。
使用homebrew安装ffmpeg
在Mac终端敲入:brew install ffmpeg
然后就可以跟youtube-dl的postprocessors参数配合使用了。postprocessors这个参数设定视频从视频网站下载下来后该怎样处理,在这里就用ffmpeg将视频的音频抽取出来,转成指定格式,比如mp3:
# 给出视频链接,用youtube-dl下载视频,在ffmpeg帮助下将视频转换成音频import youtube_dlimport ffmpegaudioFile = '/Users/shiying/Documents/PythonABC_Book/bookProg/demo/tmp/'# 音频文件存放的目标字串# 下载视频的链接videoPage = 'https://www.bilibili.com/video/BV1vW411X7nj'# videoPage = 'https://www.youtube.com/watch?v=FLhzB_DJQb4'ydl_opts = { # ydl_opts很重要,是个字典,所有参数在这里设置 'outtmpl': audioFile+'%(title)s.%(ext)s', # 定义输出模版 'postprocessors': [ {'key': 'FFmpegExtractAudio', # 指定用FFmpeg从视频中提取音频 'preferredcodec': 'mp3', # 指定音频格式 }, ], 'keepvideo': True, # 默认视频转换成音频后删掉视频文件 # 设置为True后不删除视频,测试时反复运行,视频不必每次都下载 }ydl = youtube_dl.YoutubeDL(ydl_opts) # 生产下载对象with ydl: ydl.download([videoPage]) # 下载视频
至于format和下载播放列表的参数设定咱们下回分解: