python實現音視頻下載器

一、環境準備

確保當前系統已安裝了wxPython 、 yt-dlp 和FFmpeg。當前主要支持下載youtube音視頻

1、安裝wxPython

pip install wxPython

2、安裝yt-dp

pip install wxPython yt-dlp

3、安裝FFmpeg

在Windows 10上通過命令行安裝FFmpeg,最簡便的方式是使用包管理器,比如Scoop或Chocolatey。以下是使用這兩種工具的步驟:

① 使用Scoop安裝FFmpeg

如果還沒有安裝Scoop,首先需要按照Scoop官網上的說明進行安裝。打開PowerShell并運行以下命令來安裝Scoop(如果尚未安裝):

Set-ExecutionPolicy RemoteSigned -scope CurrentUser
irm get.scoop.sh | iex

安裝完Scoop后,你可以通過以下命令安裝FFmpeg:

scoop install ffmpeg

② 使用Chocolatey安裝FFmpeg

如果更傾向于使用Chocolatey,首先確保已經安裝了Chocolatey。可以通過Chocolatey官網獲取安裝指南。
在這里插入圖片描述

通常,可以在管理員模式下的PowerShell中運行以下命令來安裝Chocolatey:

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

在這里插入圖片描述

安裝完Chocolatey后,可以通過以下命令安裝FFmpeg:

choco install ffmpeg

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
無論你選擇哪種方式安裝FFmpeg,完成后都可以通過命令行輸入以下命令來驗證是否安裝成功:

ffmpeg -version

在這里插入圖片描述

如果你看到FFmpeg的版本信息以及其他相關細節,那么說明FFmpeg已經正確安裝,并且可以通過命令行使用了。

請注意,為了使這些命令在任何目錄下都能生效,可能需要重啟計算機或者重新打開一個新的命令提示符窗口。此外,確保你的環境變量Path包含了FFmpeg的安裝路徑,這樣系統才能識別ffmpeg命令。通過上述方法安裝時,通常會自動處理好這個問題。

二、代碼編寫

編寫名字為downloader.py的python代碼文件

