有段日子没更新,最近使用ffmepg,这里记录一下
刚发现一个很坑的地方就是。你设置了环境变量,在win下 cmd中 直接输入ffmpeg 是正常,php 执行 exec("ffmpeg ........")也正常,但是linux 命令行的时候也可以,但是php代码的时候可能就不能执行了,需要把ffmpeg的安装目录也输入进去,通过 php exec("/use/loc/ffmpeg/bin/ffmpeg ........")这样执行,至于别的语言,暂时没试过就不太清楚
我这边就直说一下我工作中遇到的注意事项和使用方法,就不太详细说了
首先是安装的问题,windwos的话比较简单,官网下载安装文件,解压之后。设置环境变量
系统环境变量内 path新增 你的 解压包的位置下的
我的是这样。然后运行cmd 输入ffmepeg可以看一下输出
这样就算是安装成功了
linux的话,我个人感觉会非常麻烦,
首先wget下载包,解压,编译,编译过程中可能出现问题,然后百度错误按照步骤走
变异之后增加环境变量
最后要注意的是,安装之后,假如使用转场 可能会报错
大概是这个,也就是说还需要全装这个插件,至于步骤,我记不得了,比较麻烦,安装之后中添加环境变量就算是完成了。
然后下面说下基本的命令,首先是图片转视频
ffmpeg -r 10 -f image2 -loop 1 -i (图片的路径) -s 1080x1920 -pix_fmt yuvj420p -t 3 -y -vcodec libx264 " (要生成的视频路径)
这条指令没有特别要注意的
这段话的意思 -y 确定或者说覆盖 一直确认的意思 -r 是说以一秒10帧读入文件 -loop 1 我记得是循环的意思, -s是调整分辨率的 -pix_fmt应该是指定格式, -t 是要生成的视频时间, -vcodec 强制视频编码
然后是拼接专场,切记,转场一定要4.2以上的版本这比较麻烦,因为大多是多文件转场,那么ffmpeg命令会很麻烦这里提供一个思路就是两个两个的拼接,最后只返回一个,这里有个缺点就是会生成多余文件,如果有更高的方法,还请指教
ffmpeg -i (第一个文件) -i (第二个文件) -y -filter_complex [0][1]xfade=transition=(你要专场的样子,官网有Xfade – FFmpeg):duration=1:offset=1,format=yuv420p -y (要生成的文件)
这条指令的意思是
需要注意的点
接下来就是 增加音乐
ffmpeg -i (增加音乐的文件)-f concat -safe 0 -i (指定的音乐文件) -t (视频时长) -c copy -map 0:v:0 -map 1:a:0 -y 要生成的文件
这一条命令需要注意的点
接下来是去除原视频的声音指令
"ffmpeg -i (要去除的文件) -vcodec copy -y -an (去除后的文件存储位置)
计算时间的话,这里有个方法
public static function getVideoTime($file): int
{
$duration_in_seconds = 0;
$vtime = false;
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$commond = "ffmpeg -i $file 2>&1";
exec($commond, $str_res, $str_r);
if (is_array($str_res)) {
foreach ($str_res as $v) {
if (str_contains($v, 'Duration')) {
$vtime = substr($v, stripos($v, '.') - 8, 8);//' Duration: 00:24:28.14, start: 0.000000, bitrate: 486 kb/s'
break;
}
}
}
} else {
$vtime = exec("ffmpeg -i " . $file . " 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");//总长度
}
if ($vtime) {
$duration = explode(":", $vtime);
if ($duration) {
$duration_in_seconds = $duration[0] * 3600 + $duration[1] * 60 + round($duration[2]);//转化为秒
}
}
return $duration_in_seconds;
}
因为我用的php所以,大家用别的语言也可以尝试写出来
就这样吧,有很多不足,不过不去深入研究了,有什么错误的地方们还请大家指正