FFmpeg转码流程和常见概念

news2024/11/26 1:37:44

视频格式:mkv,flv,mov,wmv,avi,mp4,m3u8,ts等等
FFmpeg的转码工具,它的处理流程是这样的:

  1. 从输入源获得原始的音视频数据,解封装得到压缩封装的音视频包
  2. 对音视频包进行解码,得到原始的音视频帧
  3. 对原始音视频帧进行后期特效处理
  4. 对处理后的音视频帧重新进行编码封装,得到处理后的音视频包
  5. 对重新编码封装的音视频包进行封装,输出音视频文件或直播推流

请添加图片描述

主要的编解码类型包括H.264, H.265, VP8, VP9, MPEG-2, AAC, MP3, AC-3等。
主要的封装(Mux/Demux)类型包括flv,avi,rmvb,mp4,mov,mkv,ts,m3u8等

在FFmpeg中有些基本概念:
1、容器(Container),在这里它是指一种文件格式,如flv,mkv等
2、流(Stream):在这里是指视频数据信息的传输方式,常见的有5种音频
3、帧(Frame):在这里指的是一张静止的图像,它分为I、P、B三种帧
4、编解码器(Codec):可以对视频进行压缩、解压缩
5、复用/解复用(Mux/Demux):把不同的流按照某种容器的规则放入容器,称为复用;把不同的流从某种容器中解析出来,称为解复用
6、帧率(帧频率):指的是视频文件中每一秒的帧数,人的眼睛如果想要看到连续移动的图像,每秒至少需要15帧。
7、码率(bitrate per second, bps):又叫比特率,是指每秒处理的比特数,用于衡量视频或音频质量的一个参数。码率越高,视频质量就越高。

ffmpeg命令工具的使用

常见参数介绍:

  • -i:指定输入流,如文件、网络媒体流
  • -f:指定输出格式,如mp4,flv,mkv,ts,image2,gif
  • -ss:指定截取视频片段的开始时间
  • -t:指定截取视频片段的时长,单位是秒
  • -b:指定视频码率,默认是200kb/s
  • -r:指定帧率,默认是25
  • -s:指定画面的宽度和高度,e.g -s 1080x720
  • -aspect:指定画面的比例
  • -vn:不处理视频,将视频流过滤掉
  • -vcodec:指定视频编码器,若未指定,则使用与输入流相同的编码器,-vcodec copy表示复制输入流的编码器
  • -ar:指定采样率,常见采样率:22050,44100,48000
  • -ac:指定声道数
  • -acodec:指定声音编码器,若未指定,则使用与输入流相同的编码器,-acodec copy表示复制输入流的声音编码器
  • -target type:指定目标文件类型(VCD,SVCD,DVD,DV,DV50) ,type可以带上pal-,ntsc-,film-等前缀,以便能够使用相应的标准
  • -ps:指定RTP负载数据的字节数,默认为0

例子:

// MP4 转 TS,音频和视频都不用重新编码,使用输入流的就行,封装格式从MP4转换成TS
ffmpeg -i input.mp4 -acodec copy -vcodec copy -f mpegts output.ts
// 下面这个命令与上面的命令等价,-c copy表示音频和视频都不用重新编码,直接复制输入流的编码
ffmpeg -i input.mp4 -c copy -f mpegts output.ts
// MP4 转 TS,音频和视频都不用重新编码,使用输入流的就行,封装格式从MP4转换成TS,如果output.ts已存在就直接覆盖旧文件
ffmpeg -i input.mp4 -acodec copy -vcodec copy -y output.ts
// avi转gif
ffmpeg -i input.avi output.gif
// avi转gif,从第6秒开始,共截取20秒数据
ffmpeg -ss 6 -i input.avi -t 20 output.gif
// avi转dv,标准的数字化PAL电视标准的分辨率为720x576,帧率25.因此 -s pal 就是 -s 720x576 ,-r pal就是-r 25
ffmpeg -i input.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 -y output.dv
// avi 转 DVD 音频和视频都不用重新编码,使用输入流的就行,封装格式从MP4转换成TS
ffmpeg -i input.avi -target pal-dvd -ps 1000000000 -aspect 16:9  output.mpeg

视频缩略图

1、生成所有帧的视频缩略图

// %06d.jpg,输入文件的格式,这里指定6位数字,范围是000001.jpg~999999.jpg
ffmpeg -i input.avi -f image2 %06d.jpg

2、指定缩略图的宽和高,为防止出现图片变形,应尽量保持原来视频中的宽高比。

// %06d.jpg,输入文件的格式,这里指定6位数字,范围是000001.jpg~999999.jpg
ffmpeg -i input.avi -f image2 -s 1024x768 %06d.jpg

3、指定时段的视频缩略图

// 视频前5秒的缩略图
ffmpeg -i input.avi -t 5 -f image2 %06d.jpg
//视频第30开始到第50秒结束的缩略图
ffmpeg -i input.avi -ss 0:0:30 -to 0:0:50 -f image2 %06d.jpg

4、指定缩略图提取速率

