b站安卓手机下载视频后使用matlab自动转为mp4文件并归档

第一步:
首先我们新建一个文件夹,比如我这里的第一个文件夹:b站视频。在这里插入图片描述
第二步:
在matlab中创建新函数用ffmpeg软件来合并b站视频。我这里是matlab2019a,有些版本可能有些matlab自带函数不支持
代码如下:

function bilibili_Video_combined
%%确保根文件夹中的子文件夹名称都是数字
%%根文件夹包含三个转换文件
path=[uigetdir,'\'];
file1=[path,'b站m4s转MP4.bat'];
file2=[path,'b站blv转MP4.bat'];
% try
% rmdir([path,'输出视频']);
% catch
% end
pathall=dir(path);
pathall=struct2cell(pathall);
pathall=pathall(1,cell2mat(pathall(5,:))==1)';
pathall=pathall(3:end);
[~,loc]=sort(cellfun(@str2double,pathall));
pathall=pathall(loc);
%%第一阶段:生成输出视频
for i=1:size(pathall,1)
try
path1=([path,pathall{i},'\']);%path1是pathall的延伸
path2=dir(path1);
path2=struct2cell(path2);
path2=path2(1,cell2mat(path2(5,:))==1)';
path2=path2(3:end);
[~,loc]=sort(cellfun(@str2double,path2));
path2=path2(loc);
for ii=1:size(path2,1)
path3=([path1,path2{ii},'\',]);
[dirall,~,dirsize]=file_thorough(path3,[],[],[]);
m4s='\S+m4s';
out1 = rmempty_cellarray(regexp(dirall,m4s,'match'));
blv='\S+blv';
out2 = rmempty_cellarray(regexp(dirall,blv,'match'));
if isempty(out1)~=1
    loc=find(out1{1}{1}=='\');
    path4=out1{1}{1}(1:loc(end));
    try
    copyfile(file1,path4);   
    catch
    disp([path4,'已存在bat文件']);    
    end
    winopen([path4,'b站m4s转MP4.bat']);
    pause(round(sum(dirsize)/10000000));
%     pause(3);
end
if isempty(out2)~=1
    loc=find(out2{1}{1}=='\');
    path4=out2{1}{1}(1:loc(end));
    try
    copyfile(file2,path4);   
    catch
    disp([path4,'已存在bat文件']);    
    end
    winopen([path4,'b站blv转MP4.bat']);
    pause(round(sum(dirsize)/10000000));
%     pause(3);
end
disp(['子目录已进行',int2str(ii),'/',int2str(size(path2,1)),' 总目录已进行 ',...
    int2str(100*round((i)/(size(pathall,1)),3)),'%']);       
end
catch
disp('子目录文件不符合程序规范');       
end
end

while 1  %判断所有的cmd窗口是否完成,再进行第二阶段
    [~,task]=system('query process');
    TF=strfind(task,'cmd.exe');
    if length(TF)<=1
        break
    end
end
pause(2);
%%第二阶段:输出视频移动到同一个输出视频文件夹中

for i=1:size(pathall,1)
path1=([path,pathall{i},'\']);
path2=dir(path1);
path2=struct2cell(path2);
path2=path2(1,cell2mat(path2(5,:))==1)';
path2=path2(3:end);
for ii=1:size(path2,1)
path3=([path1,path2{ii},'\',]);
[dirall,~,~]=file_thorough(path3,[],[],[]);
json='\S+entry.json';
out = rmempty_cellarray(regexp(dirall,json,'match'));
data=loadjson(out{1}{1},'Encoding','UTF-8');
try
title_mp4=data.page_data.download_subtitle;
title_path=data.title;
catch
title_mp4=data.title;
title_path=data.title;
end
mp4='\S+output.mp4';
out3 = rmempty_cellarray(regexp(dirall,mp4,'match'));
nostr='\/:*?"<>|';
for n=1:size(nostr,2)
    title_mp4(title_mp4==nostr(n))=' ';
    title_path(title_path==nostr(n))=' ';
end
warning off;
path9=[path,title_path,'\'];
mkdir(path9);
try
movefile(out3{1}{1},[path9,title_mp4,'.mp4']);
catch
try
disp(['未找到文件',out3{1}{1}]);
catch
disp('未找到文件');
end
end
end
end
%%测试进度

其中使用到的自己编的子函数有

  1. file_thorough顾名思义,遍历文件夹中的子文件
function [dirall,dirmap,dirsize]=file_thorough(folder1,dirall,dirmap,dirsize)
%%example:[dirall,dirmap]=file_thorough(path1,[],[],[]);命令例子
folder1=dir(folder1);
    for i1 = 1 : length(folder1)
    if( isequal( folder1( i1 ).name, '.' )||...
        isequal( folder1( i1 ).name, '..'))               % 如果不是目录则跳过
    else
       file1 = [folder1(i1).folder,'\',folder1( i1 ).name] ;
    if folder1(i1).isdir==0
           dirall=cat(1,dirall,{file1});    
           a=find(file1=='\');
           dirmap=cat(1,dirmap,length(a));
           filesize=dir(file1);
           dirsize=cat(1,dirsize,filesize.bytes);
    else
       folder2 = [folder1( i1 ).folder,'\',folder1( i1 ).name] ;
       [dirall,dirmap,dirsize]=file_thorough(folder2,dirall,dirmap,dirsize);
    end
    end
    end
  1. rmempty_cellarray,去除使用正则表达式regexp函数后找到的空的元胞。
function [out1,judge]=rmempty_cellarray(out1)
judge=nan(size(out1)); %完美的正则表达式无需判断数据中有错误的cell
for i=1:size(out1,1)
    for j=1:size(out1,2)
        judge(i,j)=double(~isempty(out1{i,j}));
    end
end
out1=out1(judge==1);
  1. loadjson,这个函数是在matlab fileexchange中下载的,链接如下:
    https://ww2.mathworks.cn/matlabcentral/fileexchange/33381-jsonlab-a-toolbox-to-encode-decode-json-files

第三步:
安装ffmpeg,具体详情关联
https://blog.csdn.net/xqhrs232/article/details/104230091?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158759776719195239856573%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=158759776719195239856573&biz_id=0&utm_source=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-4
安装ffmpeg,然后设置环境变量中的路径。

第四步:需要放入b站视频文件夹的bat脚本文件有
一:

@echo off
title=ffpeg B站视频合并脚本 2019年2月5日
echo 1、本脚本依赖于ffpeg 请将ffpeg添加到环境变量中
echo 2、放到视频的根目录下双击运行
:::定义变量并设置默认值
set FileName=output
set OriginalVideoType=blv
set PackageVideoType=mp4
::接收用户输入
::set /p FileName=输入文件名[默认名总合成]
::set /p OriginalVideoType=输入源视频格式[默认blv不用带点]
::set /p PackageVideoType=输入封装的格式[默认mp4不用带点]
::生成ffmpeng配置文件
for %%i in (*.%OriginalVideoType%*) do echo file '%%i' >> ff.txt
::调用ffmpeg合并视频
ffmpeg -f concat -i ./ff.txt -c copy %FileName%.%PackageVideoType%
::删除生成的ffmpeg配置文件
del ff.txt
::pause

以上文本保存为《b站blv转MP4.bat》
二:

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

以上文本保存为《b站m4s转MP4.bat》

第五步:
将上述两个bat文件放入b站视频。
将安卓手机Android\data\tv.danmaku.bili\download目录下下载的b站视频复制到b
站视频文件夹中。
打开matlab2019a运行bilibili_Video_combined函数。
实际效果如图:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述非文字的子文件夹中的内容就是所要的mp4文件了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值