零基础快速上手FFmpeg!一篇就够啦~

news2024/11/27 4:37:29

在这个自媒体盛行的时代,音视频(电影、音乐)对于我们来说是再熟悉不过了吧。那么对于一个音视频文件,都有哪些属性呢?以视频为例,我们可以通过如下命令查看其信息。

> ffmpeg -i .\demo.mp4
ffmpeg version 5.0.1-essentials_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\demo.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.12.100
  Duration: 00:00:17.62, start: 0.000000, bitrate: 4898 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 4895 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]

其中,

  • Input #0:表示通过ffmpeg -i参数输入的第一个文件,下标从0开始,当然也可以输入多个文件。

  • Metadata:表示视频元信息。

  • Duration:视频播放时长为17.62s,开始播放时间为0,整个文件的比特率为4898kb/s。

  • Stream #0:0(und): Video:h264,表示该文件的第一个流是视频流,编码格式为H.264(封装格式为AVC1),每一帧的数据表示为YUV420P,分辨率为1920*1080,视频流的比特率为1732kbit/s,帧率为29.83fps。

那么,什么是FFmpeg?

FFmpeg简介

FFmpeg(Fast Forward Moving Picture Experts Group,Fast Forward(快速前进),MPEG即为大名鼎鼎的ISO动态图像专家组),是一款免费、开源、支持跨平台的音视频编解码工具及开发套件,可以用于音频和视频的转码、转封装、录制、流化处理等场景,号称是音视频界的瑞士军刀。

FFmpeg组件

FFmpeg组件由命令行应用程序和函数库两部分组成。

命令行应用程序

  • ffmpeg:用于对视频文档或音频档案转换格式。

  • ffplay:一个简单的播放器,基于SDL与FFmpeg库。

  • ffprobe:用于显示媒体文件的信息。

函数库

  • libavutil:一个包含简化编程功能的库,包括随机数生成器、数学例程、核心多媒体使用程序等。

  • libavcodec:一个包含解码和编码器的音/视频编解码器的库。

  • libavformat:一个包含用于多媒体容器格式的解封装和封装的库。

  • libavdevice:一个包含输入和输出设备的库,用于抓取和呈现许多常见的多媒体输入/输出软件框架,包括Video4Linux、Video4Linux2、VFW和ALSA。

  • libavfilter:一个包含媒体过滤器的库。

  • libswscale:一个用于图像尺寸缩放和像素格式转换的库。

  • libswresample:一个用于音频重采样、格式转换、音频混合的库。

  • libpostproc:一个用于后期效果处理的库。

FFmepg基本概念

容器Container

一种文件封装格式,比如flv、mkv、mp4等,其中包含下面5种流以及文件头信息。

媒体流Stream

一种视频数据信息的传输方式,包括5种流:音频、视频、字幕、附件和数据。

帧Frame

一幅静止的图像,包括I帧、B帧、P帧。

GOP(Group Of Picture)

图像组,两个I帧之间的距离。Reference(参考周期)指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。

编解码器Codec

对视频进行压缩或者解压缩,CODEC = Encode(编码)+ Decode(解码)。

帧内压缩

压缩GOP图像组中的I帧。记录关键帧,剩余的依靠运动轨迹来预测生成视频。

帧间压缩

压缩GOP图像组中的B帧与P帧。基于连续视频的相邻帧之间具有冗余信息的特点对时间轴上不同帧之间的数据实施压缩,进一步提高压缩比。

软/硬编解码

软编解码

使用CPU对视频进行编解码的方式。

  • 优点:兼容性好。

  • 缺点:CPU占用率高,使得其它进程无法使用更多的CPU资源,导致电脑整体性能下降,产生降频、卡顿,无法流畅录制、播放视频等问题。

硬编解码

使用非CPU进行编码,如显卡GPU、专用的DSP芯片、厂商芯片等。一般编解码算法固定所以采用芯片处理。

  • 优点:编码速度非常快且效率极高,CPU的占用率低,就算长时间高清录制视频手机也不会发烫。

  • 缺点:兼容性欠佳。

相关视频推荐

ffmpeg实战教程:ffmpeg命令,ffmpeg过滤器,ffplay播放器,ffmpeg进阶学习icon-default.png?t=N7T8https://www.bilibili.com/video/BV1zC4y127uj/

【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发免费学习地址

【纯干货免费分享】C++音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击671977938加群免费领取哦~

复用/封装Mux

把不同的媒体流按照某种容器的规则存放在容器中。

封装/解封装Demux

