FFmpeg研究

news2024/11/16 9:38:48

1.FFmpeg介绍

FFmpeg的全称是“Fast Forward Moving Picture Expert Group”,组件由命令行应用程序和函数库两部分组成。通俗概括来说,FFmpeg 是一个免费的开源程序库,一个多媒体音视频处理分析工具软件,且提供命令行方式调用,专门用来编辑处理各种音视频或图像。它的源码是由 C 语言编写的,基于 Linux 系统中开发,不过在其它操作系统中都可以运行,跨平台性良好。

在这里插入图片描述A complete, cross-platform solution to record, convert and stream audio and video !

  • ffmpeg :功能强大的处理音视频文件的软件,可以实现音视频的录制、转码、剪辑、合成等功能。

  • ffplay:FFmpeg自带的播放器工具,基于 SDL 与 ffmpeg 库实现,提供了音视频显示和播放相关的图像信息和音频波形信息等,可以播放本地文件或者网络流媒体。

  • ffprobe:FFmpeg自带的多媒体信息检测工具,可以获取多媒体文件的音频视频容器参数的详细信息,如分辨率、编码格式、时长等。

2. FFmpeg 转码与转封装

FFmpeg 通过以下步骤实现输出转码转封装:
在这里插入图片描述

  1. 解封装(Demuxing):在解封装阶段,FFmpeg 会读取输入文件的容器格式(例如 MP4、AVI、FLV 等),解析其中的音视频流数据和元数据信息。它会提取出音频流和视频流,并将它们拆分成独立的音频和视频数据。

  2. 解码(Decoding):解码阶段是将音频和视频数据从原始的压缩格式(如 H.264、AAC 等)解码为未压缩的原始数据。FFmpeg使用适当的解码器来解析压缩的音频和视频数据,并将其还原为原始的音频样本和视频帧。

  3. 编码(Encoding):在编码阶段,FFmpeg 使用选定的编码器将已解码的音频和视频数据重新编码为新的压缩格式。编码器将原始数据压缩并应用所选的编码算法,以减小文件大小并保持一定的图像质量和音频保真度。

  4. 封装(Muxing):在封装阶段,FFmpeg 将重新编码的音频和视频数据合并到指定的输出容器格式中,生成最终的转码文件。输出容器格式可以是各种常见格式,如 MP4、AVI、MKV 等。封装过程还会添加必要的元数据(例如文件标签、时间戳等)以及其他附加信息。

这四个过程通常是连续进行的,每个阶段的输出将作为下一个阶段的输入。这其中需要经过6个步骤:读取输入内容、音视频解封装、解码每一帧音视频数据、编码每一帧音视频数据、音视频重新封装、输出到目标。

在这里插入图片描述
FFmpeg 提供了一系列命令行选项和库函数来实现这些过程,并允许用户根据需求自定义设置参数,以满足不同的转码需求。一般我们用 FFmpeg 是以“输入→处理→输出”的流程来理解并书写命令行的。

3.常用命令

#查看FFmpeg支持的编码器
ffmpeg configure -encoders

#查看FFmpeg支持的解码器
ffmpeg configure -decoders

#查看FFmpeg支持的通信协议
ffmpeg configure -protocols

#查看FFmpeg所支持的音视频编码格式、文件封装格式与流媒体传输协议
ffmpeg configure --help

#播放视频
ffplay input.mp4

#播放完自动退出
ffplay -autoexit input.mp4

#设置视频的屏幕高宽比
ffmpeg -i input.mp4 -aspect 16:9 output.mp4 

#编码格式转换

#MPEG4编码转成H264编码
ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4

#H264编码转成MPEG4编码
ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4

4.视频压缩

ffmpeg -i 2020.mp4 -vcodec h264 -vf scale=640:-2 -threads 4 2020_conv.mp4

ffmpeg -i 1579251906.mp4 -strict -2 -vcodec h264 1579251906_output.mp4

#参数解释:
-i 2020.mp4 #输入文件,源文件

2020_conv.mp4 #输出文件,目标文件

-vf scale=640:-2  
#改变视频分辨率,缩放到640px宽,高度的-2是考虑到libx264要求高度是偶数,所以设置成-2,让软件自动计算得出一个接近等比例的偶数高

-threads 4 #4核运算

其他参数:

  • -s 1280x720
    设置输出文件的分辨率,w*h。

  • -b:v
    输出文件的码率,一般500k左右即可,人眼看不到明显的闪烁,这个是与视频大小最直接相关的。

  • -preset
    指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
    与 veryslow相比,placebo以极高的编码时间为代价,只换取了大概1%的视频质量提升。这是一种收益递减准则:slow 与 medium相比提升了5%~10%;slower 与 slow相比提升了5%;veryslow 与 slower相比提升了3%。
    针对特定类型的源内容(比如电影、动画等),还可以使用-tune参数进行特别的优化。

  • -an
    去除音频流。

  • -vn
    去除视频流。

  • -c:a
    指定音频编码器。

  • -c:v
    指定视频编码器,libx264,libx265,H.262,H.264,H.265。
    libx264:最流行的开源 H.264 编码器。
    NVENC:基于 NVIDIA GPU 的 H.264 编码器。
    libx265:开源的 HEVC 编码器。
    libvpx:谷歌的 VP8 和 VP9 编码器。
    libaom:AV1 编码器。

  • -vcodec copy
    表示不重新编码,在格式未改变的情况采用。

  • -re
    以源文件固有帧率发送数据。

  • -minrate 964K -maxrate 3856K -bufsize 2000K
    指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

  • -y
    不经过确认,输出时直接覆盖同名文件。

  • -crf
    参数来控制转码,取值范围为 051,其中0为无损模式,1828是一个合理的范围,数值越大,画质越差。

5.视频拼接

#将4个视频拼接成一个很长的视频(无声音)
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][1:0] [2:0][3:0] concat=n=4:v=1 [v]' -map '[v]' output.mp4

#将4个视频拼接成一个很长的视频(有声音)
ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]’  output.mp4

#参数解释:
[0:0][0:1] [1:0][1:1] [2:0][2:1] 
分别表示第1个输入文件的视频、音频,第2个输入文件的视频、音频,第3个输入文件的视频、音频。

concat=n=3:v=1:a=1 
表示有3个输入文件,输出一条视频流和一条音频流。

[v][a] 
得到的视频流和音频流的名字,注意在 bash 等 shell 中需要用引号,防止通配符扩展。
#横向拼接2个视频
ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4

参数解释:
pad
将合成的视频宽高,这里iw代表第1个视频的宽,iw*2代表合成后的视频宽度加倍,ih为第1个视频的高,合成的两个视频最好分辨率一致。

overlay
覆盖,[a][1:v]overlay=w,后面代表是覆盖位置w:0。
#竖向拼接2个视频
ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4

#横向拼接3个视频
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out_v3.mp4

#竖向拼接3个视频
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out_v4.mp4

#4个视频2x2方式排列
ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4

参考文章:
https://zhuanlan.zhihu.com/p/684158932
https://blog.csdn.net/m0_37605642/article/details/121566820

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

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

相关文章

Linux(1)--VMware的安装与配置

Linux Linux是一种自由和开放源码的类Unix操作系统,由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布。Linux以其高效性、灵活性和稳定性而闻名,广泛应用于各种计算机硬件设备中,包括手机、平板电脑、路由器、视频游戏…

【Win10】记一次蓝屏修复

最近电脑蓝屏了好多次,错误代码为:IRQL_NOT_LESS_OR_EQUAL 直接搜这个错误代码不太好找原因,于是按照这篇文章[1]来打开错误日志文件。 需要先在windows的应用商店中下载WinDbg 然后,打开目录 C:\Windows\Minidump ,…

React 学习——组件内通信(兄弟之间)

A组件 > B组件 核心思路&#xff1a; 1、A组件先通过子传父的方式把数据传给父组件App 2、App拿到数据后通过父传子的方式再传递给B组件 import { useState } from "react" function A({onGetMsg}){const AMsg 我是A组件的消息return (<div><button…

如何实现全国产业园数量扩展,小编带你共同探讨树莓集团产业园运营模式

在当前快速发展的经济环境中&#xff0c;产业园区作为促进经济发展和技术创新的重要平台&#xff0c;扮演着越来越重要的角色。通过精心策划的战略布局与科学严谨的发展规划&#xff0c;树莓集团依托持续的创新驱动与科技引领&#xff0c;成功实现了全国产业园数量的显著扩展与…

【HTML入门】第二十课 - 【实战】做一个侧边栏菜单

这一小节&#xff0c;我们还是继续练习纯HTML标签的内容&#xff0c;多练一些&#xff0c;把HTML标签练熟。这就像练武功前的扎马步和一些基本功&#xff0c;功底越深&#xff0c;后边才能练更高深的武功。 这一小节&#xff0c;我们用纯HTML标签做一个侧边栏菜单的功能。就像这…

仿写讯飞AI生成PPT大纲组件

效果 别的不说先上效果 难点 树的实现 &#xff1a;需要递归自身&#xff0c;有丶难度。但是对于各位应该是有手就彳亍。双亲节点样式 &#xff1a;可以观察到双亲节点在连接线左侧是有内容的&#xff0c;叶子节点则没有。连接线&#xff1a;可以观察到双亲节点是实心圆点&a…

华为交换机Telnet配置

华为交换机Telnet配置 一、Telnet概述与作用 1、Telnet简介 Telnet&#xff08;Telnet协议&#xff09;是一种用于远程登录到计算机或网络设备的协议。它允许用户在本地计算机上通过网络连接到远程计算机或设备&#xff0c;并在远程计算机上执行命令和操作。Telnet协议最初是…

SpringCloudAliababa中使用最新版的Seata实现分布式事务

