哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频
短信预约 -IT技能 免费直播动态提醒
window下载安装FFmpeg
- 打开ffMpeg官网
- 选择window=>Windows builds from gyan.dev
- 打开https://www.gyan.dev/ffmpeg/builds/
- 这里是上面提取的下载链接如果过期不能用自己去官网下
配置FFmpeg环境变量
上面下载的FFmpeg是绿色软件,下载解压到你的常用软件安装目录即可,然后进入bin复制全路径配置下系统环境变量即可
终端命令处理
# 常规命令ffmpeg -i video.m4s -i audio.m4s -codec copy video.mp4# 屏蔽输出日志ffmpeg -loglevel quiet -i video.m4s -i audio.m4s -codec copy video.mp4
使用PHP调用FFmpeg
- https://github.com/PHP-FFMpeg/PHP-FFMpeg/
// require 'vendor/autoload.php';// $ffmpeg = FFMpeg\FFMpeg::create();// $oldAudio = $ffmpeg->open('./assets/32.amr');// $newAudio = new FFMpeg\Format\Audio\Mp3();// $newAudio->setAudioKiloBitrate(8); // 设置音频比特// $oldAudio->save($newAudio, './assets/32.mp3');// shell_exec("ffmpeg -i 32.amr b.mp3"); // cmd可执行// $file = './class="lazy" data-src/32.amr';// $outFile = './class="lazy" data-src/b.mp3';// $handle = popen("ffmpeg -i $file $outFile", 'w'); // pclose($handle);// $filePath = './class="lazy" data-src/32.amr';// $filePath_mp = './class="lazy" data-src/b.mp3';// echo "ffmpeg -i $filePath $filePath_mp";// $handle = popen("ffmpeg -i $filePath $filePath_mp", 'w');// pclose($handle);shell_exec("ffmpeg -i video.m4s -i audio.m4s -codec copy video.mp4"); // cmd可执行
- 批量处理程序
date_default_timezone_set("PRC");header("Content-type: text/html; charset=utf-8"); set_time_limit(0);// 遍历获取文件function getDirFile($path = null, $deep = true) { if (empty($path)) { return []; } $files = scandir($path); $fileItem = []; foreach($files as $v) { $newPath = $path .DIRECTORY_SEPARATOR.$v; if($deep && is_dir($newPath) && $v != '.' && $v != '..') { if (is_numeric($deep)) { $deep--; } $fileItem = array_merge($fileItem, getDirFile($newPath, $deep)); }else if(is_file($newPath)){ $fileItem[] = $newPath; } } return $fileItem;}// 遍历获取文件夹function getDir($path = null, $deep = true) { if (empty($path)) { return []; } $files = scandir($path); $dirList = []; foreach($files as $v) { $newPath = $path .DIRECTORY_SEPARATOR.$v; if (is_dir($newPath) && $v != '.' && $v != '..') { $dirList[] = $newPath; if ($deep) { if (is_numeric($deep)) { $deep--; } $dirList = array_merge($dirList, getDir($newPath, $deep)); } } } return $dirList;}//判断文件夹是否存在,没有则新建。if (!function_exists('mkdirs')) { function mkdirs($dir, $mode = 0777) { if (is_dir($dir) || @mkdir($dir, $mode)) { return true; } if (!mkdirs(dirname($dir), $mode)) { return false; } return @mkdir($dir, $mode); }}function do_rmdir($dirname, $self = false) { # 检查文件或目录是否存在 if (!file_exists($dirname)) { return false; } # 是文件进行删除 if (is_file($dirname) || is_link($dirname)) { return unlink($dirname); } # 开始读取目录 $dir = dir($dirname); if ($dir) { while (false !== $entry = $dir->read()) { if ($entry == '.' || $entry == '..') { continue; } # 进行文件删除 do_rmdir($dirname . '/' . $entry); } } # 关闭目录 $dir->close(); # 是否删除本身文件夹 $self && rmdir($dirname); # 成功返回 return ['code' => 200];}$inputParams = getopt('d:s:'); // 接收-d参数if (empty($inputParams['d']) || !file_exists($inputParams['d'])) { die(PHP_EOL.'请输入正确的B站视频文件目录');}// $isNo = empty($inputParams['s'])?false: true;// print_r($inputParams);// die();$inputDir = $inputParams['d'];$outputDir = dirname(__FILE__).DIRECTORY_SEPARATOR. $inputDir.'Mp4';do_rmdir($outputDir, true);mkdirs($outputDir);$isDebug = false;$list = getDir($inputDir, false);if (empty($list)) { die(PHP_EOL.'空文件夹。。。');}$i = 0;foreach ($list as $key => $item) { $entryJson = $item. DIRECTORY_SEPARATOR . 'entry.json'; $audio = $item. DIRECTORY_SEPARATOR . '80' . DIRECTORY_SEPARATOR . 'audio.m4s'; $video = $item. DIRECTORY_SEPARATOR . '80' . DIRECTORY_SEPARATOR . 'video.m4s'; if (file_exists($entryJson) && file_exists($audio) && file_exists($video)) { $entryJsonText = file_get_contents($item. DIRECTORY_SEPARATOR . 'entry.json'); if (!empty($entryJsonText)) { $entryJsonText = json_decode($entryJsonText, true); $fileName = $entryJsonText['page_data']['part']; // $fileName = explode($separator, $fileName, 2); // $fileName[0] = str_pad($fileName[0], 3, '0', STR_PAD_LEFT ); // $fileName = implode('.', $fileName); // 替换中文括号 $fileName = str_replace('(', '(', $fileName); $fileName = str_replace(')', ')', $fileName); // 替换文件名不能含有的符号? \ / : | * " $fileName = str_replace('\\', '_{_', $fileName); $fileName = str_replace('/', '_}_', $fileName); $fileName = str_replace(':', ':', $fileName); $fileName = str_replace('*', '_ALL_', $fileName); $fileName = str_replace('<', '《', $fileName); $fileName = str_replace('>', '》', $fileName); $fileName = str_replace('|', '_OR_', $fileName); // 是否开启编号 $No = str_pad($entryJsonText['page_data']['page'], 3, '0', STR_PAD_LEFT ); $cmdFileName = $outputDir . DIRECTORY_SEPARATOR . $No . '.mp4'; $fileName = $outputDir . DIRECTORY_SEPARATOR . $No. '.' . $fileName . '.mp4'; $cmd = "ffmpeg ".($isDebug? "": "-loglevel quiet")." -i {$audio} -i {$video} -codec copy {$cmdFileName}"; shell_exec($cmd); // cmd可执行 // 重命名 rename($cmdFileName, $fileName); print_r([ 'index' => $i++, 'path' => $item, 'fileName' => $fileName, 'cmd' => $cmd, ]); } } }echo PHP_EOL;print_r(array( '总计文件' => count($list), '完成文件' => $i,));
- 运行脚本
php index.php -d 目录名
参考
来源地址:https://blog.csdn.net/qq_35606400/article/details/132017381
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341