import wx
import yt_dlp
import threadingclass DownloaderFrame(wx.Frame):def __init__(self):super().__init__(None, title="Downloader", size=(400, 350))self.panel = wx.Panel(self)self.source_label = wx.StaticText(self.panel, label="Audio or video URL:")self.source_text = wx.TextCtrl(self.panel)self.source_label.SetBackgroundColour(wx.Colour(173, 216, 230))  # 設置背景為淺藍色self.source_label.SetForegroundColour(wx.Colour(0, 0, 128))  # 設置文本顏色為黑色,確保對比度良好self.folder_label = wx.StaticText(self.panel, label="Save Folder:")self.folder_text = wx.TextCtrl(self.panel)self.folder_label.SetBackgroundColour(wx.Colour(173, 216, 230))  # 設置背景為淺藍色self.folder_label.SetForegroundColour(wx.Colour(0, 0, 128))  # 設置文本顏色為黑色,確保對比度良好self.folder_button = wx.Button(self.panel, label="Browse...")self.folder_button.Bind(wx.EVT_BUTTON, self.browse_folder)self.quality_label = wx.StaticText(self.panel, label="Quality:")self.quality_choice = wx.ComboBox(self.panel, choices=[], style=wx.CB_READONLY)self.quality_label.SetBackgroundColour(wx.Colour(173, 216, 230))  # 設置背景為淺藍色self.quality_label.SetForegroundColour(wx.Colour(0, 0, 128))  # 設置文本顏色為黑色,確保對比度良好self.start_button = wx.Button(self.panel, label="Start Download")self.start_button.Bind(wx.EVT_BUTTON, self.start)self.process_label = wx.StaticText(self.panel, label="Percentage:")self.process_bar = wx.Gauge(self.panel, range=100)self.process_label.SetBackgroundColour(wx.Colour(173, 216, 230))  # 設置背景為淺藍色self.process_label.SetForegroundColour(wx.Colour(0, 0, 128))  # 設置文本顏色為黑色,確保對比度良好self.sizer = wx.BoxSizer(wx.VERTICAL)self.sizer.Add(self.source_label, 0, wx.ALL, 5)self.sizer.Add(self.source_text, 0, wx.EXPAND | wx.ALL, 5)self.sizer.Add(self.folder_label, 0, wx.ALL, 5)self.sizer.Add(self.folder_text, 0, wx.EXPAND | wx.ALL, 5)self.sizer.Add(self.folder_button, 0, wx.ALL, 5)self.sizer.Add(self.quality_label, 0, wx.ALL, 5)self.sizer.Add(self.quality_choice, 0, wx.EXPAND | wx.ALL, 5)self.sizer.Add(self.start_button, 0, wx.ALL, 5)self.sizer.Add(self.process_label, 0, wx.ALL, 5)self.sizer.Add(self.process_bar, 0, wx.EXPAND | wx.ALL, 5)self.panel.SetSizer(self.sizer)self.Show()def browse_folder(self, event):dlg = wx.DirDialog(self, "Choose a directory", style=wx.DD_DEFAULT_STYLE)if dlg.ShowModal() == wx.ID_OK:self.folder_text.SetValue(dlg.GetPath())dlg.Destroy()def get_video_formats(self, url):with yt_dlp.YoutubeDL({}) as ydl:info_dict = ydl.extract_info(url, download=False)#print(info_dict)  # 添加此行來查看所有可用格式formats = info_dict.get('formats', [])#print("Available formats:", formats)  # 打印所有可用格式以供調試self.quality_choice.Clear()best_format_id = None  # 初始化為Nonehas_1080p = False# 首先嘗試找到1080p或更高的視頻格式for f in formats:if 'height' in f and 'format_id' in f and f['vcodec'] != 'none' and f['acodec'] != 'none':display_str = f"{f['format_id']} - {f['height']}p"if f['height'] >= 1080:  # 檢查是否為1080p或更高if not has_1080p or f['height'] > int(best_format_id.split(" - ")[1][:-1]):best_format_id = display_strhas_1080p = True# 如果沒有找到1080p或更高的格式,則選擇其他可用的最高分辨率if not has_1080p:for f in formats:if 'height' in f and 'format_id' in f and f['vcodec'] != 'none' and f['acodec'] != 'none':display_str = f"{f['format_id']} - {f['height']}p"if best_format_id is None or ('height' in f and f['height'] > int(best_format_id.split(" - ")[1][:-1])):best_format_id = display_str# 添加所有滿足條件的格式到下拉列表中供用戶選擇for f in formats:if 'height' in f and 'format_id' in f and f['vcodec'] != 'none' and f['acodec'] != 'none':self.quality_choice.Append(f"{f['format_id']} - {f['height']}p")if self.quality_choice.GetCount() > 0:self.quality_choice.SetSelection(0)return best_format_iddef start(self, event):url = self.source_text.GetValue()save_folder = self.folder_text.GetValue()# 獲取并填充清晰度選項best_format = self.get_video_formats(url)#print(best_format)if not best_format:  # 如果沒有找到任何格式wx.MessageBox("No suitable video format found.", "Error", wx.OK | wx.ICON_ERROR)returndownload_thread = threading.Thread(target=self.download_Audio_or_video, args=(url, save_folder, best_format))download_thread.start()def download_Audio_or_video(self, url, save_folder, best_format):selected_format = self.quality_choice.GetStringSelection()format_id = selected_format.split(" - ")[0] if selected_format else best_format.split(" - ")[0]  # 提取format idoptions = {'outtmpl': f'{save_folder}/%(title)s.%(ext)s',#'format': 'best',  # 使用最佳質量'format': format_id,'progress_hooks': [self.update_progress],}try:with yt_dlp.YoutubeDL(options) as ydl:ydl.download([url])wx.CallAfter(wx.MessageBox, 'Download completed!', 'Info', wx.OK | wx.ICON_INFORMATION)except Exception as e:wx.CallAfter(wx.MessageBox, f'Download error occurred: {str(e)}', 'Error', wx.OK | wx.ICON_ERROR)def update_progress(self, progress ):if 'total_bytes' in progress and 'downloaded_bytes' in progress:percentage = int(progress['downloaded_bytes'] * 100 / progress['total_bytes'])wx.CallAfter(self.process_bar.SetValue, percentage)app = wx.App(False)
frame = DownloaderFrame()
app.MainLoop()

