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

音视频命令转换工具 - FFmpeg(音视频格式转换与使用)

nanshan 2025-04-05 20:56 9 浏览 0 评论

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

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

相关推荐

ssh终端xshell日志查看命令(xshell怎么看日志)

现在我们云服务器运维较多用的是SSH工具,其中常用的包括PUTTY、XSHELL等,其实大同小异界面UI稍微不同,但是都可以进入远程连接。这里有朋友提到如何查看服务器的日志文件,这个其实和是否使用XS...

使用 Fail Ban 日志分析 SSH 攻击行为

通过分析`fail2ban`日志可以识别和应对SSH暴力破解等攻击行为。以下是详细的操作流程和关键分析方法:---###**一、Fail2ban日志位置**Fail2ban的日志路径因系统配置...

如何高效读取Linux日志文件?这些命令要熟记于心!

在Linux系统中,日志文件通常存储在/var/log目录下。比如,/var/log/syslog(或/var/log/messages,视发行版而定)记录系统整体事件,/var/log/a...

Windows服务器远程登录日志查询方法,linux查看登录日志方法

概述本文介绍Windows、Linux服务器查询系统的远程登录日志方法。根据服务器所使用的操作系统不同,有以下两种查询方法。Linux操作系统的登录日志查询通过远程连接登录Linux服务器,使用roo...

iptables防火墙如何记录日志(防火墙日志查看)

例如:记录所有ssh服务的登录的日志首先,我们需要了解如何将所有的iptables的INPUT链数据包记录到/var/log/messages中。如果你已经有一些iptables规则了,那么将记录日志...

如何安全管理SSH密钥以防止服务器被入侵

SSH密钥安全管理实施指南(2025年更新版)一、密钥生成与存储规范高强度密钥生成bashCopyCodessh-keygen-ted25519-a100#生成ED25519算法密钥(比...

在CentOS上安装nginx服务器(centos搭建代理服务器)

一、环境描述1.虚拟机配置CPU:单核内存:2GB硬盘:120GBIP:10.24.17.1082.操作系统版本:CentOS6.6x86_64安装方式:Minimal3.虚拟化环境VM...

CentOS7安全加固的一份整理规划建议

◆更新系统:及时更新CentOS7操作系统版本和安全补丁,确保系统以最新状态运行。◆关闭不必要的服务:在运行系统时,应关闭不需要的服务和端口,以减少系统暴露的攻击面。◆安装防火墙:使用iptables...

第四十七天-二叉树,centOS安装tomcat,Maven,vsftpd

学习笔记:1.Maven是Apache下的一个纯Java开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven...

Linux远程桌面连接使用教程 Widows终端远程连接Linux服务器

一、前言为什么不是远程连接Linux服务器?因为我不会,远程连接window我就用电脑自带的“远程桌面连接”。以下所述都是在CentOS操作系统下的。服务器刚换成Linux的时候很迷茫,感觉无从下手...

CentOS 安全加固操作,保护你的操作系统

系统加固是保障系统安全的重要手段,对于维护企业数据安全、用户隐私以及系统稳定运行具有重要意义。加固后的系统更加健壮和稳定,能够有效减少因安全问题导致的系统故障和停机时间,提高系统的可用性和可靠性。通过...

Dockerfile部署Java项目(docker如何部署java项目)

1、概述本文主要会简单介绍什么是Docker,什么是Dockerfile,如何安装Docker,Dockerfile如何编写,如何通过Dockerfile安装jar包并外置yaml文件以及如何通过do...

CentOS7云主机部署Fail2ban阻断SSH暴力破解

关于Fail2banFail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽)例如:当有人在试探你的HTTP、SSH、SMTP、FTP密...

在CentOS7上用源码编译安装PostgreSQL

1、新建postgres用户#useraddpostgres&&passwdpostgres2、安装依赖包#yum-yinstallmakegccgcc-c++readline...

pure-ftpd 使用(ftp prompt命令)

pure-ftpd是一个免费的ftp软件,其他介绍就不多说了。我们直接开始主题安装centosyuminstallepel-releaseyuminstallpure-ftpd配置备份原配置...

取消回复欢迎 发表评论: