FFmpeg转码流程和常见概念
视频格式:mkv,flv,mov,wmv,avi,mp4,m3u8,ts等等
FFmpeg的转码工具,它的处理流程是这样的:
- 从输入源获得原始的音视频数据,解封装得到压缩封装的音视频包
- 对音视频包进行解码,得到原始的音视频帧
- 对原始音视频帧进行后期特效处理
- 对处理后的音视频帧重新进行编码封装,得到处理后的音视频包
- 对重新编码封装的音视频包进行封装,输出音视频文件或直播推流
主要的编解码类型包括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,而高度则等比例缩放
相关文章:
FFmpeg转码流程和常见概念
视频格式:mkv,flv,mov,wmv,avi,mp4,m3u8,ts等等 FFmpeg的转码工具,它的处理流程是这样的: 从输入源获得原始的音视频数据,解封装得到压缩封装的音…...
【01】GeoScene生产海图或者电子航道图
1.1 什么是电子海图制图模块 GeoScene海事模块是一个用于管理和制作符合国际水文组织(IHO)S-100系列标准和S-57标准的海事数据的系统。提供了S-100和S-57工具,用于加载基于S-100的要素目录、创建基于S-57传输结构的数据、输入数据、符号化数…...
TWS蓝牙耳机的船运模式
TWS蓝牙耳机的船运模式 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, TWS蓝牙耳机的船运模式是指在将耳机从一个地方运送到另一个地方时,…...
Vue系列之指令 v-html
文章の目录 1、v-html指令2、基本用法写在最后 1、v-html指令 v-html 指令类似于 v-text 指令,它与 v-text 区别在于 v-text 输出的是纯文本,浏览器不会对其再进行html解析,但v-html会将其当html标签解析后输出,类似于 JavaScrip…...
Mac如何安装stable diffusion
今天跟大家一起在Mac电脑上安装下stable diffusion,在midjourney等模型收费的情况下如何用自己的电脑算力用上免费的画图大模型呢?来吧一起实操起来 一、安装homebrew 官网地址:Homebrew — The Missing Package Manager for macOS (or Lin…...
Kubernetes (k8s) 快速认知
应用部署方式 传统部署时代 早期的时候,各个组织是在物理服务器上运行应用程序。缺点 资源分配问题: 无法限制在物理服务器中运行的应用程序资源使用 维护成本问题: 部署多个物理机,维护许多物理服务器的成本很高 虚拟化部署时…...
Electron V28主进程与渲染进程互相通信总结
本文示例采用ElectronVue3TS编写,请读者理顺思路,自行带入自己的项目。 注: 读本文前请先搞懂什么是主进程,什么是渲染进程。 在Electron中有着ipcMain和ipcRenderer、contextBridge模块,以及创建窗口对象上的webCont…...
MySQL主从复制详解
目录 1. 主从复制的工作原理 1.1. 主从复制的角色 1.2. 主从复制的流程 2. 配置MySQL主从复制 2.1. 确保主服务器开启二进制日志 2.2. 设置从服务器 2.3. 连接主从服务器 2.4. 启动复制 3. 主从复制的优化与注意事项 3.1. 优化复制性能 3.2. 注意复制延迟 3.3. 处理…...
verilog基础语法-计数器
概述: 计数器是FPGA开发中最常用的电路,列如通讯中记录时钟个数,跑马灯中时间记录,存储器中地址的控制等等。本节给出向上计数器,上下计数器以及双向计数器案例。 内容 1. 向上计数器 2.向下计数器 3.向上向下计数…...
有SCL,SDA,TRIG,I2C的元器件是什么?在哪找?proteus
寻找方法:...
再谈低代码开发——值得所有程序设计和开发者重视的建议!
前几天看到关于“低代码开发”的话题,简单的谈了些自己的看法,也看了一些朋友们各抒己见的好文章,今天想结合我们实际使用的开发平台和大家再做些探讨。 在平台的简介中首先提出了这个大家一定很关心的问题: 一、“为什么使用低代…...
Docker部署MinIO对象存储服务器结合内网穿透实现远程访问
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...
USB2.0 Spec
USB System Description A USB system is described by three definitional areas: • USB interconnect • USB devices • USB host USB interconnect The USB interconnect is the manner in which USB devices are connected to and communicate with the host. USB Ho…...
prbs测试
PRBS是 Pseudo Random Binary Sequence 的简称,是一种伪随机序列,用于产生随机数据。 PRBS检测主要应用在设备开局或维护期间,在没有合适误码仪的情况下,使能了PRBS检测功能的设备自行发送PRBS码流,PRBS码流通过被测试网络,经远端设备环回(远端设备需要配置环回),经过PR…...
计算机网络:数据链路层(VLAN)
今天又学到一个知识,加油! 目录 一、传统局域网的局限(促进VLAN的诞生) 二、VLAN简介 三、VLAN的实现 总结 一、传统局域网的局限(促进VLAN的诞生) 缺乏流量隔离:即使把组流量局域化道一个单一交换机中…...
C# WPF上位机开发(动态添加控件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 写图形界面软件的时候,我们经常会遇到一种情况。那就是图形界面上面,显示的控件可能是不定的。有可能多,也有可…...
MySQL进阶|MySQL中的事务(一)
文章目录 数据库事务MySQL中的存储引擎InnoDB存储引擎架构什么是事务事务的状态总结 数据库事务 MySQL 事务主要用于处理操作量大,复杂度高的数据。比方我想要删除一个用户(销户)以及这个用户的个人信息、订单信息以及其他信息,这…...
设计模式策略模式讲解和代码示例
引言 策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换。 原始对象被称为上下文, 它包含指向策略对象的引用并将执行行为的任务分派给策略对象。 为了改变上下文完成其工作的方式, 其他对象可以使用另一个对象来替换当前链接的策…...
Qt容器QStackedWidget小部件堆栈
# QStackedWidget QStackedWidget是Qt框架中的一个控件,用于在同一区域显示多个子控件,只有一个子控件可见。以下是一些常用的QStackedWidget函数: addWidget(QWidget *widget):向QStackedWidget中添加一个子控件。 insertWidget(int index, QWidget *widget):在指定位置…...
设计模式 简单工厂 工厂方法模式 抽象工厂模式 Spring 工厂 BeanFactory 解析
工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。它是创建型模式。 简单工厂 简单工厂模式是指由一个工厂对象决定创建出哪一种产品类的实例, 但它不属于GOF 23种设计模式 简单工厂适用于工厂类负责创建的对象较少的场景,…...
【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数
1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数(1)substring 截取字符串(2)replace 替换(3)regexp_replace 正则替换(4)regexp 正则匹配(5ÿ…...
RabbitMQ手动应答与持久化
1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…...
java使用枚举类型解决if-else大量堆积
调用代码 import com.example.javaone.kk.MyEnum;public class Gst {public static void main(String[] args) {MyEnum eMyEnum.getById(1);System.out.println(e.getGetSize());} }被调用代码 package com.example.javaone.kk; public enum MyEnum {ENUM1(1,2),ENUM2(2,3),E…...
【数据结构】八大排序之直接插入排序算法
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.直接插入排序简介及思路 直接插入排序(Straight Insertion Sort)是一种简单直观的插入排序算法. 它的基本操作是: 将一个数据插入到已经排好的有序表中,从而得到一个新的,数…...
网络编程『socket套接字 ‖ 简易UDP网络程序』
🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌤️前言🌦️正文1.预备知识1.1.IP地址1.2.端口号1.3.端口号与进…...
FreeSWITCH rtp endpoint recvonly
查了下rtp.c的源码,远端端口为0就意味着recvonly,但其实不然,调用switch_rtp_new会马上返回失败 经过反复测试,增加下面几行代码之后终于变成了recvonly: tech_pvt->mode RTP_RECVONLY; rtp_flags[SWITCH_RTP_FLAG_AUTOADJ];…...
Hadoop和Spark的区别
Hadoop 表达能力有限。磁盘IO开销大,延迟度高。任务和任务之间的衔接涉及IO开销。前一个任务完成之前其他任务无法完成,难以胜任复杂、多阶段的计算任务。 Spark Spark模型是对Mapreduce模型的改进,可以说没有HDFS、Mapreduce就没有Spark。…...
英文论文降重修改技巧 papergpt
大家好,今天来聊聊英文论文降重修改技巧,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 英文论文降重修改技巧 作为网站编辑,我们经常需要处理大量…...
DevOps搭建(十)-安装Harbor镜像仓库详细步骤
1、下载Harbor 官方地址: https://goharbor.io/ 下载地址: https://github.com/goharbor/harbor/tags 选择文档版本进行下载,这里我们选择v2.7.2版本 2、上传到服务器并解压 上传压缩包到服务器后,解压到/usr/local目录下&a…...
DDA 算法
CAD 算法是计算机辅助设计的算法,几何算法是解决几何问题的算法 CAD 算法是指在计算机辅助设计软件中使用的算法,用于实现各种设计和绘图功能,CAD 广泛应用于建筑、机械、电子等领域,可以大大提高设计效率和精度 绘图算法是 CAD…...
无锡做公司网站多少钱/百度竞价推广专员
问题 本地安装了remix-ide,并运行成功后,发现访问目标页面却无法正常工作 解决办法 在localhost:8088/后面加一个index,即访问localhost:8088/index (注意修改成你的端口) 然后就可以正常工作了...
外贸建站代理/网站流量统计分析工具
转载自【脚本之家】,原文链接:http://www.jb51.net/article/42864.htm提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的…...
余姚做网站62752762/关键词优化方法
1.1 快速部署方案 问题:当领导给你 100 台已经安装好系统的服务器,然后让优化,让你提出一个快速部署方案。 解答: 1.tar 打包 先编译安装 打包--》分发--》解包(比如 mysql 打包后直接就可以使用 2.SaltStack,puppet&…...
光谷做网站推广/万网官网
前言 磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高…...
网站建设拍金手指排名贰拾/游戏特效培训机构排名
1.面对对象程序开发 1.1类的定义 # 1. class MyClass:pass# 2.推荐 class MyClass():pass# 3. class MyClass(object):pass1.2类的实例化 class MyClass():pass# 类的实例化,实例化对象 obj MyClass() # obj 就是一个对象 1.3 类的基本结构 只有成员和成员属性 class MyClass(…...
农业公园网站建设/网站的营销推广方案
异常处理模块是大型系统必备的一个组件,精心设计的异常处理模块可提高系统的健壮性。下面从我理解的角度,谈谈异常处理的方方面面。我的设计仅仅限定于Windows Forms,供参考。 1 定义异常类型 .NET 框架定义很多异常类型,ERP系统中…...