界面


B站下载视频Url提取
需要注意的是B站的音频和视频是分开的,也就是说要下载两个东西,然后自己合并才能变成一个完整的视频,如下:
sText为请求的视频网站的内容
self.m_oRequest =requests.session()
oResult = self.m_oRequest.get(sUrl, headers=base_headers, timeout=3)
sText = oResult.text
def getVideoLinks(self, sText):
# get video download links
from public import tools
dctDownloadLink = {
}
try:
data = re.findall(r'<script>window\.__playinfo__=(.*?)</script>', sText)[0]
dctBiliData = json.loads(data)
#pprint.pprint(dctBiliData)
lstLinkData = dctBiliData['data']['dash']['video']
sAudioUrl = dctBiliData['data']['dash']['audio'][0]["base_url"].replace("http", "https")
sVideoUrl = dctBiliData['data']['dash']['video'][0]["base_url"].replace("http", "https")
dctDownloadLink["AudioUrl"] = sAudioUrl
dctDownloadLink["VideoUrl"] = sVideoUrl
except:
print("解析地址失败...")
print("下载链接 ", dctDownloadLink)
return dctDownloadLink
视频和音频的合成
这里使用了第三方软件
ffmpeg
网上下载该软件,里面会有exe执行文件,将该执行文件路径加入到系统环境变量中去
合成代码如下
# 合成音频和视频
def combineVideo(self, sAudioPath, sVideoPath, sOutputPath):
import subprocess
import ffmpeg
print("开始合成音频和视频...", sAudioPath, sVideoPath, sOutputPath)
sCmd = 'ffmpeg -i ' + sAudioPath + ' -i ' + sVideoPath + ' -vcodec copy -acodec copy -y ' + sOutputPath
subprocess.run(sCmd, shell=True)
print("合成完成...")
self.combineFinish()
知识点
线程下载
支持暂停,继续,停止
class CDownloader(QThread):
"""download class"""
oSignalDownload = pyqtSignal(QThread, int) # 下载量信号 list: value flag
oSignalFinish = pyqtSignal(QThread, int) # 下载结束信号
def __init__(self, iAvID, dctLinks):
super(CDownloader, self).__init__()
self.m_iAvID = iAvID
self.m_dctLinks = dctLinks
self.m_oEventPause = threading.Event() # pause flag
self.m_oEventPause.set() # True
self.m_oEventRunning = threading.Event() # stop flag
self.m_oEventRunning.set() # True
sScrPath = os.getcwd()
self.m_sDir = os.path.join(sScrPath, "./videos")
if not os.path.exists(self.m_sDir):
os.mkdir(self.m_sDir

本文详细介绍了一款基于Pyqt的B站视频下载软件的设计与实现过程,包括视频URL提取、音频与视频分离下载及合成、线程下载管理等关键技术点。
最低0.47元/天 解锁文章
703





