音视频基本概念和FFmpeg的简单入门教程详解

目录
  • 写在前面
  • 基本概念
    • 容器/文件(Conainer/File):
    • 媒体流(Stream):
    • 数据帧/数据包(Frame/Packet):
    • 编解码器(Codec):
    • 复用(mux):
    • 解复用(mux):
    • 帧率(Frame rate):
    • 码率(Bit Rate):
    • FFmpeg
  • 第一条FFmpeg命令
  • FFmpeg命令处理流程
  • FFmpeg常用命令
  • 总结
  • [参考]

写在前面

最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下;

基本概念

ffmpeg概念

Fmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换组成.

  • ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码
  • libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
  • libavcodec:用于各种类型声音/图像编解码;
  • libavfilter:滤镜库
  • libavutil:包含一些公共的工具函数;
  • libswscale:用于视频场景比例缩放、色彩映射转换;
  • libpostproc:用于后期效果处理;
  • ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
  • ffplay:是一个简单的播放器,使用ffmpeg
  • 库解析和解码,通过SDL显示;(一般编译完没有带ffplay,新版本版本依赖于sd-2.0,需要安装sdl-2.0才能生成ffplay)

容器/文件(Conainer/File):

即特定格式的多媒体文件,一般来说一个视频文件是由视频,音频,字幕等按特定的格式/规则组合到一起的,常见如:

mp4
flv
mkv
avi

媒体流(Stream):

表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。

数据帧/数据包(Frame/Packet):

通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。

一般: Frame对应压缩前的数据,Packet对应压缩后的数据。

编解码器(Codec):

视频和音频都需要经过编码,才能保存成文件。编解码器是指以帧为单位实现压缩数据和原始数据之间的相互转换的;

编码:原始数据->压缩数据;

解码:压缩数据->原始数据;

不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。

常用的视频编码格式如下:

H.262
H.264
H.265

示例:原始图形YUV数据用H.264编码成H264帧

常用的音频编码格式如下:

MP3
AAC

示例:原始声音PCM数据用AAC编码器编码成AAC帧(是的音频也有帧)

复用(mux):

把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)

解复用(mux):

把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

帧率(Frame rate):

n帧率也叫帧频率,用FPS表示。帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。

一般电影的帧率为24;

码率(Bit Rate):

比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的位数,码率和视频质量成正比,在视频文件中中比特率用bps(bit per second)来表达。

码率越低,表示压缩程度越高,画质越差。

码率越高,视频质量相对越高,视频文件也就越大。

FFmpeg

FFmpeg是一个很多的项目,包括很多组件:

  • ffmpeg——一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码
  • ffserver——一个HTTP多媒体即时广播流服务器,支持时光平移
  • ffplay——一个简单的播放器,基于SDL与FFmpeg库
  • libavcodec——包含全部FFmpeg音频/视频编解码库
  • libavformat——包含demuxers和muxer库
  • libavutil——包含一些工具库
  • libpostproc——对于视频做前处理的库
  • libswscale——对于视频作缩放的库

我们一般说的的FFmpeg 是指FFmpeg 的命令行工具;

第一条FFmpeg命令

ffmpeg -y -i input.mp4 -acodec copy -vcodec libx264 -s 720x1280 output.avi

参数解析

-y # 全局参数,等于npm -y
-i input.mp4 #输入文件,FFmpeg命令有位置之分, -i 之前是输入参数,之后是输出参数
-acodec copy #输出文件参数,复制音频编码而不用重新编码
-vcodec libx26 #输出文件参数,重新用libx26编码(比较慢耗性能)
-s 720x1280 #输出参数,
output.avi #输出文件
可以看到,FFmpeg一般分为这五个部分,大家参考上面命令对号入座
    全局参数
    输入文件参数
    输入文件
    输出文件参数
    输出文件

所以这条命令的含义是:把视频input.mp4不修改音频的情况下用libx26编码音频,同时分辨率改成720*1280,格式改成avi;

视频信息

左:input.mp4 ,右:output.avi

可以看到视频文件已经完成了命令操作转换;

FFmpeg常用参数

-c:指定编码器

