Python实现B站MP4格式音频与视频的合并!超详细的教程!

python 使用 ffmpeg 合并音频+视频 import subprocess def video_add_mp4(file_name,mp4_file): outfile_name = file_name.split('.')[0] + '-new.mp4' cmd = f'F:\\FFmpeg\\bin\\ffmpeg -i {mp4_file} -i {file_name} -acodec copy -vcodec copy {outfile_name}' print(cmd) subprocess.call( 阅读详情

安装

官网下载

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

http://ffmpeg.org/

选择需要的版本

在这个网址下载ffmpeg, https://github.com/BtbN/FFmpeg-Builds/releases

将解压后得到的以下几个文件放置在 E:\FFmpeg 下

环境变量

此电脑--属性--高级系统设置--环境变量

在系统变量(也就是下面那一半)处找到新建,按如下所示的方法填写

再将 %FFMPEG_HOME% 以及 %FFMPEG_HOME%\bin 写入系统变量的Path中

然后一路确定即可

验证

win+R,cmd

输入 ffmpeg -version 

ffmpeg的使用

对于我将B站PC端缓存的音频mp4和视频mp4文件合并的需求,需要用到的命令为:

ffmpeg.exe -i audio1.mp4 -i video.mp4 -acodec copy -vcodec copy output.mp4 

可以把mp4的文件设置成绝对路径,这样就可以转换指定路径的文件以及保存到指定路径了,比如这样:

ffmpeg.exe -i "E:\哔哩哔哩视频\ss27993\77413703\1\audio1.mp4" -i "E:\哔哩哔哩视频\ss27993\77413703\1\video.mp4" -acodec copy -vcodec copy "E:\B站导出视频\Dr.STONE石纪元\第22话宝物.mp4 

通过PC端缓存的未合并的视频和音频,全都是命名为video.mp4和audio.mp4

PS:有些兄弟是导出的手机端缓存的视频和音频,是m4s格式的,方法也一样

但光有这条命令还不够,需要自己手动一个个操作,太麻烦了

因此我还需要使用Python来自动帮我完成工作

Python实现自动处理

虽然Python可以实现自动化,减少时间的浪费,但最快的还是以后记得缓存时勾选自动合并

文件结构

PC端缓存的视频保存的文件结构有很多种,我只是根据我碰到的情况写的,但大同小异,修改起来也不麻烦,只是再加个if和else罢了

番剧缓存结构

缓存的番剧是这种结构:

上面举的例子是Dr.stone石纪元,我缓存的鬼灭之刃也是如此

特点是在一个以视频ID号名称的文件夹(ss27993)后,跟着许多子文件夹(57983089等),然后在这些子文件夹中又有一个或多个子文件夹(比如1),然后缓存的视频保存在这个文件夹里,里面有一个info文件(就是json格式),还有audio1.mp4和video.mp4。

PS:

还有一个xml文件,是弹幕信息,暂时我不知道怎么处理

常规缓存结构

除了番剧,一般的视频缓存的结构是这样的

不难看出,这比番剧要少一个层级

文件信息

文件信息主要由info文件和dvi文件来记录

这两种文件都可以直接以json文件来处理,也就是,首先open函数打开文件,然后用json.load转成字典。。。

然后我还发现了一个特点是,视频和音频所在的目录下是info文件,而它的上一层目录下是dvi文件

虽然文件格式基本是一致的,但是里面的键-值关系却不一致,单集视频的名称在番剧中对应的是键 Description ,在其他视频中对应的是 PartName 
视频总的名称保存在外层的目录下的info文件或dvi文件中,番剧中对应的键是 SeasonTitle ,在其他视频中对应的是 Title 

具体问题具体分析,首先由于我实践得较少,这样的总结不一定对,然后以后也许也会有新的格式、新的变化

代码

具体代码

以下是我的Python代码,你可以先试试能不能用,用不了的话,可以在理解的基础上修改。理解不了的话可以看我的后面的解释,以及代码中的注释,对于运行过程中一些变量的值,我都把它放在注释中了,方便你理解。

# -*- coding = utf-8 -*-
# @time:2020/10/17/017 23:09
# Author:cyx
# @File:main.py.py
# @Software:PyCharm

# 从.info文件中获得了Title信息,但是如果其中有某些特殊字符,保存时可能出现问题
def get_correct_title(title):

    error_set = ['/', '\\', ':', '*', '?', '"', '|', '<', '>', '\b', ' ', '.']
    correct_title = title
    # print(title)
    for c in correct_title:
        if c in error_set:
            correct_title = correct_title.replace(c, '')
    return correct_title

def popen(cmd):
    # https://blog.youkuaiyun.com/qq_41451161/article/details/82901235
    try:
        popen = subprocess.Popen(cmd, stdout=subprocess.PIPE)
        popen.wait()
        lines = popen.stdout.readlines()
        return [line.decode('gbk') for line in lines]
    except BaseException as e:
        return -1

if __name__ == '__main__':
    import os
    import json
    import subprocess

    # ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a aac -strict experimental output.mp4
    # ffmpeg.exe -i audio1.mp4 -i video.mp4 -acodec copy -vcodec copy output.mp4
    AVhao = input("请输入视频AV号:")
    superPath = "E:\\哔哩哔哩视频" + "\\" + AVhao
    partDirs = []  # 保存每P视频所在的文件夹路径
    paths = os.listdir(superPath)  # 获取当前路径下所有的文件(包括文件夹)名称
    # paths = ['8','9']
    # 有时候,会莫名其妙的少了几个视频,可以通过重载来重新加载缺失的视频
    # print(paths)
    # paths
    # ['27993.info', '57983089', '58612211', '59811008', '60862133', '61898240', '62925012', '64005445', '65020725', '66013155', '66808912', '67587875', '68398229', '69175748', '70021307', '70873680', '71617211', '73379440', '74051851', '74974157', '75746600', '76619409', '77413703', '78266594', '79070874', 'cover.jpg', 'desktop.ini']
    # 获取每P视频所在的文件夹路径
    savePos = ''
    seq = []
    # 鉴于有些up主命名时毫无规律,导出后无法正常排序,只能手动排序了
    # 根据AV号名文件夹下的子文件夹的名称进行排序,但是番剧的话不是这样排序,不过番剧单集的名称很规范,不需要这样
    for p in paths:
        if '.' not in p:
            seq.append(p)
        if 'info' in p:
            # print(p)
            # p:
            # 27993.info
            info = superPath + "\\" + p
            with open(info, 'r', encoding='utf-8') as load_f:
                load_dict = json.load(load_f)
                projectTitle = load_dict['SeasonTitle']
                projectTitle = get_correct_title(projectTitle)
                savePos = 'E:\\B站导出视频\\' + projectTitle
                print('savePos: ', savePos)

        if 'dvi' in p:
            # print(p)
            # P:
            # 328738595.dvi
            dvi = superPath + "\\" + p
            with open(dvi, 'r', encoding='utf-8') as load_f:
                load_dict = json.load(load_f)
                projectTitle = load_dict['Title']
                projectTitle = get_correct_title(projectTitle)
                savePos = 'E:\\B站导出视频\\' + projectTitle
                print('savePos: ', savePos)
        # 防止文件存在时再次生成该文件夹出现错误
        try:
            os.mkdir(savePos)
            break
        except:
            pass

        subDir = superPath + "\\" + p
        if os.path.isdir(subDir):
            # print(subDir)
            # 所有子文件夹的路径保存在partDirs中
            partDirs.append(subDir)
    # print("partDirs: ",partDirs)
    # partDirs:  ['E:\\哔哩哔哩视频\\ss27993\\57983089', 'E:\\哔哩哔哩视频\\ss27993\\58612211', 'E:\\哔哩哔哩视频\\ss27993\\59811008', 'E:\\哔哩哔哩视频\\ss27993\\60862133', 'E:\\哔哩哔哩视频\\ss27993\\61898240', 'E:\\哔哩哔哩视频\\ss27993\\62925012', 'E:\\哔哩哔哩视频\\ss27993\\64005445', 'E:\\哔哩哔哩视频\\ss27993\\65020725', 'E:\\哔哩哔哩视频\\ss27993\\66013155', 'E:\\哔哩哔哩视频\\ss27993\\66808912', 'E:\\哔哩哔哩视频\\ss27993\\67587875', 'E:\\哔哩哔哩视频\\ss27993\\68398229', 'E:\\哔哩哔哩视频\\ss27993\\69175748', 'E:\\哔哩哔哩视频\\ss27993\\70021307', 'E:\\哔哩哔哩视频\\ss27993\\70873680', 'E:\\哔哩哔哩视频\\ss27993\\71617211', 'E:\\哔哩哔哩视频\\ss27993\\73379440', 'E:\\哔哩哔哩视频\\ss27993\\74051851', 'E:\\哔哩哔哩视频\\ss27993\\74974157', 'E:\\哔哩哔哩视频\\ss27993\\75746600', 'E:\\哔哩哔哩视频\\ss27993\\76619409', 'E:\\哔哩哔哩视频\\ss27993\\77413703', 'E:\\哔哩哔哩视频\\ss27993\\78266594', 'E:\\哔哩哔哩视频\\ss27993\\79070874']
    videoPos = ''
    i = 0
    for p in partDirs:
        # print(p)
        # 列出子文件夹中的所有文件
        sublist = os.listdir(p)
        # 检查info文件是否在当前子文件夹中
        for file in sublist:
            # print(file)
            # file:
            # 1
            # 57983089.
            # dvi
            # cover.jpg
            # desktop.ini
            if 'info' in file:
                infoPos = p + "\\" + file
                videoPos = p
            else:
                subsubDir = p + "\\" + file
                if os.path.isdir(subsubDir):
                    # print(subsubDir)
                    # subsubDir:  E:\哔哩哔哩视频\ss27993\57983089\1
                    subsubList = os.listdir(subsubDir)
                    for subsubFile in subsubList:
                        if 'info' in subsubFile:
                            infoPos = subsubDir + "\\" + subsubFile
                            videoPos = subsubDir
                            break
            with open(infoPos, 'r', encoding='utf-8') as load_f:
                load_dict = json.load(load_f)
                if 'ss' in AVhao:
                    videoTitle = load_dict['Description']
                else:
                    videoTitle = load_dict['PartName']

                videoTitle = get_correct_title(videoTitle)
                print('videoTitle: ', videoTitle)
                videoDir = videoPos + "\\" + 'video.mp4'
                audioDir = videoPos + "\\" + 'audio1.mp4'
                # print('videoDir: ', videoDir)
                # print('audioDir: ', audioDir)
                # videoDir:  E:\哔哩哔哩视频\ss27993\74051851\1\video.mp4
                # audioDir:  E:\哔哩哔哩视频\ss27993\74051851\1\audio1.mp4
                if 'ss' in AVhao:
                    outDir = savePos + "\\" + videoTitle + '.mp4'
                else:
                    outDir = savePos + "\\" + seq[i] + '_' + videoTitle + '.mp4'
                    i += 1
                # 对于那些命名很规范的视频,可以不用自己再排序,进行一下重载,不规范的视频再把这句注释掉就好
                outDir = savePos + "\\" + videoTitle + '.mp4'
                # command = 'cd ' + superPath + '\\64 && '  # && 多名命令
                # command = 'cd ' + 'E:\\ProgramFiles\\ffmpeg' + ' && '
                command = 'E:\\FFmpeg\\bin\\ffmpeg.exe -i ' + '"' + audioDir + '"' ' -i ' + '"' + videoDir + '"'+ ' -acodec copy -vcodec copy ' + '"' + outDir + '"'
                # print("保存地址",outDir)
                # 保存地址 E:\B站导出视频\[Lynda视频]音频录制录音技巧教程(中英双语字幕)全集130课时AudioRecordingTechniques混音录音棚音乐工作室歌曲调音\98录制独奏萨克斯演奏技巧二.mp4
                # print(command)
                # command = 'E:\\FFmpeg\\bin\\ffmpeg.exe -i "E:\哔哩哔哩视频\ss27993\77413703\1\audio1.mp4" -i "E:\哔哩哔哩视频\ss27993\77413703\1\video.mp4" -acodec copy -vcodec copy "E:\B站导出视频\Dr.STONE石纪元\第22话宝物.mp4'
                # os.system(command)
                popen(command)
                # ffmpeg.exe -i audio1.mp4 -i video.mp4 -acodec copy -vcodec copy output.mp4
                break

代码说明

如你所见我的编程水平不高,模块化做的很差,不便于理解,所以有必要进行说明。

直接从main开始看起吧。

AVhao = input("请输入视频AV号:")
    superPath = "E:\\哔哩哔哩视频" + "\\" + AVhao
    partDirs = []  # 保存每P视频所在的文件夹路径
    paths = os.listdir(superPath)  # 获取当前路径下所有的文件(包括文件夹)名称

首先是用input接收AV号或BV号的输入,放入AVhao变量中。

然后用superPath变量存放你需要合并的视频的根目录。比如我在B站缓存的所有视频存放在 E:\哔哩哔哩视频 下,注意程序中要有两条\,然后superPath就是 E:\哔哩哔哩视频\AVhao 。

os.listdir(),括号中的参数必须是一个真实的路径,这个函数可以得到这个路径下所有的文件和文件夹的名称。

我用paths来存放 E:\哔哩哔哩视频\AVhao 路径下所有的文件名称和文件夹名称。

为了防止我的表达能力有限带来的理解上的不便,你可以看图,paths对应的是下图中的内容:

这个变量的类型是列表,所以可以用for循环来遍历。

savePos = ''
    seq = []
    for p in paths:
        if '.' not in p:
            seq.append(p)
        if 'info' in p:
            # print(p)
            # p:
            # 27993.info
            info = superPath + "\\" + p
            with open(info, 'r', encoding='utf-8') as load_f:
                load_dict = json.load(load_f)
                projectTitle = load_dict['SeasonTitle']
                projectTitle = get_correct_title(projectTitle)
                savePos = 'E:\\B站导出视频\\' + projectTitle
                print('savePos: ', savePos)

        if 'dvi' in p:
            # print(p)
            # P:
            # 328738595.dvi
            dvi = superPath + "\\" + p
            with open(dvi, 'r', encoding='utf-8') as load_f:
                load_dict = json.load(load_f)
                projectTitle = load_dict['Title']
                projectTitle = get_correct_title(projectTitle)
                savePos = 'E:\\B站导出视频\\' + projectTitle
                print('savePos: ', savePos)
        # 防止文件存在时再次生成该文件夹出现错误
        try:
            os.mkdir(savePos)
            break
        except:
            pass

        subDir = superPath + "\\" + p
        if os.path.isdir(subDir):
            # print(subDir)
            # 所有子文件夹的路径保存在partDirs中
            partDirs.append(subDir)

我设置了一个savePos变量,用来表示合并后的视频保存的位置,因为我希望将视频保存在一个我自己指定的文件夹下,同时这个文件夹的名称是这个视频的名称,比如Dr.stone石纪元。

因为想自动化操作,所以我通过缓存文件夹中的info文件和dvi文件来找到视频的名称。

使用open函数打开这两个文件中的一个,因为不确定文件结构是什么样的,所以我用了两个if语句。

然后再用json.load函数将其加载为字典,并根据对应的键读取对应的值,从而可以拼接处对应的保存地址savePos。

由于创建已经存在的同名文件夹会发生错误,为避免这种可能,我将创建目录的操作放在了try语句下。

创建目录用的是os.mkdir()函数,括号中是一个绝对路径。

然后我用subDir来表示子文件夹的名称,注意!是子文件夹,而不是文件。

我用os.path.isdir(subDir)来进行判断,如果是文件夹而不是文件的话,就加到partDirs列表中,partDirs.append(subDir)

这个列表中的每个元素都是一个子文件夹的绝对路径,比如:E:\哔哩哔哩视频\ss27993\57983089

而这个名为seq的显得很突兀,这个其实我也是后来加的,这个列表的作用在于记录当前子文件夹的名称,也就是在AVhao文件夹的下一层,如果不是番剧的话,应当有许多个文件夹分别是1、2、3等等,这些其实对应的是播放列表中的顺序。

而之所以使用 if '.' not in p ,因为这一层的文件夹全都是用来表示播放顺序的,因此不存在后缀名,从而也就没有“.”。

videoPos = ''
    i = 0
    for p in partDirs:
        # print(p)
        # 列出子文件夹中的所有文件
        sublist = os.listdir(p)
        # 检查info文件是否在当前子文件夹中
        for file in sublist:
            # print(file)
            # file:
            # 1
            # 57983089.
            # dvi
            # cover.jpg
            # desktop.ini
            if 'info' in file:
                infoPos = p + "\\" + file
                videoPos = p
            else:
                subsubDir = p + "\\" + file
                if os.path.isdir(subsubDir):
                    # print(subsubDir)
                    # subsubDir:  E:\哔哩哔哩视频\ss27993\57983089\1
                    subsubList = os.listdir(subsubDir)
                    for subsubFile in subsubList:
                        if 'info' in subsubFile:
                            infoPos = subsubDir + "\\" + subsubFile
                            videoPos = subsubDir
                            break
            with open(infoPos, 'r', encoding='utf-8') as load_f:
                load_dict = json.load(load_f)
                if 'ss' in AVhao:
                    videoTitle = load_dict['Description']
                else:
                    videoTitle = load_dict['PartName']

                videoTitle = get_correct_title(videoTitle)
                print('videoTitle: ', videoTitle)
                videoDir = videoPos + "\\" + 'video.mp4'
                audioDir = videoPos + "\\" + 'audio1.mp4'
                # print('videoDir: ', videoDir)
                # print('audioDir: ', audioDir)
                # videoDir:  E:\哔哩哔哩视频\ss27993\74051851\1\video.mp4
                # audioDir:  E:\哔哩哔哩视频\ss27993\74051851\1\audio1.mp4
                if 'ss' in AVhao:
                    outDir = savePos + "\\" + videoTitle + '.mp4'
                else:
                    outDir = savePos + "\\" + seq[i] + '_' + videoTitle + '.mp4'
                    i += 1
                # 对于那些命名很规范的视频,可以不用自己再排序,进行一下重载,不规范的视频再把这句注释掉就好
                outDir = savePos + "\\" + videoTitle + '.mp4'
                # command = 'cd ' + superPath + '\\64 && '  # && 多名命令
                # command = 'cd ' + 'E:\\ProgramFiles\\ffmpeg' + ' && '
                command = 'E:\\FFmpeg\\bin\\ffmpeg.exe -i ' + '"' + audioDir + '"' ' -i ' + '"' + videoDir + '"'+ ' -acodec copy -vcodec copy ' + '"' + outDir + '"'
                # print("保存地址",outDir)
                # 保存地址 E:\B站导出视频\[Lynda视频]音频录制录音技巧教程(中英双语字幕)全集130课时AudioRecordingTechniques混音录音棚音乐工作室歌曲调音\98录制独奏萨克斯演奏技巧二.mp4
                # print(command)
                # command = 'E:\\FFmpeg\\bin\\ffmpeg.exe -i "E:\哔哩哔哩视频\ss27993\77413703\1\audio1.mp4" -i "E:\哔哩哔哩视频\ss27993\77413703\1\video.mp4" -acodec copy -vcodec copy "E:\B站导出视频\Dr.STONE石纪元\第22话宝物.mp4'
                # os.system(command)
                popen(command)
                # ffmpeg.exe -i audio1.mp4 -i video.mp4 -acodec copy -vcodec copy output.mp4
                break

这一部分是我用来实现合并特定路径的视频和音频,并最终导出到指定目录的。

videoPos是待合并的视频的路径,音频文件也在这一目录下。

for p in partDirs: ,在这个for循环中遍历的是partDirs列表,这个列表由前面的步骤得到,其中的每个元素都是一个路径。

接下来的这个if-else是用来区别番剧和普通视频合集的,因为它们有不同的目录结构。

infoPos用来记录包含单集视频名称的info文件的路径,然后用open函数打开这个info文件,根据AVhao中是否有ss,判断是否是番剧,如果有ss,则表明是番剧,对应的视频名称为Description键对应的值。否则的话,对应的视频名称为PartName键对应的值,但是如果是要保存为文件的话,当然不能直接以这个名称命名,否则极有可能发生错误,因此我用了一个get_correct_title函数来对标题进行重载,以确保格式正确。

videoDir和audioDir分别是待合并的视频和音频的绝对路径。

然后我根据AVhao中是否有ss,来判断是否是番剧。因为番剧的单集视频名称通常会有序号,所以我可以将输出视频的保存路径设置为保存目录加视频名.mp4。

许多up主的视频名称没有体现视频的先后顺序,这样带来的问题是导出后顺序播放时产生跳集现象。因此我用seq加下划线的方式来为视频排序。比如“1_简介.mp4”。

而对于视频名称本身有排序的情况1_1简介.mp4,这样有些奇怪,所以我们碰到这种情况时,可以直接在下面添加一个 outDir = savePos + "\\" + videoTitle + '.mp4' ,其他情况不用时注释掉就好。

最后是用Python程序执行Dos命令,我将命令设为command变量,通过for循环,会自动生成不同的命令,然后执行命令行有两种方法,一种是导入os库,使用os.system(command),另一种是我在 https://blog.youkuaiyun.com/qq_41451161/article/details/82901235 借用的popen函数,这个也可以用,但需要导入subprocess库。

使用命令行上,有两个比较坑的地方,一是前面必须给出ffmpeg.exe的绝对路径,也就是E:\FFmpeg\bin\ffmpeg.exe,在Python中用是这样的,但直接在命令行中,只要输入ffmpeg.exe即可(前提是你设置好了环境变量)。第二个坑是,command赋值时,一定给路径加上引号,否则的话识别命令时会发生错误。

 

ffmpeg解决bilibili下载的音视频分离问题,将音视频一键合成 ffmpeg解决bilibili下载的音频分离问题,将音视频一键合成 阅读详情

相关推荐

批量合成bilibili的m4s缓存文件为MP4格式

批量合成bilibili的m4s缓存文件为MP4格式        众所周知,B站是一个学习网站,我常常在B站看一些教程视频,但是有时候没有网络就看不了了,于是我打算把教程都缓存下来看,不得不说,B站的缓存速度还是相当快的,缓存好以后,当我找到缓存目录的时候,发现缓存的文件音画是分离的,我尝试了用格式工厂的视频混流功能,虽然能够实现m4s文件合成为mp4文件,但是不能做到批量合成,需要一个个拖入音频和视频M4S文件,于是我就用python

偃笙的博客 1万+

哔哩哔哩视频合并 B站缓存视频合并 安卓版 音视频合并 基于ffmpeg

此软件是为了帮助网友合并哔哩哔哩缓存视频,Android上将bilibili缓存视频合并导出为mp4,你可以将它理解为一个专用的格式工厂,并不涉及破解相关内容,仅仅用于学习技术交流,严禁用于商业用途,如有侵权请联系我删档,对你带来困惑和不便我深感抱歉。

molihuan的博客 3324

python + ffmpeg 将某站的缓存视频文件批量转换为MP4格式

这是一篇很无聊的文章,之所以写它是因为这周还没写博客,但是好像没啥可写的,刚好今天突发奇想,想要把某站的APP缓存视频文件转化为mp4 格式,方便在电脑上看,方法很简答,很快就做完了,所以,又一篇水文诞生了,罪过,罪过。 水文警告!水文警告!这是一篇毫无营养的水文! 一、题外话 话说某站可真是个好地方,原本我只是在上面看看动漫,看看别人做的鬼畜视频而已。但最近我发现上面有好多学习的课程,全部免...

分享日常的学习,开展的项目,编写的软件,解决的问题等~ 4025

软件分享——Bilibili缓存视频合并软件,m4s音视频合并工具

但是如果你有几十上百个视频呢

m0_60352504的博客 7982

在手机或电脑上用Python爬取B站视频和音频

【代码】在手机或电脑上用Python爬取B站视频和音频。

weixin_56059924的博客 4432

[Python]利用python+ffmpeg合并B站视频及格式转换

利用python+ffmpeg合并B站视频及格式转换 B站客户端下载的视频一般有两种格式:早期的多为blv格式(由flv格式转换而来,音视频轨道在同一文件下)。如今的多为m4s格式,音频轨视频轨分开 以下为利用ffmpeg简单对文件处理,使其转换为大多数播放器能正常播放的mp4格式 前提:已正常安装ffmpeg import tkinter as...

renboyu010214的博客 1565

三步实现B站缓存视频转MP4格式

本期我们来实现如何将B站缓存的视频转成MP4格式,直接在本地播放。首先我们在Bilibili客户端缓存一个视频,保存的文件如下:这里有两个m4s文件,大的哪个是视频文件,小的是音频文件,这里我们用视频播放软件是打不开的。接下来我们就来看看如何三步实现MP4格式的转换。

2403_88996352的博客 6009

python合并视频和音频_Python批量合并处理B站视频

最近想学习后端,又不想花钱,怎么办呢?于是在手机端B站(哔哩哔哩)上面找到了满意的免费视频教程,但是手机端看起来很不方便啊。于是,我通过在手机端缓存下来后,导入到了电脑端,但是我后面了发现两个问题:1.本来一集视频按理说一段吧,但是B站下载下来的视频并不是完整的一段,而是被分成了多段blv格式的视频,所以需要想办法把它们拼接成完整的一段视频!2.视频数量太大,不可能一个一个去修改,得想办法批量处理...

weixin_39585617的博客 1650

python合并音频和视频_ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码

安装官网下载选择需要的版本将解压后得到的以下几个文件放置在E:\FFmpeg下环境变量此电脑--属性--高级系统设置--环境变量在系统变量(也就是下面那一半)处找到新建,按如下所示的方法填写再将%FFMPEG_HOME%以及%FFMPEG_HOME%\bin写入系统变量的Path中然后一路确定即可验证win+R,cmd输入ffmpeg -versionffmpeg的使用对于我将B站PC端缓存的音频...

weixin_39597323的博客 1278

BiliBili视频合并软件-audio.m4s-video.m4s合并成mp4.rar

内容包括python源代码,和py文件,以及批处理执行bat文件。 使用python批量将audio.m4s-video.m4s合并成mp4 BiliBili视频合并软件-audio.m4s-video.m4s合并成mp4

算法-基于MACD的Adaboost股价涨跌预测模型

MACD是一个指标,具体用法是MACD>0看涨,反之看跌,果真是这样的吗?由于所有的技术指标都基于对历史数据的统计,指标的滞后性也就难免,有时候MACD明明大于0,股价仍然跌,有时候macd小于0,股价仍然涨。 本文基于Adaboost算法提出了一种基于macd的线性阀值分类器作为若分类器,通过在限定的解空间内寻找使得错误率最小的阀值和偏置,这样做避免了训练若分类器的复杂性,经验证,这种方法有效。

mtaxot的博客 8023

python合并音频和视频_ffmpeg+Python实现B站MP4格式音频与视频的合并

安装官网下载环境变量此电脑--属性--高级系统设置--环境变量在系统变量(也就是下面那一半)处找到新建,按如下所示的方法填写再将%FFMPEG_HOME%以及%FFMPEG_HOME%\bin写入系统变量的Path中然后一路确定即可验证win+R,cmd输入ffmpeg -versionffmpeg的使用对于我将B站PC端缓存的音频mp4和视频mp4文件合并的需求,需要用到的命令为:ffmpeg....

weixin_39973492的博客 1317

开关电源EMC整改案例-辐射骚扰

2.4.1 获得原始数据。同样的分析可以应用在差模电流的情况, 唯一不同的是, 两根导线的磁场分布是相反的, 磁 场互相抵消, 由于导线中的电流大小相等, 产生的磁场 H 大小相同, 在互相靠近的情况下, 在磁 环内的两个感应磁场大小相同、方向相反, 因此合成之后的感应磁场 B 几乎为 0,对任意一根导 线而言,相当于是一段“无感导线”,对差模电流不会产生任何抑制作用。众所周知, 共模电感的匝数越多, 感量越大, 按道 理来说对共模干扰电流的抑制也会越强烈,对抗辐射 也越有利,然而事实真的如此吗?

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 3496

B站视频缓存 音频和视频批量合并

1.手机位置 Android->data->tv.danmaku.bili->download->925792221 2.导入到电脑 3.在925792221文件创建 bili.py #coding:utf-8 import os import json import time # ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a aac -strict experimental output.mp4 superPath =

oMoZhe的博客 1万+

Claude Code与Vibe Coding:2026年AI编程实战指南

AI编程助手是基于大语言模型的智能代码生成工具,通过理解编程上下文提供精准的代码补全和重构建议。其核心原理是利用深度学习技术分析代码语义,将自然语言指令转化为可执行代码。这种技术能显著提升开发效率,减少重复性编码工作,特别适用于快速原型开发和复杂问题求解。在实际应用场景中,AI编程助手可与Vibe Coding方法论结合,建立流畅的人机协作工作流。Claude Code作为先进的AI编程工具,支持多语言开发和智能错误检测,而Vibe Coding则强调自然交互和迭代优化,两者协同为开发者提供完整的AI编程解

weixin_29057695的博客 341

Anomalib实战:5分钟搞定图像异常检测模型训练(附完整代码)

本文提供了一份基于Anomalib框架的图像异常检测快速实战指南。文章详细介绍了从环境搭建、数据准备到模型训练与推理的完整流程,重点推荐了训练速度快、效果稳定的PatchCore模型,并附带了可运行的完整代码,旨在帮助开发者快速上手工业质检等实际应用。

weixin_29039773的博客 420

Python爬虫:爬取B站视频(详细讲解)

没有问题,那么我们B站的视频和音频就爬取下来了~非常的ez是吧,但有个问题,既然视频和音频都爬下来了,但我们又该怎么把他们俩合并在一起形成正常的视频呢?刷过B站的都知道,B站并没有下载功能,连官网都没有下载功能的话,那我们还能正常爬取吗?毋庸置疑的就是第一个部分(视频),请大家记住这一点,接下来,我们一起打开检查来进行常规操作。可以看到,这里又有三个文件,他们仨和视频文件不一样,不一样的点在哪?Hello,大家好,我是南枫,今天带来什么项目呢?,所以我们抓下来还不行,还需要。播放正常,但,有个问题,

weixin_53707653的博客 3946

vcs 覆盖率收集1——三种覆盖率类型、covergroup、bins、数据采样、覆盖率选项

介绍各种覆盖率,以及如何编写覆盖率收集的代码

qq_42135020的博客 1万+

python ffmpeg模块mp4岀错_利用ffmpeg+Python实现MP4格式音频与视频的合并的方法

利用ffmpeg+Python实现MP4格式音频与视频的合并的方法发布时间:2020-10-26 17:11:27来源:亿速云阅读:206作者:Leah本篇文章给大家分享的是有关利用ffmpeg+Python实现MP4格式音频与视频的合并的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。环境变量此电脑--属性--高级系统设置--环境...

weixin_36444661的博客 1399

我用两种方式玩转 MCP:CherryStudio vs VS Code 实测手记

MCP,全称,你可以理解为——给大模型装上“手脚”和“工具箱”。传统大模型像一位博学但手不能动的学者:“我知道怎么算圆周率,但没法打开计算器。而支持 MCP 的模型,能通过标准协议自动调用外部工具(比如fetch网络请求、readFile读文件、shell执行命令),真正做到“知行合一”。输入后**,保存,**之后就显示出来了MCP 不是“魔法”,而是把 AI 从“问答机”升级为“智能代理”的关键一步。工具本身不难,难的是“知道它能解决什么问题”。

zyq569的博客 1020

用PyCharm+Scrapy打造你的第一个爬虫:从安装到实战(附完整代码)

本文详细介绍了如何使用PyCharm和Scrapy框架从零开始构建高效网络爬虫。通过环境配置、项目创建、核心爬虫逻辑编写到数据处理与存储的完整流程,帮助Python开发者快速掌握爬虫开发技巧,并附有实战代码示例。特别适合想要学习Scrapy框架和提升爬虫技能的开发者。

weixin_29038345的博客 868

biliffm4s: 一个封装合并B站缓存.m4s至.mp4操作的Python库

biliffm4s: 合成B站.m4s缓存视频(Python库)

WaterRun_的博客 1958

全网唯一OpenCyphal/UAVCAN教程(8)libcanard介绍

当Cyphal里,这个结构体代表一条完整的Cyphal消息,之后我们会根据metadata里提供的元信息,其实就是消息ID,调用对应的反序列化函数,将payload还原成具体的Cyphal消息。用于构造一个新的发送队列,原则上一个can物理接口需要分配一个发送队列,如果它们的MTU大小一致,是可以共用一条的。这个库不包含IO层,是平台无关的,意义是没有实现具体的数据收发,仅提供将发送出去的Cyphal消息转成can帧,以及将收到的can帧转成Cyphal消息。返回值是这条消息拆解成的can帧的数目。....

二进制君 2404

python 爬取B站原视频的实站代码

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:python学习教程 ( 想要学习Python?Python学习交流群:1039649593,满足你的需求,资料都已经上传群文件流,可以自行下载!还有海量最新2020python学习资料。 ) 这篇文章主要介绍了python 爬取B站原视频的实例代码,帮助大家更好的理解和使用python 爬虫,感兴趣的朋友可以了解下 B站原视频爬取,我就不多说直接上代码。直接运行

weixin_49345590的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python 爬虫实战:爬取 B 站视频的完整教程

Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用信息。因其简洁的语法和丰富的库支持(如 requests、BeautifulSoup、Scrapy 等),Python 成为实现爬虫的首选语言之一。指定 url发送请求获取目标数据数据解析本文将以 B 站视频为例,详细介绍爬取视频的实现过程。正确设置请求头信息以绕过反爬机制准确定位音视频资源的 URL 地址分别处理音频和视频的下载与保存。

2302_76756558的博客 4743

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 肯德基全国到处都有!用requests模块爬取肯德基餐厅信息!
下一篇: 手把手教你使用 Python 抓取并存储网页数据!最详细的爬虫教程!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值