FFmpeg 基本使用

看完这篇文章,可能你会对音视频处理有很大兴趣,再也不发愁怎么去处理音视频。
市面上大部分播放器,解码转码音视频之类的工具,基本都是使用了FFmpeg技术,不管是暴风影音,QQ影音,格式工厂等等。本篇暂不讲音视频的各种格式。

1. FFmpeg介绍

FFmpeg 是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec—这是一个用于多个项目中音频和视频的解码器库,以及libavformat—个音频与视频格式转换库。
FFmpeg的官方网站是:http://ffmpeg.org/

2. 组件

ffmpeg一个命令行工具,用来对视频文档转换格式,也支持对电视卡即时编码
ffserver一个HTTP多媒体即时广播流服务器,支持时光平移
ffplay一个简单的播放器,基于SDL与FFmpeg库
libavcodec包含全部FFmpeg音频/视频编解码库
libavformat包含demuxers和muxer库
libavutil包含一些工具库
libpostproc对于视频做前处理的库
libswscale对于影像作缩放的库

3. 常用命令

  • Windows下安装
  • 官网下载会跳转至 http://ffmpeg.zeranoe.com/builds/ 选择自己windows相应版本下载。
  • 该网站中的FFMPEG分为3个版本:Static,Shared,Dev。
  • 前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。
  • Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。
  • 打开系统命令行接面,切换到ffmpeg所在的目录,就可以使用这3个应用程序了。
    Linux下安装
  • 下载
    wget http://www.ffmpeg.org/releases/ffmpeg-x.x.x.tar.gz 或者直接在官网下载压缩包
  • 解压安装包
    tar -jxvf ffmpeg-x.x.tar.bz2
  • 进入解压目录
    cd ffmpeg-x.x
  • 编译安装
    ./configure --enable-shared && make && make install
    如果编译报错,请加选项(报错会提示选项内容)./configure --enable-shared --选项 && make && make install
  • 安装成功
    安装完成之后 执行 ffmpeg -version
    如果出现ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No such file or directory
    编辑/etc/ld.so.conf文件加入如下内容
    /usr/local/lib
    保存退出后执行ldconfig命令
    如果能够出现类似下列信息,说明ffmpeg安装成功。
    ffmpeg version 2.5.11 Copyright (c) 2000-2016 the FFmpeg developers
    built on Apr 17 2017 16:47:15 with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11)
    configuration: --enable-shared
    libavutil      54. 15.100 / 54. 15.100
    libavcodec     56. 13.100 / 56. 13.100
    libavformat    56. 15.102 / 56. 15.102
    libavdevice    56.  3.100 / 56.  3.100
    libavfilter     5.  2.103 /  5.  2.103
    libswscale      3.  1.101 /  3.  1.101
    libswresample   1.  1.100 /  1.  1.100

4. 常用命令

官网有ffmpeg,ffplay和ffprobe的相关命令,因命令参数太多就不一一详细解释,官网文档地址(英文):http://ffmpeg.org/documentation.html ,中文的网上也有许多。
进入官网第一个命令就是:
ffmpeg -i input.mp4 output.avi
-i 表示输入文件,将mp4文件转换为avi文件。
ffmpeg -i /tmp/a.wav -i /tmp/a.avi /tmp/a.avi
合并两个视频成为一个视频。
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
将logo图片想要贴到一个视频上,overlay=W-w(左上角),overlay=0:H-h(左下角),overlay=W-w:H-h(右下角)
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
将视频上的水印去掉,-vf delogo=x:y:w:h[:t[:show]],x:y 离左上角的坐标,w:h logo的宽和高,t: 矩形边缘的厚度默认值4,show:若设置为1有一个绿色的矩形,默认值0。
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic.jpeg
-r 表示每一秒几帧,-q:v表示存储jpeg的图像质量,一般2是高质量。
ffmpeg会把input.mp4,每隔一秒,存一张图片下来。假设有60s,那会有60张。
可以设置开始的时间,和你想要截取的时间。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic.jpeg
-ss 表示开始时间,-t 表示共要多少时间。
ffmpeg会从input.mp4的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。
下面是一段PHP代码截取视频封面图:

/**
 *  视频截取第一帧为视频封面
 *  @param  $video  视频地址  E:\\test\\20180830183239756651.mp4 | /home/data/user/1/video/2018092018395596584.mp4
 *  @return boolean
 */
public static function Cut($video_url){
    if(!$video_url){
        return false;
    }
    $video = dirname(__FILE__).'/data/'.$video_url;
    $info = pathinfo($video);
    $img = $info['dirname'].'/'.$info['filename'].'.jpg';

    // 判断windows还是Linux
    if(DIRECTORY_SEPARATOR == '\\'){
        @system("ffmpeg -i ".$video." -y -f image2 -ss 1 -t 1 ".$img, $status);
    }else{
        @exec("ffmpeg -i ".$video." -y -f image2 -ss 1 -t 1 ".$img, $arr, $status);
    }

    if($status){
        return '/'.$info['filename'].'.jpg';
    }
    return false;
}

由于可实现的东西太多,只举几个例子,用的时候还需自己去查看文档。

5. 结尾

你可以使用它们做任何音视频相关的视频,做个播放器,格式转换,转码解码,音频视频的特效,水印,推流拉流等等,功能实在太强大,此篇暂到这里结束。

讨论数量: 1

这就是辛技委的实力吗!?妈妈再也不用担心我怎么处理音视频了~!

4年前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!