音视频基本概念和FFmpeg的简单入门

9a2ff7fc8018094d4c9849e0f0993b99.png

写在前面

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

基本概念

容器/文件(Conainer/File):

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

mp4
flv
mkv
avi

媒体流(Stream):

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

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

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

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

编解码器(Codec):

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

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

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

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

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

H.262
H.264
H.265

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

a5f8a89417676f4af54cd3aab28b0174.png
image-20220420174551776

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

MP3
AAC

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

1e05b71aab60c2eba999efa2212f847b.png
image-20220420174752168

复用(mux):

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

b7dede64361bcdde76838ba18115b28a.png
image-20220420173433070

解复用(mux):

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

60646718ebf814a10f23b70700fa6d69.png
image-20220420173514115

帧率(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

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

007875cb6f43fbf5f976b85492272905.png
image-20220421111033369

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

我们看图:

7a6dcadadd40dcb7ce11810f197387d9.png
image-20220421151232836

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

  1. 解复用:把容器文件解析成编码的数据包;

  2. 解码:解码器把数据包解码成数据帧;

  3. filter进行帧处理:把1080 * 1920的数据帧处理成720 * 1280

  4. 重新编码:编码器libx264重新把数据帧编码成编码的数据包;

  5. 复用:把数据包按格式avi封装;

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

FFmpeg常用命令

打印视频基本信息

$ ffmpeg -i input.mp4 -hide_bannerInput #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':Metadata:major_brand     : mp42minor_version   : 0compatible_brands: mp42mp41isomavc1creation_time   : 2021-05-29T16:51:47.000000ZDuration: 00:00:30.61, start: 0.000000, bitrate: 5932 kb/sStream #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.000000Zhandler_name    : L-SMASH Video Handlervendor_id       : [0][0][0][0]encoder         : AVC CodingStream #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.000000Zhandler_name    : L-SMASH Audio Handlervendor_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

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

总结

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

[参考]

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

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

廖庆富视频教程

67130ef4b7a2c4ef66b64d7833dff5ce.png

文章博客园地址请点击“阅读原文”

                                                                                                   不给我点个赞再走吗~

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

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

相关文章

linux shell之paste合并文件和找到匹配的文件里面替换内容(find和-exec或xargs组合)

1 问题 1)合并2个文件,这里用paste命令 2)找到匹配的文件里面替换内容,这里用find 和 -exec或xargs命令组合 2 实现 1)合并2个文件,这里用paste命令,我们在paste后面加参数-d 然后加" &…

Windows Live Writer 的昨日荣光

今天这一篇文章,想写一写Windows Live Writer这款博客编辑器(最早的一个版本是2007年发布的)。毫不夸张地说,这是为数不多的几款所见即所得的编辑器之一,当然,它的运行速度慢也是一个众所周知的问题。作为一…

qpython执行手机脚本精灵使用教程_Android上执行python脚本-QPython

看书,发现android可以跑python。尝试了一下。首先需要在手机上安装python环境,通过安装apk实现,这个apk叫QPython,还有同类的比如SL4A。QPython的官网:https://www.qpython.com/可以在官网上下载QPython的安装包&#…

猎豹MFC--CMenu菜单 设置主菜单 给主对话框设置菜单 设置快捷菜单

设置主菜单(不是快捷菜单):给主对话框设置菜单:效果如下:修改菜单的ID使之便于记忆:给菜单添加消息处理:添加处理代码:设置快捷菜单:打开对话框,属性添加消息…

SQL主键简单表述

主键(PRIMARY KEY 约束):PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键就是唯一的,其是索引的一种,并且是唯一性索引的一种。 其实主键就像我们的身份证一样,每一个主键的id就表示着一个特定的一…

oracle 删除空间不足,oracle表空间扩容、创建、删除(解决表空间不足问题)

前言整理一下之前使用oracle数据库遇到的表空间不足的问题,顺便水个博客。oracle表空间操作语句1.改变已存在的数据文件的大小ALTER TABLESPACE app_data ADD DATAFILE ‘D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\APP03.DBF‘ SIZE 20480M;2.允许已存在的数据文件…

重复数据删除:块级技术VS.字节级技术

重复数据删除技术能够识别重复的数据,消除冗余,减少需转移或存储的数据的总体容量。在本文中,我将分别对这两种技术加以评论。与块级技术相比,字节级删除技术对数据的检查更加细微,精度更高,但同时需要更加…

Mac升级到Yosemite后默认的php版本不支持imagetfftext函数问题解决