把不同的媒体流从某种容器中解析出来。

帧率Fps

视频文件中每秒的帧数,肉眼想看到连续移动图像至少需要15帧。

码率/比特率Bitrate

视频每一秒包含的数据量、信息量。码率直接决定了视频的最终大小及视频的质量。

控制码率的方法:

  • CBR(Constant BitRate):固定码率模式,则文件大小可预算,编码压力小,通常用于直播场景;简单场景画质好,复杂场景画质差;属于空间利用率最低的一种方法。

  • VBR(Variable BitRate):动态码率模式,码率按需分配,简单场景码率低,复杂场景码率高。

  • CRF(Constant Rate Factor):固定质量模式,CRF值越低,视频质量越高,反之亦然。以观感画质为目标码率,文件大小不可预算。

FFmpeg视频处理流程

FFmpeg命令行使用

FFmpeg语法形式:

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

其中,

  • 全局参数 

-i 设定输入格式
-y 设定输出格式,输出时直接覆盖同名文件
-ss 开始时间
-c:指定编码器
-c copy:直接复制,无需经过重新编码
-c:v:指定视频编码器
-c:a:指定音频编码器
-an:去除音频流
-vn:去除视频流
  • 输出视频文件参数 

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

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

例如,将一个mp4文件转为webm文件,输入mp4文件视频编码格式为H.264,音频编码格式为aac;输出webm文件的视频编码格式为VP9,音频编码格式为Vorbis,命令如下:

ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
output.webm # 输出文件

常见使用示例

查看媒体文件信息

ffmpeg -i demo.mp4

如果想隐藏FFmpeg本身的信息,则添加-hide_banner参数。

ffmpeg -i demo.mp4 -hide_banner

视频编辑

调整码率

通常调整码率是为了将视频文件的体积变小。例如:

ffmpeg -i demo.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4

其中,-minrate指定最小码率,-maxrate指定最大码率,-bufsize设置缓冲区大小。

更改视频分辨率或长宽比

FFmpeg中采用-s参数来缩放视频,例如:

ffmpeg -i demo.mp4 -s 1024x576 output.mp4

视频拼接

用于将指定的数个视频片段拼接成一段视频。

ffmpeg -f concat -i file_concat.txt -codec copy output_concat.mp4
  • file_concat.txt

file 'demo.mp4'

file 'output.mp4'

视频转码

转换容器格式

将视频文件从一种容器转到另一种容器,即转换媒体文件格式,例如avi 、flv 、mp4等。

ffmpeg -i demo.mp4 -hide_banner video_output.avi

这里只是转一下容器格式,而不改变视频的编码方式。如想要加快转换速度,则可以再加上-c copy指定直接拷贝。

转换编码格式Transcoding

将视频文件从一种编码转成另一种编码,只需指定输出文件的视频编码器即可。例如:

  • 转成H.264编码,一般使用编码器libx264。

ffmpeg -i demo.mp4 -hide_banner -c:v libx264 output.mp4

  • 同理,转成H.265编码,一般使用编码器libx265。

ffmpeg -i demo.mp4 -hide_banner -c:v libx265 output.mp4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1216721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索arkui(2)--- 布局(列表)--- 2(支持分组/实现响应滚动位置)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中,开发人员通常会展示新网站或应用程序的设计、功能和用户体验,并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件,吸…

通义灵码,阿里巴巴的编程辅助工具

一、官网 通义灵码_智能编码助手_AI编程_人工智能-阿里云 二、安装VSCode 如何下载安装VSCode 三、VSCode安装通义灵码 1.访问扩展详情界面 方式1 访问通义灵码安装教程页面 方法2 访问VSCode市场中的TONGYI Lingma 点击 Install 按钮访问扩展详情界面 2.打开VSCode …

udp多点通信-广播-组播

单播 每次只有两个实体相互通信,发送端和接收端都是唯一确定的。 广播 主机之间的一对多的通信所有的主机都可以接收到广播消息(不管你是否需要)广播禁止穿过路由器(只能做局域网通信)只有UDP可以广播广播地址 有效网络号全是1的主机号 192.1…

《成为一名优秀的架构师:从基础到实践》

文章目录 前言《高并发架构实战:从需求分析到系统设计》《架构师的自我修炼:技术、架构和未来》《中台架构与实现:基于DDD和微服务》《分布式系统架构:架构策略与难题求解》《流程自动化实战:系统架构和软件开发视角 》…

人工智能-深度学习之序列模型

