ffmpeg 订阅
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1]  FFmpeg编码库可以使用GPU加速 展开全文
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1]  FFmpeg编码库可以使用GPU加速
信息
开发商
FFmpeg team
软件授权
开源
软件名称
Fast Forward Mpeg
更新时间
2019-6-5 [2]
软件版本
4.2
软件平台
Linux、Windows、Mac OS X
软件语言
C语言、汇编
标准协议
LGPL/GPL
ffmpeg功能
多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。视频采集功能ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可 以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。ffmpeg在Linux下的视频采集在Linux平台上,ffmpeg对V4L2的视频设备提供了很好的支持,如:./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp FFMpeg(4张) 以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为H263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了。ffmpeg在windows下的视频采集在windows下关于ffmpeg视频采集的资料非常少,但是ffmpeg还是支持windows下视频采集的。ffmpeg支持windows下video for windows(VFW)设备的视频采集,不过VFW设备已经过时,正在被WDM的视频设备所取代,但是ffmpeg还没有支持WDM的计划,不过好像有将WDM转为VFW的工具,因此ffmpeg还是可以在windows下进行视频采集的。视频格式转换功能ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式。视频截图功能对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。给视频加水印功能使用ffmpeg 视频添加水印(logo)。
收起全文
精华内容
下载资源
问答
  • ffmpeg
    千次阅读
    2022-01-24 09:31:48

    java中使用ffmpeg(spring boot)

    • ffmpeg命令百度搜索即可,利用 ffmpeg.addArgumen添加进去即可执行,参考mergeAv方法即可。
    • windows版本的整合,其依赖的jar包中有ffmpeg-amd64.exe可执行文件,其他系统原理类似。
    • ffmpeg执行较为耗时,cpu负载高,一般配合线程池异步使用,使用java整合,需自行考虑执行成本。
    • 本文中taskId和各种抛出的Exception,自行修改或删除。

    pom文件

        <dependency>
          <groupId>ws.schild</groupId>
          <artifactId>jave-all-deps</artifactId>
          <version>3.0.1</version>
          <exclusions>
            <!--  排除windows 32位系统      -->
            <exclusion>
              <groupId>ws.schild</groupId>
              <artifactId>jave-nativebin-win32</artifactId>
            </exclusion>
            <!--  排除linux 32位系统      -->
            <exclusion>
              <groupId>ws.schild</groupId>
              <artifactId>jave-nativebin-linux32</artifactId>
            </exclusion>
            <!-- 排除Mac系统-->
            <exclusion>
              <groupId>ws.schild</groupId>
              <artifactId>jave-nativebin-osx64</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    

    FfmpegUtil.java

    package com.ffm.test.util;
    
    // 各种excepting 可自定义,或者直接改成 Exception
    import com.mobvoi.ffm.common.exception.BaseException;
    import com.mobvoi.ffm.common.exception.CombineException;
    import com.mobvoi.ffm.common.exception.FrameRateException;
    import com.mobvoi.ffm.common.exception.PicException;
    import com.mobvoi.ffm.common.model.dto.SourceDetailInfoDto;
    import com.mobvoi.ffm.common.resp.ResultCode;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.URL;
    import lombok.extern.slf4j.Slf4j;
    import ws.schild.jave.EncoderException;
    import ws.schild.jave.MultimediaObject;
    import ws.schild.jave.info.MultimediaInfo;
    import ws.schild.jave.process.ProcessWrapper;
    import ws.schild.jave.process.ffmpeg.DefaultFFMPEGLocator;
    
    /**
     * 核心工具包
     *
     * @author shuishan
     * @since 2021/7/22
     */
    @Slf4j
    public class FfmpegUtil {
    
      /**
       * 获取音视频时长
       *
       * @param sourcePath
       * @return
       * @throws EncoderException
       */
      public static long getFileDuration(String sourcePath) throws EncoderException {
        MultimediaObject multimediaObject = new MultimediaObject(new File(sourcePath));
        MultimediaInfo multimediaInfo = multimediaObject.getInfo();
        return multimediaInfo.getDuration();
      }
    
    
      /**
       * 剪切音视频
       *
       * @param sourcePath
       * @param targetPath
       * @param offetTime   起始时间,格式 00:00:00.000   小时:分:秒.毫秒
       * @param endTime   同上
       * @throws Exception
       */
      public static void cutAv(String sourcePath, String targetPath, String offetTime, String endTime) {
        try {
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-ss");
          ffmpeg.addArgument(offetTime);
          ffmpeg.addArgument("-t");
          ffmpeg.addArgument(endTime);
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(sourcePath);
          ffmpeg.addArgument("-vcodec");
          ffmpeg.addArgument("copy");
          ffmpeg.addArgument("-acodec");
          ffmpeg.addArgument("copy");
          ffmpeg.addArgument(targetPath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("切除视频成功={}", targetPath);
        } catch (IOException e) {
          throw new CombineException(ResultCode.ERROR.getCode(), "剪切视频失败", null);
        }
      }
    
      /**
       * 等待命令执行成功,退出
       *
       * @param br
       * @throws IOException
       */
      private static void blockFfmpeg(BufferedReader br) throws IOException {
        String line;
        // 该方法阻塞线程,直至合成成功
        while ((line = br.readLine()) != null) {
          doNothing(line);
        }
      }
    
      /**
       * 打印日志,调试阶段可解开注释,观察执行情况
       *
       * @param line
       */
      private static void doNothing(String line) {
    //    log.info(line);
      }
    
    
      /**
       * 合并两个视频
       *
       * @param firstFragmentPath   资源本地路径或者url
       * @param secondFragmentPath  资源本地路径或者url**
       * @param targetPath     目标存储位置
       * @throws Exception
       */
      public static void mergeAv(String firstFragmentPath, String secondFragmentPath,
          String targetPath) {
        try {
          log.info("合并视频处理中firstFragmentPath={},secondFragmentPath={},请稍后.....", firstFragmentPath,
              secondFragmentPath);
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(firstFragmentPath);
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(secondFragmentPath);
          ffmpeg.addArgument("-filter_complex");
          ffmpeg.addArgument(
              "\"[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]\" -map \"[v]\" -map \"[a]\"");
          ffmpeg.addArgument(targetPath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("合并视频成功={}", targetPath);
        } catch (IOException e) {
          throw new CombineException(ResultCode.ERROR.getCode(), "合并视频失败", null);
        }
      }
    
    
      /**
       * 获取视频原声
       *
       * @param sourcePath  本地路径或者url
       * @param targetPath  本地存储路径
       */
      public static String getAudio(String sourcePath, String targetPath, String taskId) {
        try {
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(sourcePath);
          ffmpeg.addArgument("-f");
          ffmpeg.addArgument("mp3");
          ffmpeg.addArgument("-vn");
          ffmpeg.addArgument(targetPath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("获取视频音频={}", targetPath);
        } catch (IOException e) {
          throw new CombineException(ResultCode.ERROR.getCode(), "获取视频音频失败", taskId);
        }
        return targetPath;
      }
    
      /**
       * 合并音频
       *
       * @param originAudioPath  音频url或本地路径
       * @param magicAudioPath  音频url或本地路径
       * @param audioTargetPath  目标存储本地路径
       */
      public static void megerAudioAudio(String originAudioPath, String magicAudioPath,
          String audioTargetPath, String taskId) {
        try {
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(originAudioPath);
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(magicAudioPath);
          ffmpeg.addArgument("-filter_complex");
          ffmpeg.addArgument("amix=inputs=2:duration=first:dropout_transition=2");
          ffmpeg.addArgument("-f");
          ffmpeg.addArgument("mp3");
          ffmpeg.addArgument("-y");
          ffmpeg.addArgument(audioTargetPath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("合并音频={}", audioTargetPath);
        } catch (IOException e) {
          throw new CombineException(ResultCode.ERROR.getCode(), "合并音频失败", taskId);
        }
      }
    
    
    
      /**
       * 视频加声音
       *
       * @param videoPath   视频
       * @param megerAudioPath  音频
       * @param videoTargetPath 目标地址
       * @param taskId  可忽略,自行删除taskid
       * @throws Exception
       */
      public static void mergeVideoAndAudio(String videoPath, String megerAudioPath,
          String videoTargetPath, String taskId) {
        try {
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(videoPath);
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(megerAudioPath);
          ffmpeg.addArgument("-codec");
          ffmpeg.addArgument("copy");
          ffmpeg.addArgument("-shortest");
          ffmpeg.addArgument(videoTargetPath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("获取视频(去除音频)={}", videoTargetPath);
        } catch (IOException e) {
          throw new CombineException(ResultCode.ERROR.getCode(), "获取视频(去除音频)失败", taskId);
        }
      }
    
      /**
       * 视频增加字幕
       *
       * @param videoPath
       * @param sutitleVideoSavePath
       * @param wordPath  固定格式的srt文件地址或存储位置,百度即可
       * @return
       * @throws Exception
       */
      public static boolean addSubtitle(String videoPath, String sutitleVideoSavePath,
          String wordPath, String taskId) {
        try {
          log.info("开始合成字幕....");
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(videoPath);
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(wordPath);
          ffmpeg.addArgument("-c");
          ffmpeg.addArgument("copy");
          ffmpeg.addArgument(sutitleVideoSavePath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("添加字幕成功={}", videoPath);
        } catch (IOException e) {
          throw new CombineException(ResultCode.ERROR.getCode(), "添加字幕失败", taskId);
        }
        return true;
      }
    
      /**
       * 图片生成视频   帧率设置25,可自行修改
       *
       * @param videoPath
       * @param videoPath
       * @return
       * @throws Exception
       */
      public static boolean picToVideo(String picsPath, String videoPath, String taskId) {
        try {
          log.info("图片转视频中....");
          ProcessWrapper ffmpeg = new DefaultFFMPEGLocator().createExecutor();
          ffmpeg.addArgument("-i");
          ffmpeg.addArgument(picsPath);
          ffmpeg.addArgument("-r");
          ffmpeg.addArgument("25");
          ffmpeg.addArgument("-y");
          ffmpeg.addArgument(videoPath);
          ffmpeg.execute();
          try (BufferedReader br = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()))) {
            blockFfmpeg(br);
          }
          log.info("图片转视频成功={}", videoPath);
        } catch (IOException e) {
          log.error("图片转视频失败={}", e.getMessage());
          throw new PicException(ResultCode.ERROR.getCode(), "图片转视频失败", taskId);
        }
        return true;
      }
    
    
      /**
       * 获取视频信息
       *
       * @param url
       * @return
       */
      public static MultimediaInfo getVideoInfo(URL url) {
        try {
          MultimediaObject multimediaObject = new MultimediaObject(url);
          return multimediaObject.getInfo();
        } catch (EncoderException e) {
          log.error("获取视频信息报错={}", e.getMessage());
          throw new BaseException(ResultCode.ERROR.getCode(), "获取视频信息报错");
        }
      }
    
    

    字幕文件 ***.srt

    1
    00:00:00,000 --> 00:00:01,989
    篮网也是哈登的选择
    
    2
    00:00:01,989 --> 00:00:04,658
    他为了能去布鲁克林颇费心思
    
    3
    00:00:04,658 --> 00:00:07,527
    先是迟迟不去火箭训练营报到
    
    4
    00:00:07,527 --> 00:00:09,146
    然后是体重超标
    
    5
    00:00:09,146 --> 00:00:11,589
    接下来是打了几场好球发现
    
    6
    00:00:11,589 --> 00:00:14,235
    火箭还没有如他所愿启动交易
    
    7
    00:00:14,235 --> 00:00:15,634
    直接消极怠工
    
    8
    00:00:15,634 --> 00:00:18,593
    还公开表示这支球队没发展前景
    
    9
    00:00:18,593 --> 00:00:19,672
    他带不动了
    
    10
    00:00:19,871 --> 00:00:23,340
    就在哈登发表了那番单方面分手的言论后
    
    11
    00:00:23,340 --> 00:00:25,409
    火箭老板费尔蒂塔暴怒
    
    12
    00:00:25,409 --> 00:00:27,528
    下令尽快把哈登送走
    
    13
    00:00:27,528 --> 00:00:29,897
    与篮网的交易迅速达成
    
    
    更多相关内容
  • ffmpeg的L4T多媒体API 1.构建并安装库 git clone https://github.com/jocover/jetson-ffmpeg.git cd jetson-ffmpeg mkdir build cd build cmake .. make sudo make install sudo ldconfig 2.修补ffmpeg并构建 ...
  • ffmpeg-4.4-windows安装包

    2021-12-11 12:00:45
    ffmpeg-4.4版本windows安装包
  • ffmpeg-gl-transition:FFmpeg过滤器,用于在视频流之间应用GLSL过渡
  • ffmpeg录制屏幕并推流ffmpeg+nginx-http-flv-module+flv.js
  • ffmpeg-4.0.2-win32-dev.zip ffmpeg-4.0.2-win32-shared.zip ffmpeg-4.0.2-win32-static.zip ffmpeg-4.0.2-win64-dev.zip ffmpeg-4.0.2-win64-shared.zip ffmpeg-4.0.2-win64-static.zip
  • ffmpeg(Windows版).zip

    2021-01-04 17:02:07
    ffmpeg Windows版本
  • ffmpeg_version.cmake; opencv_ffmpeg.dll; opencv_ffmpeg_64.dll 编译过程中,下载易出错文件,共享给大家
  • FFmpeg入门到精通.pdf

    2019-06-19 14:32:11
    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领 先的音/视频编码库 libavcodec。 FFmpeg 是在 Linux 下开发出来的,但它可以在包括 Windows 在内的大多数操作系...
  • FFmpeg官方推荐教材。Fmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序
  • 自制ffmpeg 这是一个第三方自来水。 它提供了ffmpeg的公式,其中包括用于启用其他功能和库的选项。 内容: 安装及使用 为了使用此龙头,您需要安装Homebrew。 然后,要运行默认安装,请运行: brew tap homebrew...
  • opencv_videoio_ffmpeg.dll

    2020-06-03 15:45:39
    包含: opencv_videoio_ffmpeg.dll opencv_videoio_ffmpeg_64.dll opencv_ffmpeg_64.dll opencv_ffmpeg.dll
  • java调用ffmpeg详细步骤

    2019-04-01 16:05:44
    使用Java语言调用终端开启关闭Nginx服务器,然后执行ffmpeg命令,开启转流推流。以及其它指令,来学习吧
  • 利用FFmpeg实现rtp推流.重点为时间戳转换.
  • ffmpeg封装H246为MP4

    2018-07-12 15:04:24
    使用ffmpeg库文件,把H246封装为MP4,对应https://blog.csdn.net/u012478275/article/details/52473354#comments解析
  • ffmpeg调取摄像头录像

    2018-02-15 21:10:45
    王纲老师讲的FFMPEG调取摄像头录像,很好的学习参考资料。
  • ffmpeg视频推流

    2018-02-23 17:08:53
    ffmpeg视频推流,里面用map封装好了,只需要填相应的视频流地址以及需要ffmpeg名字就可以用
  • ffmpeg安装.zip

    2020-01-20 11:18:47
    redhat安装ffmpeg所有安装包 /usr/local/ffmpeg/ffmpeg-3.2.4/libavdevice /usr/local/ffmpeg/ffmpeg-3.2.4/libavfilter /usr/local/ffmpeg/ffmpeg-3.2.4/libavformat /usr/local/ffmpeg/ffmpeg-3.2.4/...
  • java使用ffmpeg的jar包

    2017-11-07 15:01:40
    导入这个jar包后就可以使用ffmpeg的音频转码 mvn install:install-file -Dfile=E:\jave-1.0.2.jar //包的输入路径 -DgroupId=jave -DartifactId=jave -Dversion=1.0.2 -Dpackaging=jar //执行完成后 ...
  • 使用ffmpeg封装h264裸流为MP4文件,亲测,可修改时间戳实现输出视频的速度控制,附使用说明。
  • FFmpeg官网指定书籍,内含入门以及提高详细解说,大量命令详细解说,值得一看
  • ffmpeg-4.0.2-win32-dev.zip ffmpeg-4.0.2-win32-shared.zip ffmpeg-4.0.2-win32-static.zip ffmpeg-4.0.2-win64-dev.zip ffmpeg-4.0.2-win64-shared.zip ffmpeg-4.0.2-win64-static.zip
  • ffmpeg.rar

    2020-04-14 15:47:32
    ffmpeg.rar ffmpeg.exe
  • 使用Ffmpeg ,VS 2010 C++ 获取视频流中的关键帧,原来下载,直接可以编译
  • Qt+FFMPEG解码视频并显示

    千次下载 热门讨论 2016-09-07 20:18:18
    是一个Windows下使用FFMPEG解码视频 并使用QPaint绘制到QWidget上 FFMPEG的版本是2.5.2 记得将ffmpeg/bin目录下的dll文件拷贝到编译生成的exe所在的目录下,否则会无法运行。 关于代码的解释 请参考: ...
  • opencv3.10编译所需opencv_ffmpeg.dll opencv_ffmpeg_64.dll解压放到 opencv\sources\3rdparty\ffmpeg\下即可
  • opencv 3.1.0的ffmpeg文件,解决CMaker无法下载的问题
  • ffmpeg的基本用法

    万次阅读 多人点赞 2021-11-18 17:23:10
    title: ffmpeg的基本用法 categories:[ffmpeg] tags:[音视频编程] date: 2021/11/18 作者:hackett 微信公众号:加班猿 一、ffmpeg的安装 1.Centos安装 FFmpeg 在默认的CentOS 8 源仓库中没有提供。你可以选择通过...

    title: ffmpeg的基本用法
    categories:[ffmpeg]
    tags:[音视频编程]
    date: 2021/11/18

    作者:hackett
    微信公众号:加班猿

    一、ffmpeg的安装

    1.Centos安装

    FFmpeg 在默认的CentOS 8 源仓库中没有提供。你可以选择通过源文件编译安装 FFmpeg,或者使用dnf工具从Negativo17源仓库中安装。我们将会使用第二个选项。

    完成下面的步骤,在 CentOS 8 上安装 FFmpeg:

    1.Negativo17软件源依赖EPEL 和 PowerTools 软件源。以 root 或者其他有 sudo 权限的用户身份运行下面的命令,启用必须的软件源:

    sudo dnf install epel-release
    sudo yum config-manager --set-enabled PowerTools
    sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
    

    2.一旦软件源被启用,安装FFmpeg:

    sudo dnf install ffmpeg
    

    3.通过检测版本号,验证FFmpeg安装:

    ffmpeg -version
    

    4.Negativo17 软件源中的ffmpeg当前版本是4.2.5

    ffmpeg version 4.2.5 Copyright (c) 2000-2021 the FFmpeg developers
    built with gcc 8 (GCC)
    configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
    libavutil      56. 31.100 / 56. 31.100
    libavcodec     58. 54.100 / 58. 54.100
    libavformat    58. 29.100 / 58. 29.100
    libavdevice    58.  8.100 / 58.  8.100
    libavfilter     7. 57.100 /  7. 57.100
    libavresample   4.  0.  0 /  4.  0.  0
    libswscale      5.  5.100 /  5.  5.100
    libswresample   3.  5.100 /  3.  5.100
    libpostproc    55.  5.100 / 55.  5.100
    

    2.Windows安装

    官网地址:http://ffmpeg.org/download.html

    选择Windows的版本,跳转到GitHub下载地址:https://github.com/BtbN/FFmpeg-Builds/releases
    在这里插入图片描述

    下载最新的带share版本的,就是已经编译好了的,不用自己再编译 ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4.zip

    解压出来放到安装软件的盘符,添加环境变量即可 D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin

    在这里插入图片描述

    不重启使Windows环境变量生效,cmd,输入 set path = D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin

    重启命令提示符终端,测试效果: cmd,输入 ffmpeg -version得到如下效果即为成功安装

    在这里插入图片描述

    二、ffmpeg主要组成部分

    1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
    2、libavcodec:用于各种类型声音/图像编解码;
    3、libavutil:包含一些公共的工具函数;
    4、libswscale:用于视频场景比例缩放、色彩映射转换;
    5、libpostproc:用于后期效果处理;
    6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
    7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
    8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

    在这组成部分中,需要熟悉基础概念有

    容器(Container)
    容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
    流(Stream)
    是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
    帧(Frame)
    帧代表一幅静止的图像,分为I帧,P帧,B帧。
    编解码器(Codec)
    是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
    复用/解复用(mux/demux)
    把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
    把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

    查看帮助

    可用的bit流 :ffmpeg –bsfs
    可用的编解码器:ffmpeg –codecs
    可用的解码器:ffmpeg –decoders
    可用的编码器:ffmpeg –encoders
    可用的过滤器:ffmpeg –filters
    可用的视频格式:ffmpeg –formats
    可用的声道布局:ffmpeg –layouts
    可用的license:ffmpeg –L
    可用的像素格式:ffmpeg –pix_fmts
    可用的协议:ffmpeg -protocals

    三、ffmpeg常用命令

    使用 ffmpeg 命令基本形式是:

    usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
    usage: ffmpeg [全局参数] {[输入文件参数] -i 输入文件地址} ... {[输出文件参数] 输出文件地址} ...
    

    主要全局参数:

    -i 设定输入流 
    -f 设定输出格式 
    -ss 开始时间 
    

    输出视频文件参数:

    -b 设定视频流量(码率),默认为200Kbit/s 
    -r 设定帧速率,默认为25 
    -s 设定画面的宽与高 
    -aspect 设定画面的比例 
    -vn 不处理视频 
    -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 
    -qscale 0 保留原始的视频质量
    

    输出音频文件参数:

    -ar 设定采样率 
    -ac 设定声音的Channel数 
    -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 
    -an 不处理音频
    

    1.获取媒体文件信息

    ffmpeg -i file_name
    ffmpeg -i video_file.mp4
    ffmpeg -i audio_file.mp3
    ffmpeg -i video_file.mp4 -hide_banner #hide_banner 来隐藏掉ffmpeg本身的信息
    ffmpeg -i audio_file.mp3 -hide_banner
    

    在这里插入图片描述

    2.转换媒体文件

    ffmpeg 最让人称道常用的恐怕就是你轻而易举的在不同媒体格式之间进行自由转换了。你是要指明输入和输出文件名就行了, ffmpeg 会从后缀名猜测格式,这个方法同时适用于视频和音频文件

    下面是一些例子:

    ffmpeg -i video_input.mp4 video_output.avi 
    ffmpeg -i video_input.webm video_output.flv 
    ffmpeg -i audio_input.mp3 audio_output.ogg 
    ffmpeg -i audio_input.wav audio_output.flac
    

    你也可以同时指定多个输出后缀:

    ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
    

    这样会同时输出多个文件.

    想看支持的格式,可以用:

    ffmpeg -formats
    

    同样的,你可以使用 -hide_banner 来省略一些程序信息。

    你可以在输出文件前使用 -qscale 0 来保留原始的视频质量:

    ffmpeg -i video_input.wav -qscale 0 video_output.mp4
    

    3. 从视频中抽取音频

    为了从视频文件中抽取音频,直接加一个 -vn 参数就可以了

    ffmpeg -i video.mp4 -vn audio.mp3
    

    这会让命令复用原有文件的比特率,一般来说,使用 -ab (音频比特率)来指定编码比特率是比较好的:

    ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
    

    一些常见的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)。

    其他的一些常用的参数比如 -ar (采样率: 22050, 441000, 48000), -ac (声道数), -f (音频格式, 通常会自动识别的). -ab 也可以使用 -b:a 来替代. 比如:

    ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
    

    4. 从视频中抽取视频(让视频静音)

    和之前的要求类似,我们可以使用 -an 来获得纯视频(之前是 -vn)

    ffmpeg -i video_input.mp4 -an -video_output.mp4
    ffmpeg -i input.mp4 -vcodec copy -an output.mp4
    

    Note: 这个 -an 标记会让所有的音频参数无效,因为最后没有音频会产生。

    5. 从视频中提取图片

    这个功能可能对很多人都挺有用,比如你可能有一些幻灯片,你想从里面提取所有的图片,那么下面这个命令就能帮你:

    ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
    

    我们来解释一下这个命令:

    -r 代表了帧率(一秒内导出多少张图像,默认25), -f 代表了输出格式(image2 实际上上 image2 序列的意思)。

    最后一个参数 (输出文件) 有一个有趣的命名:它使用 %3d 来指示输出的图片有三位数字 (000, 001, 等等.)。你也可以用 %2d (两位数字) 或者 %4d (4位数字) ,只要你愿意,你可以随便实验 一下可以怎么写!

    Note: 同样也有将图片转变为视频/幻灯片的方式,下面的高级应用中会讲到。

    6. 更改视频分辨率或长宽比

    ffmpeg 来说又是个简单的任务,你只需要使用 -s 参数来缩放视频就行了:

    ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
    

    同时,你可能需要使用 -c:a 来保证音频编码是正确的:

    ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
    

    你也可是使用**-aspect** 来更改长宽比:

    ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
    

    Note: 在高级应用中还会提到更强大的方法

    7. 为音频增加封面图片

    有个很棒的方法把音频变成视频,全程使用一张图片(比如专辑封面)。当你想往某个网站上传音频,但那个网站又仅接受视频(比如YouTube, Facebook等)的情况下会非常有用。

    下面是例子:

    ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
    

    只要改一下编码设置 (-c:v 是 视频编码, -c:a 是音频编码) 和文件的名称就能用了。

    Note: 如果你使用一个较新的ffmpeg版本(4.x),你就可以不指定 -strict experimental

    8. 为视频增加字幕

    另一个常见又很容易实现的要求是给视频增加字母,比如一部外文电源,使用下面的命令:

    ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
    

    当然,你可以指定自己的编码器和任何其他的音频视频参数。你可以阅读这篇文章来了解字幕相关内容 editing subtitles in Linux

    9. 压缩媒体文件

    压缩文件可以极大减少文件的体积,节约存储空间,这对于文件传输尤为重要。通过ffmepg,有好几个方法来压缩文件体积。

    Note: 文件压缩的太厉害会让文件质量显著降低。

    首先,对于音频文件,可以通过降低比特率(使用 -b:a-ab):

    ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
    ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
    

    再次重申,一些常用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k.值越大,文件所需要的体积就越大。

    对于视频文件,选项就多了,一个简单的方法是通过降低视频比特率 (通过 -b:v):

    ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
    

    Note: 视频的比特率和音频是不同的(一般要大得多)。

    你也可以使用 -crf 参数 (恒定质量因子). 较小的crf 意味着较大的码率。同时使用 libx264 编码器也有助于减小文件体积。这里有个例子,压缩的不错,质量也不会显著变化:

    ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
    

    crf 设置为20 到 30 是最常见的,不过您也可以尝试一些其他的值。

    降低帧率在有些情况下也能有效(不过这往往让视频看起来很卡):

    ffmpeg -i video_input.mp4 -r 24 video_output.mp4
    

    -r 指示了帧率 (这里是 24)。

    你还可以通过压缩音频来降低视频文件的体积,比如设置为立体声或者降低比特率:

    ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
    

    Note: -strict -2-ac 2 是来处理立体声部分的。

    10. 裁剪媒体文件(基础)

    想要从开头开始剪辑一部分,使用T -t 参数来指定一个时间:

    ffmpeg -i input_video.mp4 -t 5 output_video.mp4 
    ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
    

    这个参数对音频和视频都适用,上面两个命令做了类似的事情:保存一段5s的输出文件(文件开头开始算)。上面使用了两种不同的表示时间的方式,一个单纯的数字(描述)或者 HH:MM:SS (小时, 分钟, 秒). 第二种方式实际上指示了结束时间。

    也可以通过 -ss 给出一个开始时间,-to 给出结束时间:

    ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
    ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav 
    ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264 
    ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
    

    可以看到 开始时间 (-ss HH:MM:SS), 持续秒数 (-t duration), 结束时间 (-to HH:MM:SS), 和开始秒数 (-s duration)的用法.

    你可以在媒体文件的任何部分使用这些命令。

    11.输出YUV420原始数据

    对于一下做底层编解码的人来说,有时候常要提取视频的YUV原始数据。 怎么坐?很简答: ffmpeg -i input.mp4 output.yuv怎么样,是不是太简单啦?!!!哈哈(如果你想问yuv的数据,如何播放,我不会告诉你,RawPlayer挺好用的!!)

    那如果我只想要抽取某一帧YUV呢? 简单,你先用上面的方法,先抽出jpeg图片,然后把jpeg转为YUV。 比如: 你先抽取10帧图片。 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
    结果:

    -rw-rw-r-- 1 hackett hackett    296254  720 16:08 pic-001.jpeg
    -rw-rw-r-- 1 hackett hackett    300975  720 16:08 pic-002.jpeg
    -rw-rw-r-- 1 hackett hackett    310130  720 16:08 pic-003.jpeg
    -rw-rw-r-- 1 hackett hackett    268694  720 16:08 pic-004.jpeg
    -rw-rw-r-- 1 hackett hackett    301056  720 16:08 pic-005.jpeg
    -rw-rw-r-- 1 hackett hackett    293927  720 16:08 pic-006.jpeg
    -rw-rw-r-- 1 hackett hackett    340295  720 16:08 pic-007.jpeg
    -rw-rw-r-- 1 hackett hackett    430787  720 16:08 pic-008.jpeg
    -rw-rw-r-- 1 hackett hackett    404552  720 16:08 pic-009.jpeg
    -rw-rw-r-- 1 hackett hackett    412691  720 16:08 pic-010.jpeg
    

    然后,你就随便挑一张,转为YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv如果-s参数不写,则输出大小与输入一样。当然了,YUV还有yuv422p啥的,你在-pix_fmt 换成yuv422p就行啦!

    12.视频添加logo

    ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
    

    13.提取视频ES数据

    ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
    

    14.视频编码格式转换

    比如一个视频的编码是MPEG4,想用H264编码,咋办?

    ffmpeg -i input.mp4 -vcodec h264 output.mp4
    

    相反也一样

    ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
    

    15.添加字幕

    语法 –vf subtitles=file

    ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
    

    ffmpeg: 高级使用

    现在该开始讲述一些高级的特性了(比如截屏等),让我们开始吧。

    1. 分割媒体文件

    前面已经讲述了如何裁剪文件,那么如何分割媒体文件呢?只需要为每个输出文件分别指定开始时间、结束或者持续时间就可以了。

    看下面这个例子:

    ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4
    

    语法很简单,为第一个文件指定了 -t 00:00:30 作为持续时间(第一个部分是原始文件的前30秒内容),然后指定接下来的所有内容作为第二个文件(从第一部分的结束时间开始,也就是 00:00:30)。

    你可以任意指定多少个部分,尝试一下吧,这个功能真的很厉害,同时它也适用用音频文件。

    2. 拼接媒体文件

    ffmpeg 也可以进行相反的动作:把多个文件合在一起。

    为了实现这一点,你得用自己顺手的编辑器来创建一个文本文件。

    因为我喜欢使用终端,所以这里我用了 touchvim. 文件名无关紧要,这里我用 touch 命令创建 video_to_join.txt 文件:

    touch videos_to_join.txt
    

    现在,使用 vim 编辑它:

    vim videos_to_join.txt
    

    你可以使用任何你喜欢的工具,比如nano,gedit等等。

    在文件内容中, 输入您想拼接的文件的完整路径(文件会按照顺序拼合在一起),一行一个文件。确保他们拥有相同的后缀名。下面是我的例子:

    /home/ubuntu/Desktop/video_1.mp4
    /home/ubuntu/Desktop/video_2.mp4
    /home/ubuntu/Desktop/video_3.mp4
    

    保存这个文件,同样这个方法适用与任何音频或者视频文件。

    然后使用下面的命令:

    ffmpeg -f concat -i join.txt output.mp4
    

    Note: 使用的输出文件的名称是 output.mp4, 因为我的输入文件都是mp4的 。

    这样,你 videos_to_join.txt 里的所有文件都会被拼接成一个独立的文件了。

    3. 将图片转变为视频

    这会告诉你如何将图片变成幻灯片秀,同时也会告诉你如何加上音频。

    首先我建议您将所有的图片放到一个文件夹下面,我把它们放到了 my_photos 里,同时图片的后缀名最好是 .png 或者 .jpg, 不管选那个,他们应该是同一个后缀名,否则ffmpeg可能会工作的不正常,您可以很方便的把 .png 转变为 .jpg (或者倒过来也行)。

    我们这次转换的格式 (-f) 应该被设置为 image2pipe. 你必须使用使用连词符()来指明输入。 image2pipe 允许你使用管道 (在命令间使用 |)的结果而不是文件作为ffmpeg的输入。命令结果便是将所有图片的内容逐个输出,还要注意指明视频编码器是 copy (-c:v copy) 以正确使用图片输入:

    cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv
    

    如果你播放这个文件,你可能会觉得只有一部分图片被加入了,事实上所有的图片都在,但是ffmpeg 播放它们的时候太快了,默认是23fps,一秒播放了23张图片。

    你应该指定帧率 (-framerate) :

    cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv 
    

    在这个例子里,把帧率设置为1,也就是每帧(每张图)会显示1秒。

    为了加一些声音,可以使用音频文件作为输入 (-i audo_file) 并且设定copy音频编码 (-c:a copy). 你可以同时为音频和视频设定编码器,在输出文件前设置就可以了。你要计算一下音频文件的长度和图片张数,已确定合适的帧率。比如我的音频文件是22秒,图片有9张,那么帧率应该是 9 / 22 大约0.4,所以我这么输入命令:

    cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv
    

    4. 录制屏幕

    通过 ffmpeg 录制屏幕同样没有困难的,将格式(-f) 设定为x11grab. 他就会抓取你的XSERVER. 输入的话可以这是屏幕编号(一般都是0:0). 抓取是从左上角开始计算的,可以指定屏幕分辨率 (-s). 我的屏幕是 1920×1080. 注意屏幕分辨率硬在输入之前指定t:

    ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
    

    q 或者 CTRL+C 以结束录制屏幕。

    小技巧:你可以通过命令获得真实的分辨率而不是写死一个固定的大小

    -s $(xdpyinfo | grep dimensions | awk '{print $2;}')
    

    完整的命令这么写:

    ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
    

    5. 录制摄像头

    从摄像头录制就更简单了,linux上设备都是在/dev中的,比如 /dev/video0, /dev/video1, etc.:

    ffmpeg -i /dev/video0 output.mkv
    

    同样, q 或者 CTRL+C 来结束录制。

    6. 录制声音

    Linux上同时是使用 ALSApulseaudio 来处理声音的。 ffmpeg 可以录制两者,不过我要特别说明 pulseaudio, 因为 Debian 系列的发行版默认用了它。命令如下:

    pulseaudio, 你必须强制指定(-f) alsa 然后指定 default 作为输入t (-i default):

    ffmpeg -f alsa -i default output.mp3
    

    Note: 在你系统音频设置里,应该能看到默认的录音设备。

    我经常玩吉他,我平时使用一个专业音频设备才能录制声音,当我发现ffmpeg也可以很轻松的录制的时候颇为惊讶。

    录制小贴士

    对于录制任务来说,通常都需要指定编码器以及帧率,之前讲过的参数当然也可以用到这里来!

    ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv
    

    有时候不直接录音,而是在录屏/录像的时候给一个音频文件,那么可以这么做:

    ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4
    

    Note: ffmpeg 使用片段录取,所有有时候非常短的录制可能不会保存文件。我建议录地可以稍微长一些(然后后期裁剪),已保证录制的文件成功写到磁盘上。

    7.截图

    每隔一秒截一张图

     ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
    

    每隔20秒截一张图

     ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
    

    ffmpeg中的过滤器的基本使用

    过滤器ffmpeg 中最为强大的功能。在ffmepg中有数不甚数的过滤器存在,可以满足各种编辑需要。因为过滤器实在太多了,这里只会简单讲述几个常用的。

    使用 过滤的基本结构是:

    ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4
    ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav
    

    可以指定视频过滤器 (-vf, -filter:v的简写) 和 音频过滤器 (-af, -filter:a的简写). 过滤器的内容写到双引号里面 () 并且可以使用逗号(,)连接。你可以使用任意数量的过滤器(我写了个etc代表更多的,这不是做一个真实的过滤器)。

    过滤器设定的通常格式是:

    filter=setting_2=value_2:setting_2=value_2
    

    过滤器不同的值使用冒号分割。

    你甚至可以在值里面使用进行数学符号计算。

    Note: 参考 ***ffmpeg 过滤器手册****.*查看更多高级用法

    这里举几个例子来说明视频和音频的过滤器。

    1. 视频缩放

    这是个简单过滤器,设定里只有 widthheight:

    ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4
    

    我说过你可以使用数学运算来给值:

    ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv
    

    很明显,这个命令让输入的尺寸变成了输入尺寸(in_w, in_h)的1/2.

    2. 视频裁剪

    类似缩放,这个设定也有 widthheight ,另外可以指定裁剪的原点(默认是视频的中心)

    ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4 
    ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv
    

    第二个命令裁剪原点是视频的中心点(因为我没有给x和y坐标),第一个命令会从左上角开始裁剪 (x=0:y=0).

    这里也有一个使用数学计算的例子:

    ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv
    

    这会把视频裁剪剩下原大小的3/4/。

    3. 视频旋转

    你可以指定一个弧度,顺时针旋转视频。为了让计算简单一些,你可以给角度然后乘以 PI/180:

    ffmpeg -i input.avi -vf "rotate=90*PI/180" 
    ffmpeg -i input.mp4 -vf "rotate=PI"
    

    第一个命令将视频顺时针旋转90°,第二个则是上下颠倒了视频(翻转了180°)。

    4. 音频声道重映射

    有的时候,你的音频只有右耳可以听到声音,那么这个功能就很有用了。你可以让声音同时在左右声道出现:

    ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3
    

    这将右声道(1)同时映射到左(0)右(1)两个声道(左边的数字是输入,右边的数字是输出)。

    5. 更改音量

    你可以将音量大小乘以一个实数(可以是整数也可以不是),你只需要给出那个数大小就行了。

    ffmpeg -i input.wav -af "volume=1.5" output.wav 
    ffmpeg -i input.ogg -af "volume=0.75" output.ogg
    

    第一个将音量变为1.5倍,第二个则让音量变成了原来的1/4那么安静。

    技巧:更改播放速度

    这里会介绍视频(不影响音频)和音频的过滤器。

    1. 视频

    视频过滤器是 setpts (PTS = presentation time stamp). 这个参数以一种有趣的方式工作,因为我们修改的是PTS,所以较大的数值意味着较慢的播放速度,反之亦然:

    ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv 
    ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4
    

    第一个命令让播放速度加倍了,第二个则是让播放速度降低了一半。

    2. 音频

    这里的过滤器是 atempo. 这里有个限制,它只接受 0.5(半速) 到 2 (倍速)之间的值。为了越过这个限制,你可以链式使用这个过滤器:

    ffmpeg -i input.wav -af "atempo=0.75" output.wav 
    ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3
    

    第一个命令让音频速度慢了1/4,第二个则是加速到原来的4(2*2)倍。

    Note: 如果想在同一个命令中同时修改视频和音频的速度,你得查看一下 filtergraphs.

    如果你觉得文章还不错,可以给个"三连"

    我是加班猿,我们下期见

    展开全文
  • 09_09_vs_ffmpeg配置

    2022-07-01 10:03:53
    09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_ffmpeg配置09_09_vs_...
  • FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手。因此特地分离出了一个简单的视频编码器供学习之用。 此前做过一个YUV420P像素数据编码为H.264码流的例子。对这个例子进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,336
精华内容 59,334
关键字:

ffmpeg

友情链接: WADB-master.zip