前言
youtube, facebook,twitter 中视频都是属于流媒体,m3u8格式。这种格式音频,视频,字幕都是分开存储。直接下载肯定不行,需要第三方库。于是在github 进行了一翻搜索,找到了它,youtube-dl, 有许多第三方应用都是基于这个库进行的二次开发。
youtube-dl 介绍
youtube-dl 是github 中大名鼎鼎的三方库,有几千的star。主要用于下载网页中各种视频,并实现视频格式的转化。去年还曾因版权问题被美国政府下架。
URL : github.com/ytdl-org/yo…
youtube-dl 主要包括两部分: 二进制程序(exe)和对各编程语言的接口(python,java)
exe 不需要其它辅助库,可以直接运行。只需输入网页的url, 它会自动分析出网页中的视频并下载,命令如下:
youtube-dl https://www.youtube.com/watch?v=qlsg3RHgeOQ
python 环境下使用
要求:python 3+, ffmpeg, youtube-dl库
首先需要安装python 3+, ffmpeg.
ffmpeg 是音视频处理中老大哥,因为开源,因为早,很多项目都是基于这个库开发的。
ffmpeg 在windows 2012服务器安装时,报MFlat.dll missing 的错,后改用www.gyan.dev/ffmpeg/buil… ffmpeg-git-full.7z 这个包才解决。
youtube-dl 调用时,要用到ffmpeg,ffprog, 下载后把bin 路径加到Path .
python 中调用
from __future__ import unicode_literals
import youtube_dl
class MyLogger(object):
def debug(self, msg):
pass
def warning(self, msg):
pass
def error(self, msg):
print(msg)
def my_hook(d):
if d['status'] == 'finished':
pass
ydl_opts = {
'format':'bestvideo[height<=480]+bestaudio/best[height<=480]',
'outtmpl': filename,
# 'outtmpl': 'c:/images/%(id)s%(ext)s',
# 'cookiefile':'fbcookie.txt',
'postprocessors': [{
'key': 'FFmpegVideoConvertor',
'preferedformat': 'mp4'
}],
'logger': MyLogger(),
'progress_hooks': [my_hook],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
参数说明:
format: 视频格式,在下载时,默认的下载格式可能非常大,最好指定一个较小的视频尺寸
outtmpl:输出文件名,可以包括绝对路径或相对路径,默认在当前目录下,有一些格式符如:id,title,ext 输出不同的文件名,我在测试这个参数时,发现文件后缀不一定是你指定的,如你定义 outtmpl: 'c:\xxx.mp4' 最终的文件名可能是mkv, 导致 回写数据库时,有可能错误,我也在找回写的文件名参数,可惜没有找到。后来发现 postprocessors 参数可以强制把 视频转成 mp4 格式的,勉强解决了这个问题。
cookiefile: 有些网站的视频需要登陆,可以把登陆后的cookie 写到文件里, (cookie 要求是netscape HTTP cookie格式, 可以借住 EditThisCookies 这个chrome 插件导出)
logger和progress_hooks 是下载过程中进度提示,可以打印出来看下 ^_^
以上是我对python 中调用的一些理解, 在官网上 这些参数说明很少(主要是实例少),我也是爬了不少网页才搞明白。希望后面的人可以少走点弯路。