FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在 Linux 下开发出来的,但它可以在包括 Windows 在内的大多数操作系统中编译。这个项目是由 Fabrice Bellard 发起的,现在由 Michael Niedermayer 主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。

1、安装

安装EPEL Release,因为安装需要使用其他的repo源,所以需要EPEL支持

[root@VM_0_17_centos ~]# sudo yum install -y epel-release rpm

如果缺少code提示,执行此命令

[root@VM_0_17_centos ~]# sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

安装完成之后,可以查看是否安装成功

[root@VM_0_17_centos ~]# yum repolist

安装Nux-Dextop源

导入一个Code

[root@VM_0_17_centos ~]# sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

安装nux-dextop 源

[root@VM_0_17_centos ~]# sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm

查看repo源是否安装成功

[root@VM_0_17_centos ~]# sudo yum repolist

安装FFmpeg

[root@VM_0_17_centos ~]# sudo yum install -y ffmpeg

查看版本

[root@VM_0_17_centos ~]# ffmpeg -version

2、应用

  1. 把avi格式转换为mp4格式,输入压缩的尺寸,使用h264进行压缩。
    ffmpeg –i linuxidc.mp4 –vcodec h264 –s 1280*720 -acodec copy –f mp4 linuxidc.com.mp4

  2. 将一张jpg图片转为MP4格式视频
    ffmpeg -r 25 -loop 1 -i linuxidc.jpg -pix_fmt yuv420p -vcodec libx264 -b:v 600k -r:v 25 -preset medium -crf 30 -s 1024x768 -vframes 250 -r 25 -t 10 ~/linuxidc.com.mp4

3、FFmpeg常用基本命令

  1. 分离视频音频流
    ffmpeg -i linuxidc_file -vcodec copy -an linuxdc_file_video  #分离视频流
    ffmpeg -i linuxidc_file -acodec copy -vn linuxdc_file_audio  #分离音频流

  2. 视频解复用
    ffmpeg –i linuxidc.mp4 –vcodec copy –an –f m4v linuxidc.264
    ffmpeg –i linuxidc.avi –vcodec copy –an –f m4v linuxidc.264

  3. 视频转码
    ffmpeg –i linuxidc.mp4 –vcodec h264 –s 352*278 –an –f m4v linuxidc.264 #转码为码流原始文件
    ffmpeg –i linuxidc.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v linuxidc.264 #转码为码流原始文件
    ffmpeg –i linuxidc.avi -vcodec mpeg4 –vtag xvid –qsame linuxidc_xvid.avi #转码为封装文件

    -bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制

  4. 视频封装
    ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy linuxdc_file

  5. 视频剪切
    ffmpeg –i linuxidc.avi –r 1 –f image2 image-%3d.jpeg #提取图片
    ffmpeg -ss 0:1:30 -t 0:0:20 -i linuxidc.avi -vcodec copy -acodec copy linuxdc.avi #剪切视频

4、封装方法使用

获取视频封面图方法

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* 截取视频图片、获得视频文件的总长度时间和创建时间
* $path 视频路径
* $width 截图大小 宽
* $height 截图大小 长
* $second 第几秒截图,生成几秒gif图
* $type 转换类型 gif png
* 生成图片存放路径不会自动生成目录
*/
public status function cutPicture($path, $width = '', $height = '', $second = 1, $type = "gif"){
try{
if($path){
$url = str_replace(request()->domain().'/',env('root_path').'public/',$path);//获取视频绝对路径

// $name = uniqid().time().'.png';//图片名字
$name = uniqid().time().'.'.$type;//图片名字

$to = "public/uploads/video_cover/";//生成图片存放路径(文件夹需要手动创建)

switch ($type) {
case 'png':
if($width && $height){
//ffmpeg命令,具体啥意思可以百度
$str = "ffmpeg -i ".$url." -y -f mjpeg -ss ".$second." -t 1 -s ".$width."*".$height .env('root_path') . $to . $name;//视频封面
}else{
$str = "ffmpeg -i ".$url." -y -f mjpeg -ss ".$second." -t 1 ".env('root_path') . $to . $name;
}
break;
case 'gif':
if($width && $height){
$str = "ffmpeg -i ".$url." -t ".$second." -s ".$width."*".$height ." -pix_fmt rgb24 ".env('root_path') . $to . $name;//gif
}else{
$str = "ffmpeg -i ".$url." -t ".$second." ".env('root_path') . $to . $name;
}
break;
default:
break;
}

exec($str, $output, $status);//执行上述语句

$pic_path = request()->domain()."/uploads/video_cover/".$name;//获取生成图路径

$vtime = exec("ffmpeg -i ".$url." 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//");//总长度

// $ctime = date("Y-m-d H:i:s",filectime($url));//创建时间

return ['code'=>200, 'msg'=>'pic_path:视频封面图或gif图', 'pic_path'=>$pic_path, 'video_time'=>$vtime];
}else{
return ['code'=>500, 'msg'=>'未获取视频'];
}

}catch (\Exception $e){
return ['code'=>500, 'msg'=>$e->getMessage()];
}
}

5、参考地址

https://www.linuxidc.com/Linux/2018-10/154934.htm

https://blog.csdn.net/A9925/article/details/80334700