-c copy:直接复制,不经过重新编码
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流,不处理视频
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
-s: size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-b: bitrate 设置比特率,缺省200kb/s
-vcodec: codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据直接被拷贝。
-filter:  视频过滤器,如 -filter:v "crop=w:h:x:y"用过滤器v裁剪视频
		 w - 源视频中裁剪的矩形的宽度
		 h – 矩形的高度。
		 x – 我们想自源视频中裁剪的矩形的 x 坐标 。
		 y – 矩形的 y 坐标。

-aspect:设置横纵比 4:3 16:9 或 1.3333 1.7777
-ss:position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,比如用来指定剪切开始时间

FFmpeg命令处理流程

我们还是以这条命令为例,分析FFmpeg命令对视频的处理经过哪些流程

ffmpeg -y -i input.mp4 -acodec copy -vcodec libx264 -s 720x1280 output.avi

我们看图:

我们看到命令处理一般分成5个步骤

  • 解复用:把容器文件解析成编码的数据包;
  • 解码:解码器把数据包解码成数据帧;
  • filter进行帧处理:把1080 * 1920的数据帧处理成720 * 1280
  • 重新编码:编码器libx264重新把数据帧编码成编码的数据包;
  • 复用:把数据包按格式avi封装;

这个简单流程比较重要,要了然于心;

FFmpeg常用命令

打印视频基本信息

$ ffmpeg -i input.mp4 -hide_banner

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41isomavc1
    creation_time   : 2021-05-29T16:51:47.000000Z
  Duration: 00:00:30.61, start: 0.000000, bitrate: 5932 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1080x1920, 5672 kb/s, 60 fps, 60 tbr, 60 tbn (default)
    Metadata:
      creation_time   : 2021-05-29T16:51:47.000000Z
      handler_name    : L-SMASH Video Handler
      vendor_id       : [0][0][0][0]
      encoder         : AVC Coding
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 253 kb/s (default)
    Metadata:
      creation_time   : 2021-05-29T16:51:47.000000Z
      handler_name    : L-SMASH Audio Handler
      vendor_id       : [0][0][0][0]
At least one output file must be specified

转换格式修改分辨率

ffmpeg -y -i input.mp4  -s 720x1280 output.avi

视频静音处理(移除音频)

ffmpeg -i input.mp4 -an quiet.mp4

从视频中提取图片

ffmpeg -i input.mp4 -r 1 -f image2 -ss 00:00:10 -t 2 image-%2d.png
  • -r – 设置帧速度。即,每秒提取帧到图像的数字。默认值是 25。
  • -f – 表示输出格式,即,在我们的实例中是图像。
  • image-%2d.png – 表明我们如何想命名提取的图像。在这个实例中,命名应该像这样image-01.png、image-02.png、image-03.png 等等开始。如果你使用 %3d,那么图像的命名像 image-001.png、image-002.png 等等开始。

添加/修改封面

ffmpeg -y -i input.mp4 -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic cover_output.mp4

如果需要把视频第一帧截出来坐封面,那就先提取

ffmpeg -ss 00:00:01 -i input.mp4  -f image2  cover.png

提取视频里的音频文件

ffmpeg -i input.mp4 -vn -c:a copy output.aac

裁剪视频

ffmpeg -i input.mp4 -filter:v "crop=640:480:120:240" cut.mp4
  • -filter:v – 表示视频过滤器。
  • crop – 表示裁剪过滤器。
  • w – 我们想自源视频中裁剪的矩形的宽度。
  • h – 矩形的高度。
  • x – 我们想自源视频中裁剪的矩形的 x 坐标 。
  • y – 矩形的 y 坐标。

视频截取

ffmpeg -i input.mp4 -ss 00:00:05 -codec copy -t 10 cutout.mp4
  • -ss 开始时间
  • -t 10,截取十秒

视频切割拆分成多个

ffmpeg -i input.mp4 -t 00:00:13 -c copy part1.mp4 -ss 00:00:13 -codec copy part2.mp4

-t 00:00:13 表示从视频的开始到视频的第 30 秒创建一部分视频。

-ss 00:00:13 为视频的下一部分显示开始时间戳。它意味着第 2 部分将从第 30 秒开始,并将持续到原始视频文件的结尾。

视频合并拼接

ffmpeg -i "concat:part1.mp4|part2.mp4" -c:a copy -c:v copy combine.mp4

