python实现多线程从b站下载多个视频并合并

前言

疫情期间每天坚持在家运动,都是从B站上看的视频,每天要做好几个视频。可能因为自己懒的缘故,就想着能不能把自己要做的运动个性化的合成一个视频。万事对于程序员来说,只要有规律,万事皆可肝。计划过段时间写一写人工智能的专栏,希望能见证到一个小白的成长之路。

准备工作

  1. python3环境
  2. pip install you-get如果需要更新的话用pip install --upgrade you-get进行更新
  3. 将下载好的flv格式转为MP4,如果直接下载的就是MP4则跳过这步
  4. 合并MP4文件,bingo

使用you-get进行多线程下载

关于you-get的适用范围我找了一篇文章
链接you-get的使用及安装说明
各个文章都介绍的比较详细,其实只需要你win+R打开cmd,输入

  • pip install you-get
  • you-get “URL”
    这时候下载的flv文件默认存在C:\Users\用户名\,但不建议这么操作,因为不好整理
  • 所以使用
    you-get -o 你想存放的路径 “URL”

更多的使用方法大家可以自行查找,这是一个很强大的库,可从各个地方下载视频。
我是在Python中调用了os和you-get包实现的多线程下载,确实比一个一个下载要快,适用于多个视频下载,代码如下:

import sys
from you_get import common as you_get
from multiprocessing import Pool

# 路径自己定义
directory = r'D:\python_work\project\downloadMP4\mp4'
urls = []
def download(urls):
    sys.argv = ['you-get', '-o', directory, '--no-caption', urls]
    you_get.main()


if __name__ == '__main__':
#这里你可以添加自己想下载的链接
    urls .append("https://www.bilibili.com/video/BV1w7411M7yk")#天鹅臂
    urls.append("https://www.bilibili.com/video/BV1bJ411a72W")#核心训练
    urls.append("https://www.bilibili.com/video/BV1JW411o7Jq")#xo型腿
    urls.append("https://www.bilibili.com/video/BV1yb411G7Me?p=5")#拉伸
    pool = Pool(4)
    pool.map(download, urls)
    pool.close()
    pool.join()

将下载好的flv文件转成MP4

这步我也没有找到很好的方法,开始我计划直接用视频转换器,下面贴一个视频转换器的链接。直接下载下来就是MP4格式可以跳过这一步。
链接:https://www.xunjieshipin.com/video/flv2mp4
但是有个鸡肋的问题,文件大小不超过20M。。。。emmmm,黑人问号脸,然后我又去查了查资料,推荐第二种方法:系统自带copy/b超级方便

  1. win+R打开cmd
  2. 切换至相应路径,先cd到相应磁盘,我是d盘,就是 cd d:
  3. cd 文件所在目录
  4. copy/b 1.flv 1.mp4
    如下
    用系统命令进行转换格式

将多个MP4视频进行合并

环境依赖

  • pip install moviepy
  • pip install ffmpeg
  • pip install natsorted

代码如下:

# 主要是需要moviepy这个库
from moviepy.editor import *
import os
from natsort import natsorted

L = []

for root, dirs, files in os.walk("D:\python_work\project\downloadMP4\mp4"):
    # 按文件名排序
    files.natsorted(files)
    # 遍历所有文件
    for file in files:
        # 如果后缀名为 .mp4
        if os.path.splitext(file)[1] == '.mp4':
            # 拼接成完整路径
            filePath = os.path.join(root, file)
            # 载入视频
            video = VideoFileClip(filePath)
            # 添加到数组
            L.append(video)

# 拼接视频
final_clip = concatenate_videoclips(L)

# 生成目标视频文件
final_clip.to_videofile("mp4/target.mp4", fps=24, remove_temp=False)

总结

遇事多百度,万事皆有规律则万事皆可编码。虽然这次耗费了好几个小时,但是以后再截取视频的时候就只需要改几个路径,还是省了不少功夫。
延续我的每日一句,今日份的小确幸:
把小蛋糕敲晕了再吃,安抚可乐等气消了再喝,夹心饼干劝分了再泡牛奶。
——————《菊次郎的夏天》

要使用多线程队列读取四个USB摄像头并合并显示,你可以使用Python的`opencv-python`库和`threading`模块。以下是一个示例代码: ```python import cv2 import threading from queue import Queue # 摄像头索引列表 camera_indexes = [0, 1, 2, 3] # 摄像头读取线程类 class CameraThread(threading.Thread): def __init__(self, camera_index, queue): threading.Thread.__init__(self) self.camera_index = camera_index self.queue = queue def run(self): cap = cv2.VideoCapture(self.camera_index) while True: ret, frame = cap.read() if not ret: break self.queue.put((self.camera_index, frame)) cap.release() # 显示摄像头线程类 class DisplayThread(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): # 创建一个窗口来显示合并的图像 cv2.namedWindow("Merged Video", cv2.WINDOW_NORMAL) while True: # 获取队列中的帧 frames = [] for _ in range(len(camera_indexes)): if self.queue.empty(): break frames.append(self.queue.get()) # 检查是否成功获取到所有帧 if len(frames) != len(camera_indexes): continue # 合并图像 merged_frame = merge_frames(frames) # 在窗口中显示合并的图像 cv2.imshow("Merged Video", merged_frame) # 按下 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() # 合并图像函数 def merge_frames(frames): # 确定合并后的图像大小 merged_height = frames[0][1].shape[0] merged_width = frames[0][1].shape[1] * len(frames) merged_channels = frames[0][1].shape[2] # 创建一个空白的合并图像 merged_frame = np.zeros((merged_height, merged_width, merged_channels), dtype=np.uint8) # 将每个摄像头的帧复制到合并图像中 for i, frame in enumerate(frames): x_start = i * frame[1].shape[1] x_end = x_start + frame[1].shape[1] merged_frame[:, x_start:x_end, :] = frame[1] return merged_frame # 创建队列 queue = Queue(maxsize=4) # 创建摄像头读取线程 camera_threads = [] for index in camera_indexes: thread = CameraThread(index, queue) camera_threads.append(thread) # 创建显示摄像头线程 display_thread = DisplayThread(queue) # 启动线程 for thread in camera_threads: thread.start() display_thread.start() # 等待线程结束 for thread in camera_threads: thread.join() display_thread.join() ``` 在代码中,我们创建了`CameraThread`类和`DisplayThread`类来分别处理摄像头读取和显示。`CameraThread`类负责从摄像头读取帧并将其放入队列中,而`DisplayThread`类负责从队列中获取帧并合并显示。我们使用了多线程来同时读取和显示四个摄像头的帧,并在一个窗口中合并显示这些图像。 你需要根据实际情况修改`camera_indexes`列表中的摄像头索引,确保索引与你的USB摄像头对应。运行代码后,将会打开一个窗口,显示合并的图像,其中包含四个摄像头的实时图像。按下 'q' 键以退出程序。 请注意,在同时处理多个摄像头时,可能会遇到性能问题。如果需要更高的性能,你可以尝试使用多线程加速或使用更高性能的设备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值