天津11选5开奖走势:python腳本調用youtube-dl實現視頻下載

作者: 魯智深 分類: Python 發布時間: 2018-08-03 02:29

天津11选5中奖结果 www.ebzvaz.com.cn youtube-dl是一個命令行程序,用于從YouTube.com和更多網站下載視頻。它需要Python解釋器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中運行。而且它提供了自定義添加視頻解釋并發布到github上,這意味著可以對其進行修改,重新分發。

ubuntu系統安裝youtube-dl

1
sudo pip install youtube-dl

更新包

1
sudo -H pip install --upgrade youtube-dl

或者

1
pip install --upgrade youtube-dl

youtube-dl在大多數網站上都可以正常工作。但是,如果您想轉換視頻/音頻,視頻音頻合成,則需要avconv或ffmpeg

1
2
3
4
5
6
7
8
# 添加軟件源
$ 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腳本代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 提供了一個鉤子函數進行自定義功能,代碼是這樣的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 三種格式,所以代碼可以這樣寫:

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
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(),如下:

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
34
35
36
37
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 去下載

1
2
3
4
5
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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')

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

發表評論

電子郵件地址不會被公開。 必填項已用*標注