Mac升级到yosemite后,php也自动升级,运行项目的时候发现后台验证码显示不出来。调试一下发现imagetfftext这个函数不存在,应该gd没有安装完全,因为Mac上的php实现系统自带的,只能通过重新安装php来解决【不能通过安装扩…

linux shell之字符串的更具字符分割和删除字符和文本内容的删除以及内容是否匹配成功

1 字符串的更具字符分割 1) xargs分割 echo "chenyu*hello*word" | xargs -d "*" chenyu hello word 2) awk分割 echo "chenyu*hello*word" | awk -F "*" {print $1} chenyu 2 字符串的删除字符 1&#xf…

将一个正方形分成4个大小一样的小正方形,再将其中一个小正方形分成4个小正方形,如此类推,分割n次是几个正方形?

问题: 将一个正方形分成4个大小一样的小正方形,再将其中一个小正方形分成4个小正方形,如此类推,分割n次是几个正方形? 解答: 一次分割都是将一个分成4个,增加了3(1*3)个…

领域事件和集成事件没那么高大上

前言随着系统架构的演变,有很多名词也随之涌现,如:微服务、灰度发布、资源隔离、容器、领域/集成事件等,听着的确高大上,让很多小伙伴有一种无法征服的感觉;其实很多东西可能之前就已经用过了,只…

python截图拼接_Python实现屏幕截图有两种方式 - 小众知识

使用windows API使用PIL中的ImageGrab模块下面对两者的特点和用法进行详细解释。一、Python调用windows API实现屏幕截图好处是灵活速度快缺点是:写法繁琐不跨平台import timeimport win32gui, win32ui, win32con, win32apidef window_capture(filename):hwnd 0 #…

sql drop 简单操作(Mysql)

通过使用 DROP 语句&#xff0c;可以轻松地删除索引、表和数据库。 例如&#xff0c;删除一个表&#xff0c;表名为 table1 的表&#xff1a; drop table <表名>; drop table table1 ; drop删除数据库 test1: drop database <数据库名>; drop database test1…

20142335郝昊第三周学习总结

20145335郝昊 《Java程序设计》第3周学习总结 教材学习内容总结 第四章 类与对象 定义&#xff1a; 对象&#xff08;Object&#xff09;&#xff1a;存在的具体实体&#xff0c;具有明确的状态和行为。 类&#xff08;Class&#xff09;:具有相同属性和行为的一组对象的集合&…

Python面向对象编程基础

#codingutf-8class hello:def __init__(self,NAME):self.nameNAMEdef sayhello(self):print("Hello, {0}".format(self.name)) #拼接字符串&#xff0c;也可以用print("Hello "self.name)#类的继承 class hi(hello): #父类用括号括起来def sayhi(self):pr…

书生云王东临:真正的超融合产品要像“机器猫” 开箱即用

“经过6年的发展&#xff0c;我们已经为技术找到了非常好的落地产品&#xff0c;可以突出我们的优势&#xff0c;现在到了我们大展宏图的时候了。”20年前书生集团从电子公文业务起家&#xff0c;后来经营过电子书网站&#xff0c; 6年前开始进入云存储领域&#xff0c;在存储技…

NetBeans安装提示neatbeans cannot find java 1.8 or higher

1 问题 安装NetBeans的时候&#xff0c;点击bin目录下的netbeans64.exe,然后提示错误 neatbeans cannot find java 1.8 or higher 然后我在终端输入java -version是1.8 C:\Users\User>java -version java version "1.8.0_65" Java(TM) SE Runtime Environment …

hierarchyviewer

为什么80%的码农都做不了架构师&#xff1f;>>> 学习monkeyrunner&#xff0c;无奈怎么都无法启动activity&#xff0c;人家告诉我.hierarchyviewer这个工具可以&#xff0c;今天我就开始学习这个了&#xff0c;但愿有所帮助啊。http://www.xuebuyuan.com/2104811.…

ALTER 简单操作(mysql)

ALTER 语句 ALTER 语句用于在已有的表中添加、修改或删除。 删除列: ALTER TABLE 表名字 DROP 列名称 例如&#xff1a;删除test111表中的age列 ALTER TABLE test1111 DROP age 添加列&#xff1a;添加到test1111表列&#xff0c;名为age&#xff0c;约束为not null 注释…

什么时候应该使用 LazyT ?

咨询区 danyolgiax最近我在看关于 Lazy<T> 的资料&#xff0c;链接&#xff1a;https://sankarsan.wordpress.com/2009/10/04/laziness-in-c-4-0-lazyt &#xff0c; 看是看完了&#xff0c;但我始终想不明白它的应用场景有哪些&#xff1f;回答区 Matthew如果你在项目中…