三、代碼運行測試

1.命令行運行測試

1.python downloader.py
在這里插入圖片描述

三、其他方式

或者直接利用exe下載工具來進行命令行下載
在這里插入圖片描述
參考文件:
https://blog.csdn.net/qq_31339083/article/details/132195733
https://blog.csdn.net/winniezhang/article/details/132127382

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77195.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 vxe-table 來格式化任意的金額格式,支持導出與復制單元格格式到 excel

使用 vxe-table 來格式化任意的金額格式,支持導出與復制單元格格式到 excel 查看官網:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table 安裝 npm install vx…

知識圖譜 數據準備

任何類型的數據格式都可以用于構建知識圖譜,只要能夠從中提取出實體(Entities)、關系(Relationships)和屬性(Attributes)。但實際操作中,不同數據格式的處理難度、工具支持和效率差異…

Docker 設置鏡像源后仍無法拉取鏡像問題排查

#記錄工作 Windows系統 在使用 Docker 的過程中,許多用戶會碰到設置了國內鏡像源后,依舊無法拉取鏡像的情況。接下來,記錄了操作要點以及問題排查方法,幫助我們順利解決這類問題。 Microsoft Windows [Version 10.0.27823.1000…

如何對Flutter應用程序進行單元測試

Flutter單元測試完全指南:從基礎到高級實踐 面試求職資源 面試試題小程序:涵蓋測試基礎、Linux操作系統、MySQL數據庫、Web功能測試、接口測試、APPium移動端測試、Python知識、Selenium自動化測試相關、性能測試、計算機網絡知識、Jmeter、HR面試等內…

go中我遇到的問題總結

go問題總結 1 - go中的nil等于java中的null嗎 在 Go 和 Java 中,nil 和 null 都用于表示“空值”,但它們的實現和使用方式有所不同。 以下是 Go 中的 nil 和 Java 中的 null 之間的對比: 1. Go 中的 nil 在 Go 中,nil 是一個預定義的常量,表示零值。它的行為根據數據類…

【android telecom 框架分析 01】【基本介紹 2】【BluetoothPhoneService為何沒有源碼實現】

1. 背景 我們會在很多資料上看到 BluetoothPhoneService 類,但是我們在實際 aosp 中確找不到具體的實現, 這是為何? 這是一個很好的問題!雖然在車載藍牙電話場景中我們經常提到類似 BluetoothPhoneService 的概念,但…

微機控制電液伺服汽車減震器動態試驗系統

微機控制電液伺服汽車減震器動態試驗系統,用于對汽車筒式減震器、減震器臺架、駕駛室減震裝置、發動機懸置軟墊總成、發動機前置楔形支撐總成等的示功圖試驗、速度特性試驗。 主要的技術參數: 1、最大試驗力:5kN; 2、試驗力測量精…

STM32+dht11+rc522+jq8400的簡單使用

1.dht11的使用 硬件:3v3,gnd,data數據線接一個gpio,三根線即可 軟件: ①dht11.c #include "dht11.h" #include "delay.h" #include "stdbool.h"static STRUCT_DHT11_TYPEDEF dht11;…

AOSP的Doze模式-DeepIdle 初識

前言 從Android 6.0開始,谷歌引入了Doze模式(打盹模式)的省電技術延長電池使用時間。如果用戶長時間未使用設備,低電耗模式會延遲應用后臺 CPU 和網絡活動,從而延長電池續航時間。根據第三方測試顯示,兩臺同樣的Nexus 5&#xff…

用Python Pandas高效操作數據庫:從查詢到寫入的完整指南

