随着自媒体盛行,许多人会自拍视频或则找视频素材剪裁,配上背景音乐或解说,加上各类特效边框,处理后再生成新的视频文件,发布到各大平台。生成的原始视频文件都很大,我们须要转换格式或则压缩大小,以便上传或则在其他如手机等设备上分享。

FFmpeg介绍

FFmpeg是一款开源免费的多媒体视频处理工具,功能包括视频采集功能、视频格式转换、视频加壳、给视频加盐印等。它提供了录制、转换以及流化音视频的完整解决方案。

FFmpeg项目在开源界的影响力也是数一数二的。几乎你所看到的视频转换软件或播放器中用到的功能或编码/解码都基于FFmpeg。它采用LGPL或GPL许可证,曾今国外个别著名播放器使用FFmpeg源码未申明,被FFmpeg钉在历史的耻辱柱上。

FFmpeg安装

FFmpeg提供源码,可自行编译。几乎所有发行版Linux库房中已有FFmpeg,可以直接安装。

# debian/ubuntu
apt install ffmpeg
# redhat/centos/fedora'
yum install ffmpeg
或
dnf install ffmpeg

FFmpeg官方也提供二补码包:/download.html

推荐使用FFmpeg官方static二补码包,无需额外动态库,仅一个可执行文件官网下载后的FFmpeg解压后有三个可执行文件:ffmpeg、ffprobe、ffplay。

FFmpeg使用

官网下载后的FFmpeg解压后有三个可执行文件:

ffmpeg:

ffmpeg-ivideo.wma./video.mp4

把video.wma视频文件转换成mp4格式。ffmpegmp4格式默认使用h264编码

ubuntu下音乐播放器_ubuntu音乐播放器_ubuntu音乐软件

ffmpeg-ivideo.wma-c:vlibx265video.mp4

把video.wma视频文件转换成h265编码的mp4格式。

h265比h264编码有更高的压缩率,在低分辨率下生成的文件更小。

也就是说,相同质量下的h265编码比h264更清晰。相同大小的视频文件,h265编码比h264编码的视频文件容积更小。并且当视频分辨率抵达一定大小时,二者清晰度区别不大。

h264比h265有更好的兼容性,有些手机默认不支持h265编码的视频文件,须要利用软件解码。

视频转换,h265编码比h264编码用时会更长,更消耗CPU资源。

ffmpeg-ivideo.mp4-s1280x720video2.mp4

将视频压缩到1280x720帧率。

ffmpeg-ivideo.mp4-ss00:00:10-ivideo.mp4-t00:00:30-c:vcopy-c:acopycut.mp4

不改变视频和音频的编码截剪视频,保留从视频10秒以后开始30秒,由于音频视频编码指定参数值copy,不会影响视频质量。

使用ss参数一定要在-i之前,假如写在-i以后ubuntu下音乐播放器,ffmpeg会理解为起始点是作用于输出文件。

ffmpeg-ivideo.mp4-metadata:s:vrotate="90"-c:vcopy-c:acopyout.mp4

不改变视频和音频的质量将视频翻转90度。把横屏变竖屏。

ffmpeg-fx1111grab-r30-i:0.0-falsa-ihw:0,0-acodecaac-vcodeclibx264out.mkv

使用FFmpeg录象,该在Linux上有效。每秒30帧,音频格式使用aac,视频格式使用h264,输出mkv格式。

vcodec与c:v参数一样,指定视频编码,如:libx264,libx265

acodec与c:a参数一样,指定音频编码,如:aac,mp4,flac

FFmpeg还有好多其他用法,例如调整帧率,帧率等。使用ffmpeg--help可以看见全部参数说明。

GPU加速

FFmpeg默认使用CPU编码。执行ffmpeg时,资源管理器可以看见CPU使用率下降。

ubuntu音乐软件_ubuntu下音乐播放器_ubuntu音乐播放器

假如使用GPU运算,转换速率能成倍提升,非常是转换h265编码视频。

查看ffmpeg支持视频编码格式:

ffmpeg -codecs

找到hevc,也就是h265编码:

ubuntu下音乐播放器_ubuntu音乐软件_ubuntu音乐播放器

假如使用h264编码linux命令ls,使用h264_qsv/h264_nvenc。

ffmpeg-i./video.mp4-c:vhevc_qsv./out.mp4

使用GPU编码雨林木风linux,运行以上ffmpeg命令,可以看见GPU占用率下降。

ubuntu下音乐播放器_ubuntu音乐播放器_ubuntu音乐软件

使用GPU加速视频转换速率快了好多,我仅使用核显速率也比CPU转码也能快数倍。

ffprobe命令

ffprobe./video.mp4

查看视频文件信息。

ubuntu音乐软件_ubuntu下音乐播放器_ubuntu音乐播放器

从输出信息可以看见该视频文件是使用h264编码,帧率1280x720,视频平均帧率921kbps,24帧。视频的音频使用aac编码,取样率44100Hz,分辨率128kpbs。

ffprobe-verror-show_streams-print_formatjson./video.mp4

使用json格式输出视频信息。

ubuntu音乐播放器_ubuntu下音乐播放器_ubuntu音乐软件

ffplay命令

ffplay./video.mp4

ubuntu音乐播放器_ubuntu音乐软件_ubuntu下音乐播放器

播放视频文件。这时会弹出一个播放器。

ubuntu音乐软件_ubuntu音乐播放器_ubuntu下音乐播放器

ffplay命令还有好多控制参数。不过我认为好处不大,虽然图形化播放器更好用,功能也更强悍。

开发集成

使用FFmpeg命令,我们可以用程序或完成视频手动转换。也可以让我们开发的系统拥有视频转码,或读取视频信息的功能。以Java示例:

public static int doWaitFor(Process process) {
  InputStream in = null;
  InputStream err = null;
  int exitValue = -1; // returned to caller when p is finished
  try {
    in = process.getInputStream();
    err = process.getErrorStream();
    boolean finished = false; // Set to true when p is finished
    while (!finished) {
      try {
        while (in.available() > 0) {
          // Print the output of our system call
          Character c = new Character((char) in.read());
          System.out.print(c);
        }
        while (err.available() > 0) {
          // Print the output of our system call
          Character c = new Character((char) err.read());
          System.out.print(c);
        }
        // Ask the process for its exitValue. If the process
        // is not finished, an IllegalThreadStateException
        // is thrown. If it is finished, we fall through and
        // the variable finished is set to true.
        exitValue = process.exitValue();
        finished = true;
      } catch (IllegalThreadStateException e) {
        // Process is not finished yet;
        // Sleep a little to save on CPU cycles
        Thread.currentThread().sleep(500);
      }
    }
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    try {
      if (in != null) {
        in.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    if (err != null) {
      try {
        err.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  return exitValue;
}

Java调用外部命令使用Runtime.getRuntime().exec(command)。

在使用调用ffmpeg命令时,必需要读取执行命令输出流中的内容ubuntu下音乐播放器,程序才不会阻塞。否则缓冲读满后,进程会卡住。

视频转换会特别历时,取决于硬件性能。在实际应用中,我们也可以开启线程去处理。

FFmpeg还提供C调用,公共库集成。以上方式并不是最优解决方案,仅提供一种参考。

本文原创地址://gulass.cn/fspclgjzmtsp.html编辑:刘遄,审核员:暂无