【转】python调用youtube-dl实现视频下载
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实现视频下载的更多相关文章
- 手把手教你用python打造网易公开课视频下载软件2-编码相关说明
函数getdownLoadInfo(url)主要实现核心功能:根据url地址,获取课程信息:课程名(courseTitle),课程数目(courseCount),可下载视频数目(videoCount) ...
- 手把手教你用python打造网易公开课视频下载软件1-总述
写作前面的话:最近准备重温一下算法导论,感谢大网易把MIT算法导论课程全部贴出来,地址为:http://v.163.com/special/opencourse/algorithms.html,在线看 ...
- 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理
上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...
- 手把手教你用python打造网易公开课视频下载软件4-图形化界面
上一篇讲解完函数:def getdownLoadInfo (url): 传入公开课的url地址,就可以提取课程的信息,这一篇讲解一下如何编写图像化界面.大概思考一下图像化界面需要的内容: (1)一个标 ...
- 手把手教你用python打造网易公开课视频下载软件5-python生成exe程序
python程序生成exe文件,使用的是py2exe扩展包,下面写下具体的步骤: 第一步:新建conver2exe.py,内容如下: #coding:utf-8 from distutils.core ...
- python调用mediainfo工具批量提取视频信息
写了2个脚本,分别是v1版本和v2版本 都是python调用mediainfo工具提取视频元数据信息 v1版本是使用pycharm中测试运行的,指定了视频路径 v2版本是最终交付给运营运行的,会把v2 ...
- Python: 调用youtube_dl实现视频下载
研究PySide与youtube_dl结合实现视频下载,抽丝剥蚕,步步维艰,却也颇有意思. 记录初始心得.界面以PySide之Qt编写,调用youtube_dl下载,回调出下载进度,代码如下: # e ...
- Python:使用youtube-dl+ffmpeg+FQ软件下载youtube视频
声明:本文所述内容都是从http://blog.csdn.net/u011475134/article/details/71023612博文中学习而来. 背景: 一同学想通过FQ软件下载一些youtu ...
- 用python做youtube自动化下载器 代码
目录 项目地址 思路 流程 1. post i. 先把post中的headers格式化 ii.然后把参数也格式化 iii. 最后再执行requests库的post请求 iv. 封装成一个函数 2. 调 ...
随机推荐
- Bootstrap++:bootstrap-select 使用
效果图: HTML: <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.or ...
- bubble排序
故事的起因:好久没有用bubble了,,,居然忘记了基本格式........ 经过:,,,,这可算是我学的第一个比较有用的"算法"啊...这怎么行! 结果: void bubbleSort (elem ...
- Arduino+温度、湿度传感器
Arduino语言注解Arduino语言是建立在C/C++基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让我们 ...
- 设置x 轴斜体(每次我都百度,这次单独为它发一个)
plt.xticks(rotation = 45) 2020-06-07
- PHP symlink() 函数
定义和用法 symlink() 函数创建一个从指定名称连接的现存目标文件开始的符号连接. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 symlink(target,link) ...
- PHP strrpos() 函数
实例 查找 "php" 在字符串中最后一次出现的位置: <?php高佣联盟 www.cgewang.comecho strrpos("I love php, I l ...
- 32-关键字:abstract
abstract: 抽象的 1.可以用来修饰:类.方法 2.具体的:abstract修饰类:抽象类 * > 此类不能实例化 * > 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对 ...
- 19-关键字package和import
1. package的使用1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识符 ...
- Android Studio项目组织结构
任何一个新建的项目都会默认使用一个Android模式的项目结构,这个结构是被Android Studio转换过的,适合快速开发,但不易于理解,切换到Project模式后如下: 重点认识一下重要的几个文 ...
- DCGAN实现
DCGAN实现 代码 dcgan.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os import math import argpa ...