一、環境準備與數據庫連接 1.1 安裝依賴庫 pip install pandas sqlalchemy psycopg2 # PostgreSQL # 或 pip install pandas sqlalchemy pymysql # MySQL # 或 pip install pandas sqlalchemy # SQLite 1.2 創建數據庫引擎 通過SQLAlchemy創建統一接口&#xff1a…

每日一題(小白)暴力娛樂篇31

首先分析一下題意,需要求出2024的因子,因為我們要求與2024互質的數字,為什么呢?因為我們要求互質說直白點就是我和你兩個人沒有中間人,我們是自然而然認識的,那我們怎么認識呢,就是直接見面對吧…

電控---printf重定向輸出

在嵌入式系統開發中,printf 重定向輸出是將標準輸出(stdout)從默認設備(如主機終端)重新映射到嵌入式設備的特定硬件接口(如串口、LCD、USB等)的過程。 一、核心原理:標準IO庫的底層…

快速認識:數據庫、數倉(數據倉庫)、數據湖與數據運河

數據技術核心概念對比表 概念核心定義核心功能數據特征典型技術/工具核心應用場景數據庫結構化數據的「電子檔案柜」,按固定 schema 存儲和管理數據,支持高效讀寫和事務處理。實時事務處理(增刪改查),確保數據一致性&…

【17】數據結構之圖的遍歷篇章

目錄標題 圖的遍歷深度優先遍歷 Depth First Search廣度優先遍歷 Breadth First Search 圖的遍歷 從圖中某一個頂點出發,沿著一些邊訪遍圖中所有的頂點,且使用每個頂點僅被訪問一次,這個過程稱為圖的遍歷.Graph Traversal. 其中&#xff0c…

簡單接口工具(ApiCraft-Web)

ApiCraft-Web 項目介紹 ApiCraft-Web 是一個輕量級的 API 測試工具,提供了簡潔直觀的界面,幫助開發者快速測試和調試 HTTP 接口。 功能特點 支持多種 HTTP 請求方法(GET、POST、PUT、DELETE)可配置請求參數(Query …

Git進階操作

Git高階操作完全指南:解鎖專業開發工作流 前言 在當今的軟件開發領域,掌握高級Git技能已成為區分普通開發者與專業開發者的關鍵因素。根據最新的GitHub數據,熟練應用交互式暫存和Rebase等高級功能的開發者,其代碼審查通過率平均提…

Python結合AI生成圖像藝術作品代碼及介紹

為實現生成圖像藝術作品,我選用 Stable Diffusion 庫結合 Python 編寫代碼。下面先展示代碼,再詳細介紹其原理、模塊及使用方法等內容。 生成圖片代碼 import torch from diffusers import StableDiffusionPipeline# 加載預訓練模型 pipe StableDiffu…

Linux操作系統--靜態庫和動態庫的生成and四種解決加載找不到動態庫的四種方法

目錄 必要的知識儲備: 生成靜態庫: 生成動態庫: 解決加載找不到動態庫的四種方法: 第一種:拷貝到系統默認的庫路徑 /usr/lib64/ 第二種:在系統默認的庫路徑/usr/lib64/下建立軟鏈接 第三種&#xff1…

LLM中的N-Gram、TF-IDF和Word embedding

文章目錄 1. N-Gram和TF-IDF:通俗易懂的解析1.1 N-Gram:讓AI學會"猜詞"的技術1.1.1 基本概念1.1.2 工作原理1.1.3 常見類型1.1.4 應用場景1.1.5 優缺點 1.2 TF-IDF:衡量詞語重要性的尺子1.2.1 基本概念1.2.2 計算公式1.2.3 為什么需…

Leetcode 3359. 查找最大元素不超過 K 的有序子矩陣【Plus題】

1.題目基本信息 1.1.題目描述 給定一個大小為 m x n 的二維矩陣 grid。同時給定一個 非負整數 k。 返回滿足下列條件的 grid 的子矩陣數量: 子矩陣中最大的元素 小于等于 k。 子矩陣的每一行都以 非遞增 順序排序。 矩陣的子矩陣 (x1, y1, x2, y2) 是通過選擇…