python && ffmpeg | 批量合并在手机上下载的B站视频

背景

在手机的B站下载了很多视频,但这些视频并不是以mp4存储的
于是想把这些视频整理一下
但视频很多,自然不能一个一个用格式工厂合并,于是就想到了python

工具

注意

手机下载的B站视频有两种储存方式,短的视频采用音视频分离的m4s,长视频会被拆分成多个短的flv文件存储
这里仅解决m4s格式的处理(因为作者仅遇到了这种情况),暂时没有考虑对flv的处理
python && ffmpeg  |  批量合并在手机上下载的B站视频

完整代码

话不多说,直接贴代码

import os
import subprocess   # 进行命令行操作

def merge(inDir, outDir, ffmpeg):
    av_list = os.listdir(inDir)  # 获取视频列表,视频目录名就是视频的av号
    for av in av_list:           # 遍历每个视频,
        av_dir = inDir + "\" + av      # 拼接路径与文件名,得到每个av号的路径
        part_list = os.listdir(av_dir)   # 分P(part)的视频,每个av号会对应多个视频,在此得到part的列表

        for part in part_list:       # 遍历视频的每P
            part_dir = av_dir + "\" + part    
            # 在每个part下面,会有一个用数字命名文件夹,一个xml,一个json。猜测数字代表的是视频的清晰度
            # 我们的视频在那个用数字命名的文件夹里面
            sub_part_list = os.listdir(part_dir)   # 得到每P文件夹下的文件目录

            for sub_part in sub_part_list:     # 遍历每P下的文件
                if (sub_part.isdigit()):    # 只需要对 以数字命名的文件夹 进行操作
                    # 在以数字命名的文件夹下面,会有三个文件,其中audio.m4s和video.m4s是我们需要的
                    # 他们分别是我们下载的视频的 音频和没有声音的视频 
                    # 我们把这两个文件通过ffmpeg混流,就可以还原出之前下载的视频
                    file_path = part_dir + "\" + sub_part  
                    # file_path即为audio.m4s和video.m4s的路径
                    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的路径,注意'-i'后面有空格
    ffmpeg = 'D:\ruanjian2\ffmpeg-2022-08-31-git-319e8a49b5-full_build\bin\ffmpeg.exe -i '
    merge(inDir, outDir, ffmpeg)

if __name__ == '__main__':
    main()

分析

B站的视频默认在手机的这个文件夹里:

此电脑我的手机内部存储设备Androiddatatv.danmaku.bilidownload

这里我使用数据线连接了手机与电脑,把download整个拷到了电脑上。这里记得做好备份,以防损坏

另外安利一下这种传数据的方式,速度非常快,而且不会产生什么额外的存储占用

现在我们已经把下载的视频拷到电脑上了,下面是download目录下的内容:


python && ffmpeg  |  批量合并在手机上下载的B站视频

这些文件夹全是以数字命名的,这串数字其实就是该视频的av
然后我们打开几个看看
python && ffmpeg  |  批量合并在手机上下载的B站视频

python && ffmpeg  |  批量合并在手机上下载的B站视频
emmm....为什么有的有一个文件夹,有的有两个呢?
原因:几P(part)就会有几个文件夹,我们循环处理就好啦!
然后我们进入一个文件夹
python && ffmpeg  |  批量合并在手机上下载的B站视频

会看到这样3个文件,其中只有那个以数字命名的文件夹是对我们有用的(这个数字代表的应该是清晰度)
我们进入这个文件夹
python && ffmpeg  |  批量合并在手机上下载的B站视频

以上步骤的代码:
python && ffmpeg  |  批量合并在手机上下载的B站视频

以数字命名的文件夹下面,会有三个文件,其中audio.m4s和video.m4s是我们需要的
他们分别是我们下载的视频的音频没有声音的视频
我们把这两个文件通过ffmpeg混流,就可以还原出之前下载的视频

python && ffmpeg  |  批量合并在手机上下载的B站视频

这样就完成了!

不足(留坑)

  • 得到的视频是用av号加上P号命名的,可以用原视频标题命名,需要学习相关知识
  • 把m4s直接拼接为mp4好像会有损耗,这个还有待了解

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python && ffmpeg | 批量合并在手机上下载的B站视频 - Python技术站

(1)
上一篇 2023年4月2日 下午5:03
下一篇 2023年4月2日

相关文章

  • Python自学笔记(蟒蛇书)

    《Python编程——从入门到实践》(蟒蛇书)自学笔记 2022年9月8日 二、变量和简单数据类型 变量命名不能使用大写字母,应该以下划线分割 双引号与单引号并无区别,因此嵌套时可以更灵活 # 单行注释 可以用==判断两个字符串是否相等 字符串 str.title()每个单词的首字母大写 str.upper()把字符串全改为大写 str.lower()把字符…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部