有段日子没更新,最近使用ffmepg,这里记录一下
我这边就直说一下我工作中遇到的注意事项和使用方法,就不太详细说了
首先是安装的问题,windwos的话比较简单,官网下载安装文件,解压之后。设置环境变量
系统环境变量内 path新增 你的 解压包的位置下的
我的是这样。然后运行cmd 输入ffmepeg可以看一下输出
这样就算是安装成功了
linux的话,我个人感觉会非常麻烦,
首先wget下载包,解压,编译,编译过程中可能出现问题,然后百度错误按照步骤走
变异之后增加环境变量
最后要注意的是,安装之后,假如使用转场 可能会报错
“fatal error: x264.h: No such file or directo
大概是这个,也就是说还需要全装这个插件,至于步骤,我记不得了,比较麻烦,安装之后中添加环境变量就算是完成了。
然后下面说下基本的命令,首先是图片转视频
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 (要生成的文件)
这条指令的意思是
- -i 也就是指定文件
- -filter_complex是指定视频过滤器
- [0][1]xfade 是使用xfade过滤器
- transition是转场持续多久
- duration是转场从多少秒开始
- format指定格式
需要注意的点
- 如果transition 加上duration的时间大于你的原视频时间,那么你下一个转场视频直接会消失没有,我卡挺久的,所以建议大家计算出要转场的第一个视频的时长,用来就算下一次转场从多久开始
接下来就是 增加音乐
ffmpeg -i (增加音乐的文件)-f concat -safe 0 -i (指定的音乐文件) -t (视频时长) -c copy -map 0:v:0 -map 1:a:0 -y 要生成的文件
这一条命令需要注意的点
- 有可能你的音频时间短,视频时间长,那么你就需要 音频文件循环写入txt文件,用来读取,循环播放音乐,也有可能还有别的方法,我懒得找了文件格式如下,可以多输出几次
- -t参数,如果视频短,音乐长,那么默认会 播放完音乐才会停止视频,所以我计算了视频时长,来指定播放的时间
- 记得先去除原视频的声音
接下来是去除原视频的声音指令
"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所以,大家用别的语言也可以尝试写出来
就这样吧,有很多不足,不过不去深入研究了,有什么错误的地方们还请大家指正