【教程】自动无损合并B站缓存video.m4s与audio.m4s为mp4文件
如何将B站安卓APP缓存的高清视频复制到电脑上将在几天后发布,请收藏关闭本站喵。
封面视频:https://www.bilibili.com/video/BV1Ub1JY9EJk/
第一步 – 添加自动合并环境
先进入ffmpfg官网(https://ffmpeg.org/download.html ),找到Get packages & executable files,鼠标移动到蓝色那个微软的图标(第一个箭头),会出现Windows EXE Files,再找到Windows builds from gyan.dev(第二个箭头),点击进去,会进入ffmpeg文件的下载页面。
进入ffmpeg文件的下载页面后,直接Ctrl+F,搜索ffmpeg-release-full.7z这个字段,可以找到适合win系统的ffmpeg文件,下载后可以得到一个压缩文件。
解压,进入bin文件夹,找到ffmpeg.exe,将这个文件复制到C:\Windows\System32\ 这个目录。
第二步 合并
进入B站缓存的文件夹,找到视频的所在文件夹,这个文件夹一般都三个文件audio.m4s、index.json、video.m4s,因为从B站安卓客户端缓存的文件没有标题,只有随机的数字,所以这里建议直接在每个视频的文件夹里做合并,而不是把所有同名文件复制到同一个文件夹(多个视频需要合并的情况下)。
找到视频的文件夹之后,在文件夹的空白处,先按住Shift不松手,点击鼠标右键,可以看到弹出的菜单中有一个“在此处打开Powershell窗口”,点击,会出现windows PowerShell的界面,复制下面这段文字(二选一)到这个界面里面,然后按回车(也可以复制后,进入Powershell界面直接右键,会自动复制并执行):
1 |
ffmpeg -i video.m4s -i audio.m4s -map 0:v -map 1:a -c:v copy -c:a copy output.mp4 |
1 |
ffmpeg -i video.m4s -i audio.m4s -codec copy output.mp4 |
等待合并结束之后,会出现output.mp4这个视频文件,至此,文件合并完成。
接下来是最重要的一步,假如你在B站安卓APP缓存了很多视频,将这些视频缓存文件的文件夹全部放到一个文件夹内(最好原封不动的移动),然后进入Powershell窗口(就是Shift+鼠标右键那个步骤),先把Powershell界面放一边,然后将这段代码复制到TXT文件,将$rootDir = “C:\path\to\your\root\directory” # 请将此路径替换为你的实际根目录路径 里面的C:\path\to\your\root\directory修改为放视频缓存的文件夹,比如我将缓存文件夹放在D盘的123文件夹里,那么就是D:\123
修改完代码之后,复制全部代码,在Powershell界面里执行,这样,即可将每个缓存视频进行合并。
当出现 Write-Host “All folders processed.”既是所有文件都处理完毕了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
$rootDir = Get-Location $folders = Get-ChildItem -Path $rootDir -Directory $folders | ForEach-Object { Write-Output $_.FullName } foreach ($folder in $folders) { $currentFolderPath = $folder.FullName Write-Host "Processing folder: $currentFolderPath" function Find-MediaFiles { param ( [Parameter(Mandatory=$true)] [string]$startPath ) $mediaFiles = @{} $items = Get-ChildItem -Path $startPath -Recurse -File foreach ($item in $items) { if ($item.Name -eq "audio.m4s") { $mediaFiles["audio"] = $item.FullName } elseif ($item.Name -eq "video.m4s") { $mediaFiles["video"] = $item.FullName } } if ($mediaFiles.ContainsKey("audio") -and $mediaFiles.ContainsKey("video")) { return $mediaFiles } else { return $null } } $mediaFiles = Find-MediaFiles -startPath $currentFolderPath if ($mediaFiles -ne $null) { $mediaFolderPath = Split-Path -Path $mediaFiles["video"] $outputFile = Join-Path -Path $mediaFolderPath -ChildPath "output.mp4" $ffmpegCmd = "ffmpeg -i `"$($mediaFiles['video'])`" -i `"$($mediaFiles['audio'])`" -map 0:v -map 1:a -c:v copy -c:a copy `"$outputFile`"" Write-Host "Executing ffmpeg command: $ffmpegCmd" & ffmpeg -i "$($mediaFiles['video'])" -i "$($mediaFiles['audio'])" -map 0:v -map 1:a -c:v copy -c:a copy "$outputFile" Write-Host "Merged `$outputFile successfully." } else { Write-Host "No audio.m4s and video.m4s found in folder: $currentFolderPath" } } Write-Host "All folders processed." |
如果出现already exists. Overwrite?,就说明之前合并过,输入Y再回车就可以重新合并。