关于ffmpeg的使用过程中遇到的点(php)

有段日子没更新,最近使用ffmepg,这里记录一下

刚发现一个很坑的地方就是。你设置了环境变量,在win下 cmd中 直接输入ffmpeg 是正常,php 执行  exec("ffmpeg  ........")也正常,但是linux 命令行的时候也可以,但是php代码的时候可能就不能执行了,需要把ffmpeg的安装目录也输入进去,通过 php exec("/use/loc/ffmpeg/bin/ffmpeg  ........")这样执行,至于别的语言,暂时没试过就不太清楚  

我这边就直说一下我工作中遇到的注意事项和使用方法,就不太详细说了

首先是安装的问题,windwos的话比较简单,官网下载安装文件,解压之后。设置环境变量

系统环境变量内  path新增  你的 解压包的位置下的

我的是这样。然后运行cmd  输入ffmepeg可以看一下输出

 关于ffmpeg的使用过程中遇到的点(php)_第1张图片

这样就算是安装成功了

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 (要生成的文件)

这条指令的意思是

  1. -i 也就是指定文件  
  2. -filter_complex是指定视频过滤器  
  3. [0][1]xfade 是使用xfade过滤器
  4. transition是转场持续多久
  5. duration是转场从多少秒开始
  6. format指定格式

需要注意的点

  1. 如果transition 加上duration的时间大于你的原视频时间,那么你下一个转场视频直接会消失没有,我卡挺久的,所以建议大家计算出要转场的第一个视频的时长,用来就算下一次转场从多久开始

接下来就是 增加音乐

ffmpeg -i (增加音乐的文件)-f concat -safe 0 -i (指定的音乐文件) -t (视频时长) -c copy -map 0:v:0 -map 1:a:0 -y 要生成的文件

这一条命令需要注意的点

  1.  有可能你的音频时间短,视频时间长,那么你就需要 音频文件循环写入txt文件,用来读取,循环播放音乐,也有可能还有别的方法,我懒得找了文件格式如下,可以多输出几次
  2.   -t参数,如果视频短,音乐长,那么默认会 播放完音乐才会停止视频,所以我计算了视频时长,来指定播放的时间
  3. 记得先去除原视频的声音

接下来是去除原视频的声音指令

"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所以,大家用别的语言也可以尝试写出来

就这样吧,有很多不足,不过不去深入研究了,有什么错误的地方们还请大家指正

你可能感兴趣的:(ffmpeg)