python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5

这篇文章主要介绍了python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

相对之前版本更新内容:

※ 根据UP主分类存放导出的视频。

※ 新增一种标题格式

注意:需要安装ffmpeg才可使用
ffmpeg下载地址: https://ffmpeg.zeranoe.com/builds/
ffmpeg安装方法:
解压好下载的压缩包后,再将bin目录加入Path环境变量中 按Win+R 运行 输入cmd 在弹出的框框中输入 ffmpeg ,如果没有出现"既不是内部或外部命令"之类的话就是安装成功了
参考链接: https://www.0133.cn/article/153806.htm
运行截图

 

工具源码

 import os import json import random import time import requests # 清除所有空格 def clearSpace(str): return str.replace(" ", "").replace(" ", ""); # 获取指定Uid的Up主名 def getUpNameByUid(uid): try: url = 'https://space.bilibili.com/' + str(uid) html = requests.get(url) html.encoding = 'UTF-8' html = html.text index1 = html.find("") + len("<title>") index2 = html.find("的个人空间", index1) result = html[index1:index2] if (result != ""): return result else: return uid except Exception: return uid # 获取时间戳 def getTimeStamp(): t = time.localtime(time.time()) return str(t.tm_year) + '_' + str(t.tm_mon) + '_' + str(t.tm_mday) + '_' + str(t.tm_hour) + \ str(t.tm_min) + str(t.tm_sec) + str(random.randint(10, 99)) # 更正文件名 def correctFileName(name): n_list = list(name) for i in range(0, len(n_list)): index = 0 for i in n_list: if ( i == '\\' or i == '/' or i == ':' or i == '*' or i == '?' or i == '\"' or i == '<' or i == '>' or i == '|'): n_list.pop(index) index = index + 1 return ''.join(n_list) # 读取json文件 def getVideoName(path): f = open(path, encoding='utf-8') setting = json.load(f) try: result = setting['page_data']['download_subtitle'] # 注意多重结构的读取语法 except KeyError: try: result = setting['title'] + ' 第' + setting['ep']['index'] + '话 ' + setting['ep']['index_title'] except KeyError: try: result = setting['title'] except KeyError: result = getTimeStamp() return result def getVideoOwner(path): try: f = open(path, encoding='utf-8') setting = json.load(f) return clearSpace(getUpNameByUid(setting['owner_id'])) except Exception: return "" # 获取文件列表 def getFileList(file_dir): # 定义四个列表 title = [] owner = [] videoPath = [] audioPath = [] # 遍历文件目录 for root, dirs, files in os.walk(file_dir): if ('entry.json' in files): title.append(getVideoName(str(root) + '\\entry.json')) owner.append(getVideoOwner(str(root) + '\\entry.json')) if ('video.m4s' in files and 'audio.m4s' in files): videoPath.append(str(root) + '\\video.m4s') audioPath.append(str(root) + '\\audio.m4s') if (len(title) <len(videoPath)): title.append(getTimeStamp()) if ('0.blv' in files): title.pop() return [title, owner, videoPath, audioPath] # 输出mp4文件 def getMP4(title, owner, video_path, audio_path): # 生成输出目录 if not os.path.exists("./output"): os.mkdir("./output") # 循环生成MP4文件 for i in title: reName = correctFileName(i) # 开始生成MP4文件 if not os.path.exists("./output/" + reName + ".mp4"): # 获取临时文件时间戳 t_stamp = getTimeStamp() # 开始合成 os.system( "ffmpeg -i " + video_path[title.index(i)] + " -i " + audio_path[ title.index(i)] + " -codec copy ./output/" + t_stamp + ".mp4") # 设置所属Up主 curOwner = owner[title.index(i)] if curOwner != "": if not os.path.exists("./output/" + curOwner): os.mkdir("./output/" + curOwner) os.rename("./output/" + t_stamp + ".mp4", "./output/" + curOwner + "/" + reName + ".mp4") else: # 将临时文件时间戳改为标题名 os.rename("./output/" + t_stamp + ".mp4", "./output/" + reName + ".mp4") print("正在合成...") print("标题:" + reName) print("UP主:" + curOwner) print("视频源:" + video_path[title.index(i)]) print("音频源:" + audio_path[title.index(i)]) time.sleep(1) print("欢迎使用批量合成M4S工具 ver2.5") fileDir = str(input("请输入含M4S文件的目录:")) f = getFileList(fileDir) getMP4(f[0], f[1], f[2], f[3]) print("合成完毕")</pre></div><p>已编译好的可执行文件(EXE):</p><p>链接: <a href="https://pan.baidu.com/s/1bLOg6GGJ5Wp7gcW73sXzvg">https://pan.baidu.com/s/1bLOg6GGJ5Wp7gcW73sXzvg</a></p><p>提取码: yqvm</p><p>到此这篇关于python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5的文章就介绍到这了,更多相关python批量合成bilibili缓存文件内容请搜索html中文网以前的文章或继续浏览下面的相关文章希望大家以后多多支持html中文网!</p></div><p>以上就是python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5的详细内容,更多请关注0133技术站其它相关文章!</p></article><div class="post-actions"><a href="javascript:;" etap="like" class="post-like action action-like" data-pid="0"><i
                        class="fa fa-thumbs-o-up"></i>赞(<span>0</span>)</a><a href="javascript:;"
                                                                               class="action action-rewards"
                                                                               data-event="rewards"><i
                    class="fa fa-jpy"></i> 打赏</a></div><div class="post-copyright">未经允许不得转载:<a href="/">0133技术站首页</a> » <a href="/cate107/">python</a></div><!--<div class="article-tags">标签:<a href="/archives/tag/javascript" rel="tag">JavaScript</a><a
                    href="/archives/tag/%e5%be%ae%e4%bf%a1" rel="tag">微信</a><a
                    href="/archives/tag/%e5%be%ae%e4%bf%a1%e7%9a%84%e7%89%88%e6%9c%ac%e5%8f%b7" rel="tag">微信的版本号</a><a
                    href="/archives/tag/%e7%89%88%e6%9c%ac%e5%8f%b7" rel="tag">版本号</a><a
                    href="/archives/tag/%e8%af%ad%e4%b9%89%e5%8c%96" rel="tag">语义化</a></div>--><nav class="article-nav"><span class="article-nav-prev">上一篇<br><a href="/cate107/112207601600000.html" rel="prev">Django中自定义模型管理器(Manager)及方法</a></span><span class="article-nav-next">下一篇<br><a href="/cate107/112207631316100.html" rel="next">python自定义函数实现最大值的输出方法</a></span></nav><div class="relates relates-thumb"><div class="title"><h3>相关文章</h3></div><ul><li><a href="/cate107/1113766288900.html"><img data-src="https://ss.0133.cn/article/fb/5d/d7/fb5dd7a2829658f9854de51e45c94df6.jpg-160" alt="Appium+Python自动化环境搭建实例教程" class="thumb"></a><a href="/cate107/1113766288900.html">Appium+Python自动化环境搭建实例教程</a></li><li><a href="/cate107/1113775676900.html"><img data-src="https://ss.0133.cn/article/92/ce/31/92ce313b16d9ded222d1344ec584ee86.jpg-160" alt="python编写adb截图工具的实现源码" class="thumb"></a><a href="/cate107/1113775676900.html">python编写adb截图工具的实现源码</a></li><li><a href="/cate107/1113780372100.html"><img data-src="https://ss.0133.cn/article/90/88/09/908809d579a94efbc03f656f3f33a344.jpg-160" alt="一篇文章教会你PYcharm的用法" class="thumb"></a><a href="/cate107/1113780372100.html">一篇文章教会你PYcharm的用法</a></li><li><a href="/cate107/1113813260900.html"><img data-src="https://ss.0133.cn/article/b9/0d/b5/b90db5f2208b0b175730e0c9ea392816.jpg-160" alt="一篇文章带你了解kali局域网攻击" class="thumb"></a><a href="/cate107/1113813260900.html">一篇文章带你了解kali局域网攻击</a></li><li><a href="/cate107/1113814436225.html"><img data-src="https://ss.0133.cn/article/45/c1/af/45c1afc921d07683ae78003bffe0acf7.jpg-160" alt="Python的Matplotlib库图像复现学习" class="thumb"></a><a href="/cate107/1113814436225.html">Python的Matplotlib库图像复现学习</a></li><li><a href="/cate107/1113815611600.html"><img data-src="https://ss.0133.cn/article/5c/bf/c7/5cbfc766103acb5cd46fd258c701d0f7.jpg-160" alt="PyCharm 2021.2 (Professional)调试远程服务器程序的操作技巧" class="thumb"></a><a href="/cate107/1113815611600.html">PyCharm 2021.2 (Professional)调试远程服务器程序的操作技巧</a></li><li><a href="/cate107/1113816787025.html"><img data-src="https://ss.0133.cn/article/f1/5d/d9/f15dd94c8663ab4d8629635d3421d3d5.jpg-160" alt="python聊天室(虽然很简洁,但是可以用)" class="thumb"></a><a href="/cate107/1113816787025.html">python聊天室(虽然很简洁,但是可以用)</a></li><li><a href="/cate107/1113817962500.html"><img data-src="https://ss.0133.cn/article/7a/d2/74/7ad274c12ebb646eb8da3c729acc4635.jpg-160" alt="python中map()函数使用方法详解" class="thumb"></a><a href="/cate107/1113817962500.html">python中map()函数使用方法详解</a></li></ul></div><!--
            <div class="title" id="comments"><h3>评论
                    <small>抢沙发</small></h3></div><div id="respond" class="no_webshot"><form action="return false;" method="post" id="commentform"><div class="comt"><div class="comt-title"><img data-src="https://secure.gravatar.com/avatar/?s=100&d=mm" class="avatar avatar-100"
                                 height="50" width="50"><p><a id="cancel-comment-reply-link" href="javascript:;">取消</a></p></div><div class="comt-box"><textarea placeholder="你的评论可以一针见血" class="input-block-level comt-area" name="comment"
                                      id="comment" cols="100%" rows="3" tabindex="1"
                                      onkeydown="if(event.ctrlKey&&event.keyCode==13){document.getElementById('submit').click();return false};"></textarea><div class="comt-ctrl"><div class="comt-tips"><input type='hidden' name='comment_post_ID' value='6053'
                                                              id='comment_post_ID'/><input type='hidden' name='comment_parent' id='comment_parent' value='0'/><p style="display: none;"><input type="hidden" id="akismet_comment_nonce"
                                                                     name="akismet_comment_nonce" value="40dd7081eb"/></p><label for="comment_mail_notify" class="checkbox inline hide"
                                               style="padding-top:0"><input type="checkbox" name="comment_mail_notify"
                                                                            id="comment_mail_notify"
                                                                            value="comment_mail_notify"
                                                                            checked="checked"/>有人回复时邮件通知我</label><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="245"/></p></div><button type="button" name="submit" id="submit" tabindex="5">提交评论</button>--><!-- <span data-type="comment-insert-smilie" class="muted comt-smilie"><i class="icon-thumbs-up icon12"></i> 表情</span> --><!--
                            </div></div><div class="comt-comterinfo" id="comment-author-info"><ul><li class="form-inline"><label class="hide" for="author">昵称</label><input class="ipt" type="text" name="author" id="author" value="" tabindex="2" placeholder="昵称"><span class="text-muted">昵称 (必填)</span></li><li class="form-inline"><label class="hide" for="email">邮箱</label><input class="ipt" type="text" name="email" id="email" value="" tabindex="3" placeholder="邮箱"><span class="text-muted">邮箱 (必填)</span></li><li class="form-inline"><label class="hide" for="url">网址</label><input class="ipt" type="text" name="url" id="url" value="" tabindex="4" placeholder="网址"><span class="text-muted">网址</span></li></ul></div></div></form></div>--></div></div><div class="sidebar"><div class="widget widget_ui_tags"><h3>脚本专栏</h3><div class="items"><a href="/cate107/">python</a><a href="/cate145/">vbs相关</a><a href="/cate146/">Erlang</a><a href="/cate147/">Lua</a></div></div><form method="get" class="search-form clearfix" id="search-formhybrid-search" target="_blank" action="/search/article/"><div class="search-input-wrap"><input type="text" class="search-text" placeholder="来搜我" name="word" id="search-texthybrid-search"
                       value="" data-placeholder=""><b class="search-liaosheji"></b><button type="submit" class="search-button"><i class="icon-search"></i></button></div></form><div style="text-align:center;margin:0 auto;"><ul class='hot-search layui-clear'><li style="float:left;margin-right:20px;">热门搜索:</li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=m4s格式转换mp4'>m4s格式转换mp4</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=MP4格式文件'>MP4格式文件</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=批量合成'>批量合成</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=.ts文件合并成mp4文件'>.ts文件合并成mp4文件</a></li><li style="float:left;margin-right:20px;"><a href='/search/article/?word=mp4是什么格式的文件'>mp4是什么格式的文件</a></li></ul></div><br/><div class="widget widget_ui_posts"><h3>置顶推荐</h3><ul><li><a href="/cate99/113135909682500.html"><span class="thumbnail"><img data-src="https://ss.0133.cn/upload/article/000/000/001/61bad6900d0d7489.jpg" alt="qq数据全部清除后能不能恢复" class="thumb"></span><span class="text">qq数据全部清除后能不能恢复</span><span
                            class="muted">2021-12-16</span></a></li></ul></div><div class="widget widget_recent_entries"><h3>猜你喜欢</h3><ul><li><a href="/cate107/11134164661225.html" target="_blank">python的正则表达式re模块的常用方法</a><span class="post-date">2021-09-20</span></li><li><a href="/cate107/11601570832100.html" target="_blank">python imutils包基本概念及使用</a><span class="post-date">2021-10-09</span></li><li><a href="/cate107/11592915360100.html" target="_blank">pandas.DataFrame删除/选取含有特定数值的行或列实例</a><span class="post-date">2021-10-08</span></li><li><a href="/cate107/1128932269025.html" target="_blank">Python二维码生成库qrcode安装和使用示例</a><span class="post-date">2021-09-10</span></li><li><a href="/cate107/118187953291600.html" target="_blank">python pyaudio音频录制的实现</a><span class="post-date">2023-05-06</span></li><li><a href="/cate107/1121653082500.html" target="_blank">Python 给某个文件名添加时间戳的方法</a><span class="post-date">2021-09-10</span></li><li><a href="/cate107/1128928867225.html" target="_blank">Python3中编码与解码之Unicode与bytes的讲解</a><span class="post-date">2021-09-10</span></li><li><a href="/cate107/11106811272400.html" target="_blank">Python Dict找出value大于某值或key大于某值的所有项方式</a><span class="post-date">2021-09-19</span></li></ul></div><!--<div class="widget widget_ui_tags"><h3>热门标签</h3><div class="items"><a href="/archives/tag/javascript">JavaScript (324)</a></div></div><div class="widget widget_ui_comments"><h3>最新评论</h3><ul><li><a href="" title=""><img data-src="" class="avatar avatar-100" height="50" width="50"><strong></strong></a></li></ul></div>--></div><div id="leftbar" class="leftbar"><div class="leftbar-con"><div style="text-align: center; width: 160px;"></div></div></div></section><footer class="footer"><div class="container"><p>© 2022 <a href="/">WEB前端开发</a></p><p><a href="/cate88/">工具教程</a> | <a href="/cate71/">前端开发</a> | <a href="/cate61/">常见问题</a> | <a
                href="/cate129/">操作系统</a> | <a href="/cate103/">编程</a>  | <a href="/cate108/">网络安全</a>  | <a href="/cate120/">设计</a>  | <a href="/cate137/">站长技巧</a></p><div class="footer-gav" style="margin-bottom: 10px ;font-size: 12px;"><img
                src="https://ss.0133.cn/newimg88/2016/06/beian-gov-cn.png" style="vertical-align: middle; height: 14px;"/><a href="https://beian.miit.gov.cn/" target="_blank">鄂ICP备2021014202号-2</a></div><div class="footer-qrcode"></div></div></footer><script>    window.jsui = {
        www: '',
        uri: '/wp-content/themes/dux',
        ver: '5.2.5',
        roll: ["1", "2"],
        ajaxpager: '0',
        url_rp: '/about'
    };
