我的编程空间,编程开发者的网络收藏夹
学习永远不晚

哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频

window下载安装FFmpeg

配置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

哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录