【转】python调用youtube-dl实现视频下载

摘要:
youtube-dl是一个命令行程序,用于从YouTube.com和更多网站下载视频。它需要Python解释器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中运行。而且它提供了自定义添加视频解释并发布到github上,这意味着可以对其进行修改,重新分发。ubuntu系统安装youtube-dlsudo pip install youtube-dl更新包sudo -H pip install --upgrade youtube-dl或者pip install -

youtube-dl是一个命令行程序,用于从YouTube.com和更多网站下载视频。它需要Python解释器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中运行。而且它提供了自定义添加视频解释并发布到github上,这意味着可以对其进行修改,重新分发。

ubuntu系统安装youtube-dl
sudo pip install youtube-dl

更新包
sudo -H pip install --upgrade youtube-dl
或者
pip install --upgrade youtube-dl

youtube-dl在大多数网站上都可以正常工作。但是,如果您想转换视频/音频,视频音频合成,则需要avconv或ffmpeg

添加软件源

$ sudo add-apt-repository ppa:jonathonf/ffmpeg-3

更新并安装

$ sudo apt update && sudo apt install ffmpeg libav-tools x264 x265

卸载官方源的2.8版本

$ sudo apt autoremove

先来一段简单的python脚本代码

from os import rename
import youtube_dl

def download(youtube_url):
# 定义某些下载参数
ydl_opts = {
# outtmpl 格式化下载后的文件名,避免默认文件名太长无法保存
'outtmpl': '%(id)s%(ext)s'
}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([youtube_url])

if __name__ == '__main__':
download('https://www.youtube.com/watch?v=VUOAszEiR8I')

代码执行youtube网站视频页链接,交给dowload下载,字典 ydl_opts 自定义了一些下载参数。

重命名视频文件

当你运行代码后,发现下载的视频文件命名不是你想要的样子,这里了 youtube-dl 提供了一个钩子函数进行自定义功能,代码是这样的:

class GetItem(object):

def rename_hook(self,d):
# 重命名下载的视频名称的钩子
if d['status'] == 'finished':
file_name = 'video/{}.mp4'.format(int(time.time()))
rename(d['filename'], file_name)
print('下载完成{}'.format(file_name))

