第一步:
首先我们新建一个文件夹,比如我这里的第一个文件夹: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
%%测试进度
其中使用到的自己编的子函数有
- 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
- 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);
- 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文件了。