想象一下有人正在看网飞(Netflix,一个国外的视频网站)上的电影。 一名忠实的用户会对每一部电影都给出评价, 毕竟一部好电影需要更多的支持和认可。 然而事实证明,事情并不那么简单。 随着时间的推移,人们对…

使用VC++实现分段线性变换,直方图均衡化、锐化处理(使用拉普拉斯算子)

图像锐化1 实验要求 5.1实验目的、要求 实验目的: (1)掌握图像增强的原理与相关方法。 (2)能使用VC实现图像增强的一些相关功能。 实验要求: A部分: (1)对一幅256级灰度…

Linux | 进程间通信

目录 前言 一、进程间通信的基本概念 二、管道 1、管道的基本概念 2、匿名管道 (1)原理 (2)测试代码 (3)读写控制相关问题 a、读端关闭 b、写端关闭 c、读快写慢 d、读慢些快 (4&a…

线程的面试八股

Callable接口 Callable是一个interface,相当于给线程封装了一个返回值,方便程序猿借助多线程的方式计算结果. 代码示例: 使用 Callable 版本,创建线程计算 1 2 3 ... 1000, 1. 创建一个匿名内部类, 实现 Callable 接口. Callable 带有泛型参数. 泛型参数表示返回值的类型…

高级数据结构——树状数组

树状数组(Binary Index Tree, BIT),是一种一般用来处理单点修改和区间求和操作类型的题目的数据结构,时间复杂度为O(log n)。 对于普通数组来说,单点修改的时间复杂度是 O(1),但区间求和的时间复杂度是 O(n…

【备忘】websocket学习之挖坑埋自己

背景故事 以前没有好好学习过websocket,只知道它有什么用途,也知道是个好东西,平时在工作中没用过,所以对它并不知所以然。如今要做个自己的项目,要在付款的时候实时播报声音。自己是个开发者,也不想用别人…

类加载中的执行顺序

结论: 先静态再实例 实例化一个子类(这个颜色主要是实例化会执行的部分): 父类静态属性->父类静态代码块->子类静态属性->子类静态代码块->父类代码块&…

jQuery【jQuery树遍历、jQuery动画(一)、jQuery动画(二)】(四)-全面详解(学习总结---从入门到深化)

目录 jQuery树遍历 jQuery动画(一) jQuery动画(二) jQuery树遍历 1、 .children() 获得子元素&#xff0c;可以传递一个选择器参数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-…

【Effective C++ 笔记】(四)设计与声明

【四】设计与声明 条款18 &#xff1a; 让接口容易被正确使用&#xff0c;不易被误用 Item 18: 让接口容易被正确使用&#xff0c;不易被误用 Make interfaces easy to use correctly and hard to use incorrectly. “让接口容易被正确使用&#xff0c;不易被误用”&#xff0…

OpenCV基础应用(3)— 把.png图像保存为.jpg图像

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何把.png图像保存为.jpg图像&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 如果在电脑某…

web缓存-----squid代理服务

squid相关知识 1 squid的概念 Squid服务器缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容。 Squid代理服务器&#xff08;Squid proxy server&#xff09;一般和原始文件一起安装在单独服务器而不是网络服务器上。Squid通过追踪网络中的对象运用起作用。…

渗透测试--实战若依ruoyi框架

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

YOLOv3 学习记录

文章目录 简介整体介绍整体架构图 网络架构的改进Backbone 的改进FPNAnchor 机制 坐标表示与样本匹配目标边界框的预测正负样本匹配 损失函数 简介 关注目标在哪里 目标是什么 目标检测的发展路径&#xff1a; proposal 两阶段 --> anchor-base/ anchor-free --> nms f…

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离

目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务&#xff0c;例如userservice 二级是集群&#xff0c;例如杭州或上海 …

计算机网络的发展

目录 一、计算机网络发展的四个阶段 1、第一阶段&#xff1a;面向终端的计算机网络&#xff08;20世纪50年代&#xff09; 2、第二阶段&#xff1a;计算机—计算机网络&#xff08;20世纪60年代&#xff09; 3、第三阶段&#xff1a;开放式标准化网络&#xff08;20世纪70年…

【2023最全教程】python+appium自动化测试元素定位(建议收藏)

关于app自动化测试&#xff0c;元素定位工具有三个&#xff1a; appium自带的Appium Inspector工具 Android ADT原生的工具 python版uiautomator2中的weditor 由于我常用的是前两个&#xff0c;所以下面只介绍前面两种元素定位工具&#xff08;以下内容中均以微博为例子&am…