Pyqt制作B站视频下载软件

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

界面

在这里插入图片描述
在这里插入图片描述

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值