// 这里的-r 1表示每秒提取一张缩略图,-y表示覆盖同名文件
ffmpeg -i input.avi -r 1 -f image2 -y %06d.jpg

5、指定帧数的缩略图

// 提取视频前20帧的视频缩略图
ffmpeg -i input.avi -vframes 20 -f image2 -y %06d.jpg
// 提取视频前20帧的视频缩略图,格式为gif
ffmpeg -i input.avi -vframes 20 -f gif -y output.gif

拼图成视频

前面我们使用了ffmpeg将视频生成了很多单张的图片,同理,它也可以将大量的单张图片拼接成一个视频。为了方便将图片拼接成视频,我们需要对图片名字进行一下预处理,文件名用数字将其次序标记出来,我们可以通过用文件重命名的方式来完成。 如有以下这些图片:
000001.jpg
000002.jpg
000003.jpg

000010.jpg
000011.jpg
000012.jpg

000100.jpg
000111.jpg
000112.jpg

001000.jpg
001111.jpg
001112.jpg

// %06d是数字占位符,ffmpeg会按次序加载000001.jpg~001112.jpg图片,注意1.jpg是无法匹配的。
ffmpeg -f image2 -i %06d.jpg -s 640x480 output.mp4

上面的命令如果没有指定其他参数,那么那些参数都会用默认值,如帧率25帧每秒,使用H.264编码等。

调整帧率,让其每秒拼接10张图片,如果不指定的话,它就是每秒拼接25张图片:

ffmpeg -r 10 -f image2 -i %06d.jpg -s 640x480 output.mp4

-r 10放在-i %06d.jpg的前面和后面的意思是不一样的,如上面,它是每秒拼接10张图片,如果放后面,如下面所示,则表示输出视频的帧率是10帧每秒,但是输入的还是默认的25帧每秒。

ffmpeg -f image2 -i %06d.jpg -r 10  -s 640x480 output.mp4

调整输出视频的码率

ffmpeg -r 10 -f image2 -i %06d.jpg  -b:v 4M output.mp4

-b:v表示Bitrate of Video,一般来说如果原始图片比较大,使用默认参数生成的视频都会比较大,所以我们可以适当调整一下码率。但是要清楚一点,那就是高码率不意味着就一定高清晰,这取决于使用的视频编码格式,如H.265编码可以用更小的码率生成H.264同等的视频质量。
调整视频质量
ffmpeg有一个参数可以用来平衡视频质量和文件大小的参数-crf Constant Rate Factor,取值范围是0~51,取值越大,内容损失越大,视频质量也就越差,这个参数的默认值是23,推荐值17~28

ffmpeg -r 10 -f image2 -i %06d.jpg  -crf 30 -y output.mp4

调整视频的编码
-c:v Codec of Video,通过这个参数来指定新的编码,ffmpeg对MP4的封装一般默认使用H.264编码,根据上述提到的码率与视频清晰度的关系,我们要以使用H.265来代替H.264,来获得同等质量的视频的同时,还可以减少视频文件大小:

ffmpeg -r 10 -f image2 -i %06d.jpg  -c:v libx265 -y output.mp4

libx265, libx264这些编码库需要在ffmpeg使用它们之间集成进来。

调整视频的分辨率

ffmpeg -r 10 -f image2 -i %06d.jpg  -s 640x480 -y output.mp4

我们用上面的命令,直接将视频分辨率调整为640x480 ,但是如果原始图片不是4:3,就会出现图像被拉伸,所以我们可以用下面的命令使其可以等比例缩放:
-vf scale Video Filter Scale

ffmpeg -r 10 -f image2 -i %06d.jpg  -vf scale:-1:480 -y output.mp4

-vf scale:-1:480 的意思是高度定为480,而宽度则等比例缩放,反之,-vf scale:640:-1 宽度定为640,而高度则等比例缩放

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

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

相关文章

iOS应用如何通过广告变现?有哪些变现优势?

2021年,在ios 14.5发布后,移动应用生态正式进入「后 IDFA 时代」,收集用户数据的方式发生了变化,这让通过定向广告变现变得比以往更加困难,且苹果还禁止对安装应用提供奖励。即便如此,iOS的“吸金”能力只增…

优质全套SpringMVC教程