SpringCloud中使用Seata实现分布式事务 Hello&#xff0c;兄弟们好&#xff0c;我是Feri&#xff0c;最近整理了最新的基于Seata-Server2.0实现分布式事务的demo&#xff0c;希望对你有所帮助&#xff0c;有任何问题&#xff0c;可以随时沟通交流&#xff0c;在成为技术大牛的路…

如何处理selenium Webdriver中的文本框?

文本框或字段在整个网页中广泛使用,本文将介绍如何在Java中使用Selenium Webdriver处理文本框。可以有各种文本字段,我们将尝试包括其中的大多数,并执行各种操作,如清除和输入文本。 我们将使用我们的Selenium游乐场网站- testkru,与各种文本框进行交互。您也可以使用同一…

昇思25天学习打卡营第27天|munger85

Vision Transformer图像分类 Vit是最新的用了transformer架构的图像模型&#xff0c;在很多比赛都获得了大奖&#xff0c;是非常优秀的架构。而且据说cnn其实只是vit的一个子集&#xff0c;cnn的卷积其实就是vit在很小的范围做了注意力机制。非常有意思 整个架构就好像这样 图…

七天打造一套量化交易系统:Day6-人工智能在量化投资中的应用

七天打造一套量化交易系统&#xff1a;Day6-人工智能在量化投资中的应用 步骤一&#xff1a;数据获取步骤二&#xff1a;对股票样本进行初步处理步骤三&#xff1a;遗传算法选股遗传算 kmeans 类的主要代码 步骤四&#xff1a;回测结果 遗传算法是一种基础的人工智能算法&#…

springboot惠农服务平台-计算机毕业设计源码50601

目录 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 惠农服务平台app 系统分析 2.1 可行性分析 2.2 系统功能分析 2.3 系统用例分析 2.4 系统流程分析 2.5本章小结 3 惠农服务平台app 总体设计 3.1 系统功能模块设计 3.2 数据库设计 表access_token (…

成品库存周转率报表(一)

文章目录 成品库存周转率报表(一)每日库存结存到表单《历史库存信息》报表逻辑报表设计过滤框简单账表界面存储过程,根据传入条件获取并计算返回数据报表服务插件简单账表绑定数据源插件绑定权限,发布,授权即可访问成品库存周转率报表(一) 每日库存结存到表单《历史库存…

基于域名的虚拟主机,基于ip的域名主机,综合项目eleme

查看nginx配置文件 不看空行&#xff0c;不看注释&#xff0c;查找 [rootstaticserver ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf 把原有的文件备份 [rootstaticserver ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.…

虚拟化数据恢复—XenServer VPS不可用如何恢复数据?

虚拟化数据恢复环境&#xff1a; 某品牌R720服务器&#xff0c;4块STAT硬盘通过H710P阵列卡组建了一组raid10磁盘阵列。服务器上部署XenServer虚拟化平台&#xff0c;虚拟机安装Windows Server系统&#xff0c;作为Web服务器使用&#xff0c;运行SQL Server数据库。共有2个虚拟…

智能巡航,守护蓝天绿水:无人机视频技术如何高效监督非法排污行为

随着工业化进程的加速和环境保护意识的日益增强&#xff0c;非法排污行为成为了威胁生态环境、影响公众健康的重大问题。传统的排污监测手段往往受限于人力成本、覆盖范围及效率等因素&#xff0c;难以实现对广袤区域和隐蔽排污点的有效监控。而无人机技术的飞速发展&#xff0…

【网络协议】HTTP协议详解

文章目录 一、概念 二、简史 三、特点 四、工作流程 五、使用Wireshark抓TCP、http包 六、头域 6.1、请求信息&#xff1a; 6.2、请求方法 6.3、响应消息 6.4、响应头域 6.5、HTTP常见的请求头 6.6、HTTP常见的响应头 七、解决HTTP无状态的问题 7.1、通过Cookies保存状态信息 7…

软件性能测试内容和方法揭秘,专业第三方软件测试公司推荐

在数字经济迅猛发展的背景下&#xff0c;软件的性能已经成为企业竞争力的重要一环。性能测试&#xff0c;作为软件测试的一个重要组成部分&#xff0c;主要用于评估应用程序在特定负载下的表现。这不仅包括响应时间、吞吐量、资源使用率等指标&#xff0c;还涉及系统在不同条件…

Stable Diffusion教程|快速入门SD绘画原理与安装

什么是Stable Diffusion&#xff0c;什么是炼丹师&#xff1f;根据市场研究机构预测&#xff0c;到2025年全球AI绘画市场规模将达到100亿美元&#xff0c;其中Stable Diffusion&#xff08;简称SD&#xff09;作为一种先进的图像生成技术之一&#xff0c;市场份额也在不断增长&…

前端-05-VSCode自定义代码片段console.log(js/ts配置)、代码段快捷提示放在首位

目录 配置VSCode自定义代码片段console.log()log代码段快捷提示放在首位 配置VSCode自定义代码片段console.log() 点击VSCode左下角设置图标&#xff0c;点击用户代码片段 点击用户代码片段后&#xff0c;VSCode上方出现弹窗如下图&#xff08;没有显示这两个文件的话搜索一下…