ffmpeg批量合并b站的视屏和音频并修改文件的名称

win10环境
ffmpeg下载地址

  • 记得设置环境变量

单个合并

直接在音视频目录运下面的命令

ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a aac -strict experimental output.mp4

ffmpeg批量合并b站的视屏和音频并修改文件的名称_第1张图片

批量合并

import os
import json

def path(path,name):
    """
    :param path: 视屏项目的总目录
    :param name: audio.m4s 音频的文件名,每个音频的名字是一样的
    :return: (视屏路劲,音频路径,视屏信息的json文件路径)的列表
    """
    res=[]
    base=os.path.abspath(path)
    for root,dirs,files in os.walk(base):
        if not dirs:
            for file in files:
                if name in file:
                    r=os.path.join(root,file)
                    res.append((r,r.replace('audio.m4s','video.m4s'),os.path.join(os.path.dirname(os.path.dirname(r)),'entry.json')))
    return res


def get_info(file_path):
    """
    :param file_path: entry.json文件的路径
    :return: 视屏的标题信息
    """
    with open(file_path,'rb')as f:
        obj=json.load(f)
    return obj['page_data']['part']

def has_mp4(file_path):
    """
    过滤掉已有.mp4文件的目录
    :param file_path: 视屏目录
    :return: True or False
    """
    return any(['.mp4'in x for x in os.listdir(file_path)])

if __name__ == '__main__':
    #test
    # test=path("./视屏合集", "audio.m4s")
    # print(test)

    #先测试一个
    file_list=path("./视屏合集", "audio.m4s")
    for x in file_list[:1]:
    #for x in file_list:
        video_name=get_info(x[2])
        work_path=os.path.dirname(x[0])
        #把已转换的目录过滤掉
        if has_mp4(work_path):
            continue
        print(work_path)
        os.system(r'cd %s & ffmpeg -i audio.m4s -i video.m4s -c:v copy -c:a aac -strict experimental %s.mp4'%(work_path,video_name))
[('C:\\Users\\Administrator\\Desktop\\视屏合集\\170\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\170\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\170\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\171\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\171\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\171\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\172\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\172\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\172\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\173\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\173\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\173\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\174\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\174\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\174\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\175\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\175\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\175\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\176\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\176\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\176\\entry.json'), ('C:\\Users\\Administrator\\Desktop\\视屏合集\\177\\64\\audio.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\177\\64\\video.m4s', 'C:\\Users\\Administrator\\Desktop\\视屏合集\\177\\entry.json')]

在把转换好的视屏移动到视屏合集目录下

import os
import json

def path(path,name):
    """
    :param path: 视屏项目的总目录
    :param name: audio.m4s 音频的文件名,每个音频的名字是一样的
    :return: (视屏路劲,音频路径,视屏信息的json文件路径)
    """
    res=[]
    base=os.path.abspath(path)
    for root,dirs,files in os.walk(base):
        if not dirs:
            for file in files:
                if name in file:
                    r=os.path.join(root,file)
                    res.append((r,r.replace('audio.m4s','video.m4s'),os.path.join(os.path.dirname(os.path.dirname(r)),'entry.json')))
    return res


def get_info(file_path):
    """
    :param file_path: entry.json文件的路径
    :return: 视屏的标题信息
    """
    with open(file_path,'rb')as f:
        obj=json.load(f)
    return obj['page_data']['part']

def has_mp4(file_path):
    """
    过滤掉已有.mp4文件的目录
    :param file_path: 视屏目录
    :return: True or False
    """
    return any(['.mp4'in x for x in os.listdir(file_path)])

if __name__ == '__main__':
    #先测试一个
    BaseDir=os.path.abspath('./视屏合集')
    file_list=path(BaseDir, "audio.m4s")
    # for x in file_list[:1]:
    for x in file_list[:]:
        video_name=get_info(x[2])
        work_path=os.path.dirname(x[0])
        if has_mp4(work_path):
            os.system(r'cd %s & move %s.mp4  %s\%s.mp4'%(work_path,video_name,BaseDir,video_name))

ffmpeg批量合并b站的视屏和音频并修改文件的名称_第2张图片

你可能感兴趣的:(python)