最近想学习后端,又不想花钱,怎么办呢?于是在手机端B站(哔哩哔哩)上面找到了满意的免费视频教程,但是手机端看起来很不方便啊。于是,我通过在手机端缓存下来后,导入到了电脑端,但是我后面了发现两个问题:

  1.本来一集视频按理说一段吧,但是B站下载下来的视频并不是完整的一段,而是被分成了多段blv格式的视频,所以需要想办法把它们拼接成完整的一段视频!

  

  2.视频数量太大,不可能一个一个去修改,得想办法批量处理!(我这里有120个视频文件夹,下图所示,没显示完)

  

  基于上述两个问题,必须用一种方法快速解决!网上百度查了一些资料,觉得可行性很大,于是准备自己动手写代码来实现这一功能。人生苦短,我学Python!哈哈,就是Python没错了,话不多说,直接上自己用python写的批量合并并转换B站视频格式的源代码:

#批量合并特定文件夹下的视频文件,然后输出到指定文件夹下
# 主要是需要moviepy这个库
from moviepy.editor import *
import os
from natsort import natsorted
import json# psutil是一个跨平台库能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.
import psutil# 杀死moviepy产生的特定进程
def killProcess():# 处理python程序在运行中出现的异常和错误try:# pids方法查看系统全部进程pids = psutil.pids()for pid in pids:# Process方法查看单个进程p = psutil.Process(pid)# print('pid-%s,pname-%s' % (pid, p.name()))# 进程名if p.name() == 'ffmpeg-win64-v4.1.exe':# 关闭任务 /f是强制执行,/im对应程序名cmd = 'taskkill /f /im ffmpeg-win64-v4.1.exe  2>nul 1>null'# python调用Shell脚本执行cmd命令
                os.system(cmd)except:pass
if __name__ == '__main__':#循环体for i in range(120):#提取对应视频标题的json文件路径myjsondirs = './video/{}/entry.json'.format(i + 1)#定义拼接完成后视频的标题vdtitle = ''with open(myjsondirs, 'r', encoding='UTF-8') as load_f:# loads方法将json格式数据转换为字典(读取文本用此法)load_dict = json.load(load_f)vdtitle = load_dict['page_data']['part']#视频文件夹路径mydirs = './video/{}/lua.flv.bili2api.80'.format(i+1)# 定义拼接视频的数组L = []# 访问 video 文件夹# root指的是当前正在遍历的这个文件夹的本身的地址,dirs是一个 list,内容是该文件夹中所有的目录的名字(不包括子目录),files同样是 list,内容是该文件夹中所有的文件(不包括子目录)for root, dirs, files in os.walk(mydirs):# 按文件名排序# files.sort()# 自然排序法files = natsorted(files)# print(files)# 遍历所有文件for file in files:# os.path.splitext(“文件路径”)    分离文件名与扩展名:默认返回(fname, fextension)元组,可做分片操作# 如果后缀名为 .blvif os.path.splitext(file)[1] == '.blv':# .blv格式视频的完整路径filePath = os.path.join(root, file)# 读取视频到内存myvideo = VideoFileClip(filePath)# 添加到数组
                    L.append(myvideo)# 对多个视频在时长上进行拼接final_clip = concatenate_videoclips(L)targetdir = './target/{}.mp4'.format(vdtitle)# 法一:生成目标视频文件方法# final_clip.to_videofile(targetdir, fps=24)#法二:最常规的生成目标视频文件方法final_clip.write_videofile(targetdir,fps=24, remove_temp=True)  #remove_temp=True表示生成的音频文件是临时存放的,视频生成后,音频文件会自动处理掉!若为False表示,音频文件会同时生成!print("{}---{}---拼接成功!".format(i + 1, vdtitle))killProcess()

注意:因为moviepy拼接视频特别慢,自己电脑配置也不行,要把120个文件夹下的视频拼接完成需要很多时间!

经过一晚的运行,顺利合并了成了120个视频,结果如下:

总的来说合并后的视频,画质还是不错的!

过程中遇到的一些问题:

  其实我个人觉得写代码,遇到问题才是最有意思的,当把这一个一个的问题都解决掉,这种感觉才是真的nice!显然我自己在处理合并B站视频时遇到了一些问题,这里记录下来,方便自己也方便他人查阅学习!

问题1:真正拼接视频时,发现会报错 OSError: [WinError 6] 句柄无效!

解决办法:调用自定义函数killProcess()杀死moviepy产生的特定进程!

原因:这是因为调用了moviepy的concatenate_videoclips函数,没有及时杀死进程!如果不加杀死进程的程序,循环一次,在任务管理器就会新产生一个ffmpeg-win64-v4.1.exe的进程,这个进程数量过多,windows任务管理器并不会自动杀死这些进程,而运行的python程序就会报错!所以我在程序里添加了杀死ffmpeg-win64-v4.1.exe进程的程序,这样拼接完成一个视频,就调用函数强行杀死ffmpeg-win64-v4.1.exe进程,保证pycharm里面的ffmpeg-win64-v4.1.exe进程不会无限增长下去导致程序报错!

问题2:报错 psutil._exceptions.NoSuchProcess: psutil.NoSuchProcess no process found with pid 5764