设置视屏屏蔽宽高

ffmpeg -i input.mp4 -aspect 4:3 4_3.mp4

通常使用的高宽比是:

  • 16:9
  • 4:3
  • 16:10
  • 5:4
  • 2:21:1
  • 2:35:1
  • 2:39:1

添加字幕

ffmpeg -i input.mp4 -i subtitle.srt -c copy output.mkv

是字幕文件,然后这里选用的是软字幕方式比较快

总结

根据项目需要,简单学习了下音视频的非常基本的概念和FFmpeg的基本使用,留个记录;

[参考]

https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html

https://zhuanlan.zhihu.com/p/67878761

到此这篇关于音视频基本概念和FFmpeg的简单入门的文章就介绍到这了,更多相关FFmpeg音视频内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • FFmpeg视频处理入门教程(新手必看)

    目录 一.概念 1.1 容器 1.2 编码格式 1.3 编码器 二.FFmpeg 的使用格式 三.常用命令行参数 四.常见用法 4.1 查看文件信息 4.2 转换编码格式 4.3 转换容器格式 4.4 调整码率 4.5 改变分辨率(transsizing) 4.6 提取音频 4.7 添加音轨 4.8 截图 4.9 裁剪 4.10 为音频添加封面 五.参考链接 FFmpeg是视频处理最常用的开源软件. 它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是

  • C语言结合ffmpeg打印音视频信息

    目录 一.通过此文可以得到什么 二.实现思路 三.实现效果 四.实现源代码  一.通过此文可以得到什么 通过此练习: 1.知道了如何计算一个音频和视频的播放时间: 2.知道了音视频解码的思路的大体流程,之后无非就是在这个流程上进行扩充细节: 3.知道了如何通过C语言或者C++编程语言结合ffmpeg拿到一些音视频的关键信息,例如:帧率等: 二.实现思路 三.实现效果 zhenghui@zh-pc:/data/project/VSCProject/ffmpegStudy$ make make al

  • C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com/item/ffmpeg/2665727?fr=aladdin FFmpeg 应用非常广泛,可以用来播放本地视频甚至网络视频,查看音视频信息,还可以用于从视频中提取音频,转换音视频文件格式等等,本文主要介绍如何调用 FFmpeg 来查看音视频信息.从视频中提取音频.转换音视频格式等. 1. 调用FF

  • C#调用FFmpeg操作音视频的实现示例

    目录 项目背景 FFmpeg介绍 FFmpeg相关教程 博客示例源码 下载FFmpeg.exe安装包 C#进程调用FFmpeg操作音视频 项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作.本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并,音频合并,音频与视频合并成视频这几个简单的音视频操作,还有些

  • 音视频基本概念和FFmpeg的简单入门教程详解

    目录 写在前面 基本概念 容器/文件(Conainer/File): 媒体流(Stream): 数据帧/数据包(Frame/Packet): 编解码器(Codec): 复用(mux): 解复用(mux): 帧率(Frame rate): 码率(Bit Rate): FFmpeg 第一条FFmpeg命令 FFmpeg命令处理流程 FFmpeg常用命令 总结 [参考] 写在前面 最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下: 基本概念 ffmpeg概

  • CentOS安装mysql5.7 及简单配置教程详解

    安装 保证你的用户有权限 安装 没有 切换 root su root (su的意思:swich user) # rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm 可能会遇到 warning: /var/tmp/rpm-tmp.6V5aFC: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY 可以忽略(个人意见,百度了一下没找到合适的答案)

  • JCrontab简单入门实例详解

    本文实例为大家分享了JCrontab简单入门,供大家参考,具体内容如下 创建一个JavaWeb项目 1.首先要下载JCrontab的相关jar包,Jcrontab-2.0-RC0.jar.放到lib文件夹下. 2.在src下新建文件jcrontab.properties如下: #crontab.xml 文件的目录,这个是作业调度规则 org.jcrontab.data.file =E:/EclipseWorkspace/ADemo/WebContent/WEB-INF/crontab.xml #

  • Qt音视频开发之利用ffmpeg实现倍速播放

    目录 一.前言 二.功能特点 2.1 基础功能 2.2 特色功能 2.3 视频控件 2.4 内核ffmpeg 三.体验地址 四.效果图 五.相关代码 一.前言 用ffmpeg做倍速播放,是好多年都一直没有实现的功能,有个做法是根据倍速参数,不断切换播放位置,实现效果不是很好,ffplay中的倍速就做得很好,而且声音无论倍速多少还非常柔和,有特别的降噪处理啥的,ffplay中的倍速使用的滤镜去实现,并动态调整pts/dts的值,整个处理过程看起来比较复杂,想着有没有稍微简单一点的办法,在经过一个朋

  • Android视频加水印之FFmpeg的简单应用实例

    视频处理是Android开发中常见的需求.像是视频加水印,视频格式转换,视频截图等等…… FFmpeg是处理视频时常用到的工具,一般情况可以用FFmpeg源码自己编译,也可以使用网上别人编译好的包,这里我使用的是后一种方案. 我使用的是在GitHub找的.当然其他FFmpeg编译出来的包都是可以的. 用FFmepg处理视频或者音频思路是: 加载FFmpeg环境 编写FFmpeg的处理命令 运行处理命令 等待结果返回 一.首先,引入依赖 compile 'com.writingminds:FFmp

  • Qt音视频开发之利用ffmpeg实现解码本地摄像头

    目录 一.前言 二.效果图 三.体验地址 四.相关代码 五.功能特点 5.1 基础功能 5.2 特色功能 5.3 视频控件 一.前言 一开始用ffmpeg做的是视频流的解析,后面增加了本地视频文件的支持,到后面发现ffmpeg也是支持本地摄像头设备的,只要是原则上打通的比如win系统上相机程序.linux上茄子程序可以正常打开就表示打通,整个解码显示过程完全一样,就是打开的时候要传入设备信息,而且参数那边可以指定分辨率和帧率等,本地摄像机一般会支持多个分辨率,用户需要哪种分辨率都可以指定该分辨率

  • Qt音视频开发之实现ffmpeg视频旋转显示

    目录 一.前言 二.效果图 三.体验地址 四.相关代码 五.功能特点 5.1 基础功能 5.2 特色功能 5.3 视频控件 一.前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受,所以一定要想办法解析到视频的旋转角度,然后根据这个角度重新绘制.在窗体那边也需要调整对应的分辨率,一般都是宽度高度互换.其实早期的很多播放器比如vlc2版本的播放器也是不支持旋转的

  • MongoDB 简单入门教程(安装、基本概念、创建用户)

    工作方向上的原因,不得不接触部分MongoDB的运维工作,之前有接触过一些MongoDB的内容,基本的运维操作没有什么问题,包括MongoDB的集群搭建.数据分片功能等都测试过.但是时间久了,很多东西不用就忘记了,最近准备出一个系列的MongoDB的运维操作文章,希望把这块儿内容重新拾起来.网上查了查,MongDB讲得好的书也就是<MongoDB权威指南>这本了,但是它引用的MongoDB版本比较旧,所以最好结合着官方文档看,这样收获会更快.MongoDB中文论坛里面也有不少前人总结的好文档,

  • C# 中SharpMap的简单使用实例详解

    本文是利用ShapMap实现GIS的简单应用的小例子,以供学习分享使用.关于SharpMap的说明,网上大多是以ShapeFile为例进行简单的说明,就连官网上的例子也不多.本文是自己参考了源代码进行整理的,主要是WinForm的例子.原理方面本文也不过多论述,主要是实例演示,需要的朋友还是以SharpMap源码进行深入研究. 什么是SharpMap ? SharpMap是一个基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRI Shape和PostGIS格

  • Java SPI简单应用案例详解

    开篇 本文主要谈一下 Java SPI(Service Provider Interface) ,因为最近在看 Dubbo 的相关内容,其中涉及到了 一个概念- Dubbo SPI, 最后又牵扯出来了 JAVA SPI, 所以先从 Java SPI 开整. 正文 平常学习一个知识点,我们的常规做法是: 是什么 有什么用 怎么用 这次我们倒着做,先不谈什么是 SPI 及其作用,来看下如何使用. 使用 1. 创建一个 maven 工程 2. 创建一个接口类以及实现类 // 接口 public int

随机推荐