百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

音视频命令转换工具 - FFmpeg

myzbx 2025-01-12 16:48 11 浏览

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

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官方也提供二进制包:ffmpeg.org/download.html

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

FFmpeg 使用

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

  • ffmpeg:音视频文件处理转换
  • ffprobe:读取视频文件信息
  • ffplay:一个简易的播放器

ffmpeg命令:

ffmpeg -i video.wma ./video.mp4

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

ffmpeg -i video.wma -c:v libx265 video.mp4

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

h265比h264编码有更高的压缩率,在低码率下生成的文件更小。
也就是说,相同质量下的h265编码比h264更清晰。相同大小的视频文件,h265编码比h264编码的视频文件体积更小。但是当视频码率到达一定大小时,两者清晰度区别不大。
h264比h265有更好的兼容性,有些手机默认不支持h265编码的视频文件,需要借助软件解码。
视频转换,h265编码比h264编码用时会更长,更消耗CPU资源。

ffmpeg -i video.mp4 -s 1280x720 video2.mp4

将视频压缩到1280x720分辨率。

ffmpeg -i video.mp4 -ss 00:00:10 -i video.mp4 -t 00:00:30 -c:v copy -c:a copy cut.mp4

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

使用ss参数一定要在-i之前,如果写在-i之后,ffmpeg会理解为起始点是作用于输出文件。

ffmpeg -i video.mp4 -metadata:s:v rotate="90" -c:v copy -c:a copy out.mp4

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

ffmpeg -f x11grab -r 30 -i :0.0 -f alsa -i hw:0,0 -acodec aac -vcodec libx264 out.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使用率升高。

如果使用GPU运算,转换速度能成倍提高,特别是转换h265编码视频。

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

ffmpeg -codecs

找到 hevc ,也就是h265编码:

  • hevc_qsv:intel核显
  • hevc_nvenc:nvidia显卡
  • hevc_amf:amd显卡

如果使用h264编码,使用 h264_qsv / h264_nvenc 。

ffmpeg -i ./video.mp4 -c:v hevc_qsv ./out.mp4

使用GPU编码,运行以上ffmpeg命令,可以看到GPU占用率升高。

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


ffprobe命令

ffprobe ./video.mp4

查看视频文件信息。

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

ffprobe -v error -show_streams -print_format json ./video.mp4

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


ffplay命令

ffplay ./video.mp4

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

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命令时,必须要读取执行命令输出流中的内容,程序才不会阻塞。否则缓冲读满后,进程会卡住。
视频转换会非常耗时,取决于硬件性能。在实际应用中,我们也可以开启线程去处理。

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


除非注明,否则均为"攻城狮·正"原创文章,请注明出处。

本文链接:https://engr-z.com/422.html

相关推荐

一键生成高颜值图表!让你的文字瞬间有画面感,职场人必备!

哈喽,打工人们!忙碌的周中,大熊又来给你们带来一个超实用的效率神器啦!这次的宝藏网站绝对是那种用过就离不开的"真香"型产品!假设你明天就要做重要汇报,可面对一大堆密密麻麻的文字材料,你...

批量将 Word 转换为 PDF/Excel/Txt/图片等多种格式

Word文档是我们工作中经常会打交道的一种文档格式,我们也经常会有需要对Word文档进行格式转换的需求,比如将Word格式转换为PDF、将Word文档转换为Excel、将Word...

绝了!一键用AI生成高颜值动态PPT(附详细步骤+Prompt)

大家好,我是一名酷爱研究AI的产品经理,最近我有个新发现:那些花了你3天做出来的PPT,现在用AI可以1小时搞定!而且颜值还高!为什么AI做PPT比传统方式效率高10倍?我用一张图就能告诉你:AI生成...

ztext - 简单几行代码创建酷炫3D特效文字的开源JS库

把网页上的文字变成酷炫的3D风格,还能制作旋转动效,有了ztext.js,只需要几行代码。ztext能做什么ztext.js是一个能把常规的平面文字变成3D样式的前端开源代码库,让开发者...

文字内插入小图片,也太可爱了吧(文字中怎么插图片)

图文排版H5手机版秀米有小伙伴留言问添加图片的时候可不可以把图片添加到文字之间比如下面这句话中的小贴纸图片后面可以接着输入文字其实吧这就是咱们的『文字内插入小图片』功能嘛可以用来在文字内加个表情包又...

Linux环境下C++代码性能分析方法(linux怎么写c++代码)

技术背景在开发C++应用程序时,找出代码中运行缓慢的部分是进行性能优化的关键。在Linux系统上,有多种工具和方法可用于对C++代码进行性能分析,每种方法都有其特点和适用场景。实现步骤手动中断调试法在...

SVG互动图文,让你的文章更有趣!教你4种简单易学的黑科技玩法!

如果你是一个公众号创作者,那么你一定想知道如何让你的文章更加吸引人,更加有趣,更加有创意。你可能已经尝试过各种图文排版技巧,但是你是否知道,有一种黑科技可以让你的文章变得更加酷炫,更加互动,更加爆款?...

Videoscribe怎么实现实心中文汉字的手绘制作

很多朋友在制作手绘视频的时候,不知道怎么输入实心的中文汉字,之前我们已经给大家分享了怎么输入汉字的方法,但是有一点遗憾的是输出的汉字是空心的手绘展示,在视觉上并不是非常的美观。经过大家不断的探索,终于...

一款用于将文本转化成图表的现代化脚本语言

大家好,又见面了,我是GitHub精选君!今天要给大家推荐一个GitHub开源项目terrastruct/d2,该项目在GitHub有超过10.3kStar,用一句话介绍该项目就是:...

探秘 Web 水印技术(制作水印网站)

作者:fransli,腾讯PCG前端开发工程师Web水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印)...

不忍心卸载的五款神仙工具(不忍心卸载的五款神仙工具是什么)

001.效率工具uTools-装机必备的生产力工具集uTools是一款非常强大的可以装下几乎所有效率工具的电脑生产力工具集,目前拥有Windows、Mac和Linux三个版本。软件界面...

「SVG」飞花令!这份最高检工作报告“超有料”

原标题:【SVG】飞花令!这份最高检工作报告“超有料”栏目主编:秦红文字编辑:沈佳灵来源:作者:最高人民检察院...

svg|2025政府工作报告,有没有你关心的数据?

··<setattributeName="visibility"begin="click+0s"dur="1ms"fill="freeze"restart="never"to="hi...

videoscribe只能输入英文,如何输入中文文本?

videoscribe只能输入英文,如何输入中文文本?打开VideoScribe软件,打开要添加中文字体的位置。打开Photoshop并在文件中创建一个新的透明背景图层。注意:必须是透明背景层。...

五个流行的SVG在线编辑器(svg编辑工具)

随着响应网络的发展,越来越多的高质量的SVG在线编辑器被公众所熟知。SVG矢量图形也越来越受欢迎,以便在任何设备上呈现图像,甚至一些易于使用的SVG在线编辑器,可以替代PS,本文总结了五种流行的SVG...