本文最后更新于 2023-06-20T20:29:15+08:00
背景
在手机的B站下载了很多视频,但这些视频并不是以mp4存储的
于是想把这些视频整理一下
但视频很多,自然不能一个一个用格式工厂合并,于是就想到了python
工具
注意
手机下载的B站视频有两种储存方式,短的视频采用音视频分离的m4s
,长视频会被拆分成多个短的flv
文件存储
这里仅解决m4s
格式的处理(因为作者仅遇到了这种情况),暂时没有考虑对flv
的处理
完整代码
话不多说,直接贴代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import os import subprocess
def merge(inDir, outDir, ffmpeg): av_list = os.listdir(inDir) for av in av_list: av_dir = inDir + "\\" + av part_list = os.listdir(av_dir)
for part in part_list: part_dir = av_dir + "\\" + part sub_part_list = os.listdir(part_dir)
for sub_part in sub_part_list: if (sub_part.isdigit()): file_path = part_dir + "\\" + sub_part command = ffmpeg + '"' + file_path + '\\audio.m4s' + '"' + ' -i ' \ + '"' + file_path + '\\video.m4s' + '"' + ' -acodec copy -vcodec copy '\ + '"' + outDir + '\\' + av + "→" + part+'.mp4"' subprocess.Popen(command, stdout=subprocess.PIPE) break
def main(): inDir = "D:\\wenjian\\temp\\download" outDir = "D:\\wenjian\\temp\\download_res"
ffmpeg = 'D:\\ruanjian2\\ffmpeg-2022-08-31-git-319e8a49b5-full_build\\bin\\ffmpeg.exe -i ' merge(inDir, outDir, ffmpeg)
if __name__ == '__main__': main()
|
分析
B站的视频默认在手机的这个文件夹里:
1
| 此电脑\我的手机\内部存储设备\Android\data\tv.danmaku.bili\download
|
这里我使用数据线连接了手机与电脑,把download整个拷到了电脑上。这里记得做好备份,以防损坏
另外安利一下这种传数据的方式,速度非常快,而且不会产生什么额外的存储占用
现在我们已经把下载的视频拷到电脑上了,下面是download目录下的内容:
这些文件夹全是以数字命名的,这串数字其实就是该视频的av
号
然后我们打开几个看看
emmm….为什么有的有一个文件夹,有的有两个呢?
原因:几P(part)就会有几个文件夹,我们循环处理就好啦!
然后我们进入一个文件夹
会看到这样3个文件,其中只有那个以数字命名的文件夹是对我们有用的(这个数字代表的应该是清晰度)
我们进入这个文件夹
以上步骤的代码:
以数字命名的文件夹下面,会有三个文件,其中audio.m4s和video.m4s是我们需要的
他们分别是我们下载的视频的音频和没有声音的视频
我们把这两个文件通过ffmpeg混流,就可以还原出之前下载的视频
这样就完成了!
不足(留坑)
- 得到的视频是用av号加上P号命名的,可以用原视频标题命名,需要学习相关知识
- 把m4s直接拼接为mp4好像会有损耗,这个还有待了解