def download(self,youtube_url):
# 定义某些下载参数
ydl_opts = {
'progress_hooks': [self.rename_hook],
# 格式化下载后的文件名,避免默认文件名太长无法保存
'outtmpl': '%(id)s%(ext)s',
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
# 下载给定的URL列表
result = ydl.download([youtube_url])

if __name__ == '__main__':
getItem =  GetItem()
getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

代码 d[‘status’] == ‘finished’执行,说明了当视频下载完成后,执行重命名文件名

自定义下载格式

在定义下载下载参数时可以写入format:”格式” 来控制下载的格式,youtube-dl给到了以下这些默认的格式

best:选择具有视频和音频的单个文件所代表的最佳质量格式。

worst:选择具有视频和音频的单个文件所代表的最差质量格式。

bestvideo:选择最佳质量的仅视频格式(例如DASH视频)。可能无法使用。

worstvideo:选择质量最差的纯视频格式。可能无法使用。

bestaudio:选择质量最佳的音频格式。可能无法使用。

worstaudio:选择质量最差的音频格式。可能无法使用。

我们也可以通过视频原有的格式来下载

在终端输入 : youtube-dl -F 视频地址
shell 命令查看参数

shell 命令查看参数

可以看到有h5 ,1,h3 三种格式,所以代码可以这样写:

class GetItem(object):

def rename_hook(self,d):
# 重命名下载的视频名称的钩子
if d['status'] == 'finished':
file_name = 'video/{}.mp4'.format(int(time.time()))
rename(d['filename'], file_name)
print('下载完成{}'.format(file_name))

def download(self,youtube_url):
# 定义某些下载参数
ydl_opts = {
# 我指定了要下载 “1” 这个格式,也可以填写 best/worst/worstaudio 等等
'format' : '1'
'progress_hooks': [self.rename_hook],
# 格式化下载后的文件名,避免默认文件名太长无法保存
'outtmpl': '%(id)s%(ext)s',
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
# 下载给定的URL列表
result = ydl.download([youtube_url])

if __name__ == '__main__':
getItem =  GetItem()
getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

日志打印

如果要打印youtube-dl的输出logs,请设置一个logger对象。 同自定义格式一样,配置参数’logger’: MyLogger(),如下:

class MyLogger(object):
def debug(self, msg):
pass

def warning(self, msg):
pass

def error(self, msg):
print(msg)

class GetItem(object):

def rename_hook(self,d):
# 重命名下载的视频名称的钩子
if d['status'] == 'finished':
file_name = 'video/{}.mp4'.format(int(time.time()))
rename(d['filename'], file_name)
print('下载完成{}'.format(file_name))

def download(self,youtube_url):
# 定义某些下载参数
ydl_opts = {
# 我指定了要下载 “1” 这个格式,也可以填写 best/worst/worstaudio 等等
'format' : '1'
'progress_hooks': [self.rename_hook],
# 格式化下载后的文件名,避免默认文件名太长无法保存
'outtmpl': '%(id)s%(ext)s',
# 打印日志
'logger': MyLogger()
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
# 下载给定的URL列表
result = ydl.download([youtube_url])

if __name__ == '__main__':
getItem =  GetItem()
getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

提取视频的json信息打印

现在有一个需求是:不需要下载视频,我想要得到当前页视频网站的数据,可以用 extract_info 不用 download 去下载

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
# extract_info 提取信息
result = ydl.extract_info(youtube_url, download=False)

print(result)

合并音频+视频

可以先用youtube-dl -F “视频地址”查看format信息,在选择对应的格式代号如(’format’: ‘134+m4a’,)合成,但是合成视频音频是必须先安装ffmpeg,文章开头已经介绍过,不然会报错如下:

WARNING: You have requested multiple formats but ffmpeg or avconv are not installed. The formats won’t be merged.
import youtube_dl

def download(url):

ydl_opts = {
'format': '134+m4a',
'outtmpl': '%(id)s%(ext)s'
}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
result = ydl.extract_info(url, download=True)

if __name__ == '__main__':
download('https://www.youtube.com/watch?v=-5r9oswhnY4')


转至
http://www.yujzw.com/python/python-youtube-dl.html

免责声明:文章转载自《【转】python调用youtube-dl实现视频下载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 数据存储02之文件读写 40个Android问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

BZOJ 3098: Hash Killer II(新生必做的水题)

3098: Hash Killer II Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1555  Solved: 819[Submit][Status][Discuss] Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给...

C. Painting Fence 分治

memory limit per test 512 megabytes input standard input output standard output Bizon the Champion isn't just attentive, he also is very hardworking. Bizon the Champion deci...

用随机森林分类

分类方法有很多种,什么多分类逻辑回归,KNN,决策树,SVM,随机森林等, 比较好用的且比较好理解的还是随机森林,现在比较常见的有python和R的实现。原理就不解释了,废话不多说,show me the code import csv import numpy as np from sklearn.ensemble import RandomForest...

Python基础【day01】:python 2和3区别(四)

许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本。等学得差不多了,再来研究不同版本之间的差别”。 但如果想要用Python开发一个新项目,那么该如何选择Python版本呢?我可以负责任的说,大部分Python库都同时支持Pyt...

boruvka算法

一个mst算法。 其用于求解一些特殊的mst问题。 例题1:CF888F 我们要求一个集合到外面的最小边。 对于每个集合维护一个trie表示这个集合内的所有数。 维护一个整体trie,表示所有数。 对于每个集合,枚举这个集合的所有点。然后询问整体trie减去这个集合trie的最小异或和即可。 时间复杂度(O(nlog_2^2n)) 当然还有一个做法:考虑按...

Qt开源作品31-屏幕截图控件

一、前言 屏幕截图控件在我的很多项目中都有用到,尤其是嵌入式的系统上的软件,因为在嵌入式系统中,基本上系统都很精简,甚至连UI都没有,开机之后直接运行的就是Qt程序,很多时候需要对软件进行截图保存下来,用来编写文档和介绍,还有产品彩页之类的,毕竟在板子上直接运行的效果是最好的,还有一种办法是将系统编译成win的版本,用系统的截图来,但是嵌入式上很多代码其实...