</script><script type='text/javascript' src='/wp-content/themes/dux/js/libs/bootstrap.min.js?ver=5.2.5'></script><script type='text/javascript' src='/wp-content/themes/dux/js/loader.js?ver=5.2.5'></script><script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=5.0.2'></script><script async="async" type='text/javascript' src='/wp-content/plugins/akismet/_inc/form.js?ver=4.0.8'></script><script type="text/javascript">    var $win = jQuery(window);

    var $WindowW = $win.width();

    var $threebar = jQuery("#leftbar");
    if ($threebar.length) {
        var offsetT = $threebar.offset().top;
        $win.on("scroll.leftbar", function () {
            if ($WindowW >= 1200) {
                if ($win.scrollTop() >= (offsetT)) {
                    $threebar.find(".leftbar-con").css({
                        "position": "fixed",
                        "top": 0
                    });
                } else {
                    $threebar.find(".leftbar-con").css("position", "static")
                }
            }
        });
    }

    // Array
    var imagesArr = [];
    $('#article-content').find("img").each(function (index, Element) {
        imagesArr.push(Element)
    });
    mediumZoom(imagesArr, {
        margin: 24,
        background: '#FFFFFF',
        scrollOffset: 0
    })

</script><script>    (function (i, s, o, g, r, a, m) {
        i['GoogleAnalyticsObject'] = r;
        i[r] = i[r] || function () {
                    (i[r].q = i[r].q || []).push(arguments)
                }, i[r].l = 1 * new Date();
        a = s.createElement(o),
                m = s.getElementsByTagName(o)[0];
        a.async = 1;
        a.src = g;
        m.parentNode.insertBefore(a, m)
    })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

    ga('create', 'UA-3448069-1', 'css88.com');
    ga('send', 'pageview');

</script><script>    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?08985692e4db1e8be1cff8097c2979b7";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script><script>    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script></body></html>