解决办法:添加try...except 处理,使python程序能够处理在运行中出现的异常和错误。

原因:没有发现指定的进程引起的程序报错!

注意:命令 cmd = 'taskkill /f /im ffmpeg-win64-v4.1.exe 2>nul 1>null',这里的2>nul:表示不输出错误信息   1>nul:表示不输出成功的信息

--------------------喜欢就点个赞呗,嘻嘻嘻----------------------

转载于:https://www.cnblogs.com/FHC1994/p/10760809.html

Python批量合并处理B站视频相关推荐

  1. 使用python批量重命名b站视频文件

    守护全世界最好的bilibili   我先来吹一波b站,起初知道b站大概是我高中毕业那段时间,当时b站貌似主打二次元,当时的我挺喜欢看动漫的,于是就注册了一个.想想当时注册的id你就知道我有多中二了@ ...

  2. 从入门到入土:Python实现爬取某站视频|根据视频编号|支持通过视频名称和创作者名称寻找编号|以及python moviepy合并音频视频

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) Python实现爬取某站视频|根据视频编号|支持通过视频名称 ...

  3. 曝肝三天,两千行Python代码,制作B站视频下载工具(附源码)

    曝肝三天,两千行Python代码,制作B站视频下载工具(附源码) 文章目录 一.准备工作 二.预览 1.启动 2.解析 3.下载中 4.下载完成 5.结果 三.设计流程 1.bilibili_vide ...

  4. python批量合并单元格_Python批量合并有合并单元格的Excel文件详解

    合并单元格 合并单元格相信大家都会,比如下面这段简单的代码就可以实现: app='Word' word=win32.gencache.EnsureDispatch('%s.Application' % ...

  5. 如何使用python批量合并excel表格

    使用Python批量合并Excel表格的方法主要可以通过Pandas库来实现,具体步骤如下: 首先需要导入Pandas库和os库: import pandas as pd import os

  6. python批量合并单元格的快捷键_关于Python批量合并有合并单元格的Excel文件详解...

    经常使用Excel的用户都知道,合并单元格的存在,这篇文章主要给大家介绍了关于利用Python如何批量合并有合并单元格的Excel文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具 ...

  7. python:实现合并多张图片成视频(附完整源码)

    python:实现合并多张图片成视频 使用OpenCV库来实现将多张图片合成为视频的操作,以下是Python代码示例: import cv2 import os# 图片文件夹路径 img_folder ...

  8. python下载文件并改名_用 Python 给下载的 B 站视频文件批量改名

    有好几位网友私下里问我如何学习平面设计?我告诉他们:如果只想自学的话,可以先到"哔哩哔哩"网站(俗称 B 站)找视频教程看看.要是觉得哪个教程不错,还可以下载到电脑或手机上随时随地 ...

  9. Python批量下载Bilibili(B站)1080P60fps视频-pip打包安装

    BiliUtil Bilibili.com(B站)视频下载工具包 Github源码地址:https://github.com/wolfbolin/BiliUtil 声明:该内容仅供学习参考,请勿用于商 ...

最新文章

  1. 框架模式 MVC 在Android中的使用
  2. Android View 的onDraw 和 draw 一定会调用吗?
  3. 线性回归损失函数为什么要用平方形式
  4. LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
  5. 【CyberSecurityLearning 53】信息收集
  6. jstack会导致JVM停顿
  7. Vue报错:sockjs.js?9be2:1627 GET http://192.168.43.88:8080/sockjs-node/info?t=1631603986586 net::ERR_CO
  8. [debug+Python] 复制字典不能直接用 ‘=’,要用dict_name.copy()
  9. oracle数据库中最小的逻辑结构,Oracle数据库中基本逻辑结构简介
  10. ZooKeeper 这么牛逼,基本原理你懂吗?
  11. 随笔小杂记(六)——tqdm进度条显示出现多余行
  12. FAQ 工作薄及工作表
  13. 如何禁止更改IE的代理服务器设置(转)
  14. iphone控制中心自定义没有计算机,科技:如何在iOS上使用和自定义控制中心
  15. php布道师,百度智能小程序宣布“布道师”计划 昭原集团加入合作阵营
  16. CentOS 7重启报错:Entering emergency mode. Exit the shell to continue...
  17. XML里的<![CDATA[<=]]>是什么意思?
  18. webRTC(十五):webrtc 文件实时传输
  19. 64位FME Server 与32位FME Desktop协同处理MDB格式数据
  20. ToggleButton图片按钮的两种制作方法

热门文章

  1. 不间断:即使被刺破,新的软电子设备也不会损坏
  2. STM32-增量式旋转编码器测量
  3. 自学Java day24 一篇文章弄懂mySQL基础命令 从jvav到架构师
  4. php常用抽奖概率算法(抽奖,大转盘,广告首选)
  5. Eclipse连接Hadoop集群(详细版)
  6. 手机 APP 安全登录的几种方式
  7. 领克02linux车机怎么升级,你们想看的领克02长测报告来了,一篇读懂02的车机系统...
  8. Apollo星火计划学习笔记——第六讲上自动驾驶感知基础(I)
  9. 青山~深入理解mysql
  10. 【机器学习】——逻辑模型:树模型(决策树)