@ 起因是最早是为了缓存网课,从手机缓存拷贝出来后却没法直接看,所以就开始搜罗网上大佬提供的方法,身为一个同样写代码的人,显然就采用了最简单的方法:
1. ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a aac -strict experimental output.mp4
2. cmd下的方法:copy /b *.blv output.flv
用cmd来做这件事再合适不过了,就是没有标题,所以经过翻箱倒柜后,标题实际保存在 entry.json 文件内部,显然 cmd 去读取 json 是一个天然的麻烦事。那么接下来理所当然的可以用 python 来做。
不过我发现 PowerShell 可能是一个更好的选择,如果你要处理什么windows系统的操作却有受限于 cmd 的无力,那么 PS1 就天然的具有包括cmd的丰富功能和极高的系统权限(毕竟是亲儿子),先贴最后代码:GetBilibiliMedia.ps1
。
Get-ChildItem -Directory | ForEach-Object -Process{
$FILE = $_.name
$CONF = ConvertFrom-Json -InputObject (Get-Content -Path ".\$FILE\entry.json" -Encoding utf8)
$PAGE = $CONF.page_data.download_subtitle
$ab = 80,64,32,16 #清晰度的不同文件夹名称会变,有新的就后面添加
foreach ($b in $ab){
try{
echo ".\$FILE\$b\video.m4s",".\$FILE\$b\audio.m4s","$PAGE.MP4"
ffmpeg -y -i ".\$FILE\$b\video.m4s" -i ".\$FILE\$b\audio.m4s" -c:v copy -c:a copy "$PAGE.MP4"
}
catch{}
}
$ap = "lua.flv720.bili2api.64" #清晰度的不同文件夹名称会变
foreach ($p in $ap){
try{
$PAGEF = '"'+ $PAGE + '.flv"'
echo "copy /y /b .\$FILE\$p\*.blv $PAGEF"
cmd /c "copy /y /b .\$FILE\$p\*.blv $PAGEF"
}
catch{}
}
}
接下来记录一下全部流程:
- 从手机导出离线缓存,位置在
0\Android\data\tv.danmaku.bili\download\43019622
这里还有一个Android的BUG就是usb的MTP模式下有许多机型是显示文件不全的,这个坑Google说不填,没办法只好用第三方了。
在试了几种方案后我最后发现最快的方式是:电脑连接手机分享的无线,然后用Dkuto
传输,其实是个开源软件,可以从52上下载https://www.52pojie.cn/thread-1086314-1-1.html - 安装
ffmpeg
,解压缩,添加一下ffmpeg\bin
的环境变量,
下载地址:https://ffmpeg.zeranoe.com/builds/win64/static/ - 在
\43019622
下新建脚本GetBilibiliMedia.ps1
,右键直接运行,等待完成自动退出,自动由系统多线程。
PS:两处可以添加的文件夹名称就是这个16,m4s格式的添加到上面,blv格式的添加到下面