三、SpringMVC 在SSM整合中,MyBatis担任的角色是持久层框架,它能帮我们访问数据库,操作数据库 Spring能利用它的两大核心IOC、AOP整合框架 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想(不是设计模式-思想就是我们…

java 角色访问控制管理系统Myeclipse开发mysql数据库MVC结构serlvet编程计算机网页项目

一、源码特点 java 角色访问控制管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统采用serlvetdaobean,系统具有完整的源代码和数据库,系统主要采用B/S模式开发 开发工具myeclipse8.5 mysql5…

java8实战 lambda表达式和函数式接口(上)

前言: 本博客对java8实战第三章的总结,也是上一篇博客行为化参数的延续,介绍一下函数式接口 Lambda表达式 lambda的表达式的结构由:参数,箭头,主体构成。 lambda示例 函数式接口: 先看上一篇…

Ubuntu-报错

Hadoop-Eclipse-java:耽误进度的几个报错 错误1:桥接模式与NAT模式相互切换后导致两种模式都不能访问互联网(1)具体错误:(2)错误原因:(3)解决方案&#xff1a…

Java_Arrays类

一、Arrays类 接下来学习的类叫做Arrays,其实Arrays并不是重点,但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays,再通过Arrays来学习Lamdba这样学习会更丝滑一些_. 1.1 Arrays基本使用 …

【Linux】初识命令行

为什么使用命令行? 大多数的计算机用户只是熟悉图形用户界面(GUI),采用图形方式显示的用户操作界面。命令行界面(CLI)是一种通过文本输入来与计算机进行交互的方式,用来和计算机进行交流沟通的非常有效的方式,正像人类社会使用文…

jetpack compose 学习(2)

jetpack compose 学习(1) 学会了如何创建一个compose项目,并成功run了起来 今天学习run起来的界面配置 找启动界面,当然是先找到界面的配置文件: androidManifest.xml 这个文件,然后通过启动项找到主界面, 第二步 按住ctrl 鼠标指向MainActivity 即可跳转主界面 进入后的界面…

HarmonyOS--基础组件Button

Button组件 可以包含单个子组件。 Button(label?: ResourceStr, options?: { type?: ButtonType, stateEffect?: boolean }) 1:文字按钮 Button(‘点击’) 2:自定义按钮,嵌套其它组件 Button() {Image(https://) }.type(ButtonType.Circle)

优质全套Spring全套教程

hello,我是小索奇,这里把Spring全套笔记分享出来哈,便于大家查看~一起加油 Spring 1、Spring简介 1.1、Spring概述 官网地址:Spring | Home Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各…

为什么要使用表单?

目录 1.与服务器端的数据交互 2. 表单验证 3. 无需JavaScript支持 4. 语义化 表单元素的局限性 1. 样式限制 2. 客户端验证的局限性 总结: HTML使用表单是为了在Web页面中收集和提交用户输入的数据。表单可以包含多个表单元素,如文本框、下拉列表、单选框和…

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练,LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型,但它具备理解和生成人类语言的能力,非常厉害!它可以革新各个行业,包括自然语言处理、机器翻译、…

【ZYNQ学习】PL第一课

这节课讲什么? 这节课的名字本来是想写为LED,但这一课里除了LED也有按键,又想换为GPIO控制,但关于PL的GPIO控制,不应该这么草率和简单,而且这一课有很多和ZYNQ或者PL关联性不强的东西要说。 所以我写了删删…

mmpose 使用笔记

目录 自己整理的可以跑通的代码: 图片demo: 检测加关键点 自己整理的可以跑通的代码: 最强姿态模型 mmpose 使用实例-CSDN博客 图片demo: python demo/image_demo.py \tests/data/coco/000000000785.jpg \configs/body_2d_k…

探索人工智能中的AI作画:创意、技术与未来趋势

导言 AI作画是人工智能领域中一个备受关注的前沿应用,它将传统艺术与先进技术相结合,创造出令人惊艳的艺术品。本文将深入探讨AI作画的创意过程、技术原理以及未来可能的发展趋势。 1. AI作画的创意过程 艺术风格迁移: AI作画通过学…

es6学习(一):变量声明的方式对比:var,let,const

前言 在let和const出现之前,js可以使用var为变量命令,如果是函数也可以用function命名,甚至你可以直接不用任何关键字命名 var a 1function fn() { }b 2console.log(a)console.log(fn)console.log(b) 结果如下 var的特性 1.window环境下,var在最外层定义的变量会直接赋值给…

【UML】组件图中的供需接口与面向对象中的接口

UML(统一建模语言)组件图中的“供接口”(Provided Interface)和“需接口”(Required Interface)与面向对象编程中的接口概念有关联,但它们在应用上有所区别。 下面解释两者的关系: …

SIGGRAPH 2022 | 筷子该怎么用? ——基于贝叶斯优化和强化学习的灵巧手握筷及控制方法

使用仿生手灵巧地操作工具一直是计算机动画和机器人方向的一个长期具有挑战性的问题。工具使用的主要困难包括:手的高自由度;工具的欠驱动;以及手、工具和物体之间复杂的相互作用。操作的困难程度也取决于所涉及的工具类型。有些工具只需要牢…

【MATLAB源码-第100期】基于matlab的OFDM系统papr抑制算法对比,clipping,PTS,SLM。

操作环境: MATLAB 2022a 1、算法描述 OFDM(正交频分复用)系统中,高峰均值功率比(PAPR)的抑制是一项关键技术,有助于提高信号的功率效率和传输质量。主要的PAPR抑制算法包括削波(C…

2023 亚马逊云科技 re:lnvent 大会探秘: Amazon Connect 全渠道云联络中心

2023 亚马逊云科技 re:lnvent 大会探秘: Amazon Connect 全渠道云联络中心 前言一. Amazon Connect 介绍 🗺️二. Amazon Connect 使用教程 🗺️1.我们打开URl链接找到对应服务2.输入Amazon Connect选中第一个点击进入即可;3.在进入之后我们就…