有给视频转码的需求,但是视频很多,一个一个转太累,所以写一个脚本来转码。
又因为熟悉php,就直接写php脚本了。
1 准备工作
使用php,当然需要php环境了,还有转码的软件ffmpeg。
1.1 PHP运行环境下载
在php官网上下载php7.4的windows版:
https://www.php.net/releases/
php-7.4.33-nts-Win32-vc15-x64.zip
1.2 ffmpeg下载
在ffmpeg官网下载最新的Windows版:
https://ffmpeg.org/download.html
ffmpeg-master-latest-win64-gpl.zip
2 环境配置
- 将php-7.4.33-nts-Win32-vc15-x64.zip解压,并将 php-7.4.33-nts-Win32-vc15-x64 目录添加到环境变量 PATH中
在cmd 或 powershell 中 执行 php -v,显示
1
2
3
PHP 7.4.33 (cli) (built: Nov 2 2022 15:06:48) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
- 将ffmpeg-master-latest-win64-gpl.zip解压,并将 ffmpeg-master-latest-win64-gpl\bin 目录添加到环境变量PATH中
在 cmd 或 powershell 中执行 ffmpeg -version,显示
1
2
3
4
ffmpeg version N-110402-ge3143703e9-20230427 Copyright (c) 2000-2023 the FFmpeg developers
...
...
libpostproc 57. 2.100 / 57. 2.100
3 脚本编写
新建 run.php
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
ini_set('memory_limit', '1024m');
// 原来的目录(当前目录)
$fileDir = '.';
// 新的目录
$fileOutput = '.' . DIRECTORY_SEPARATOR . 'Videos';
$mp4Files = [];
// 目录下是否有mp4
$files = scandir($fileDir);
foreach ($files as $file) {
if ('mp4' === strtolower(pathinfo($file, PATHINFO_EXTENSION))) {
$mp4Files[] = $fileDir . DIRECTORY_SEPARATOR . $file;
}
}
$videoCount = count($mp4Files);
foreach ($mp4Files as $i => $mp4) {
$outPath = $fileOutput . DIRECTORY_SEPARATOR . substr($mp4, 2);
$cmd = "ffmpeg -i $mp4 -b:v 1M $outPath -loglevel quiet";
echo 'current:' . ($i + 1) . '/ total: ' . $videoCount . PHP_EOL;
echo "Starting ffmpeg...\n\n";
echo shell_exec($cmd);
echo "Done.\n";
}
?>
4 执行脚本
进入脚本存放的目录(转码视频目录) 在 cmd 或 powershell 中直接执行
1
php run.php
- 核心内容就是:使用php的
shell_exec
直接执行拼接好的命令。