3、FFmpeg基础

news2024/11/29 3:41:37
1、FFmpeg 介绍
   FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。
2、FFmpeg 组成
   - libavformat:用于各种音视频[封装格式]封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
    libavcodec:用于各种类型声音/图像编解码;
    libavutil:包含一些公共的工具函数;
    libswscale:用于视频场景比例缩放、色彩映射转换;
    libswresample - 提供音频重采样,采样格式转换和混合等功能。
    libavfilter - 各种音视频滤波器。
    libpostproc - 用于后期效果处理,如图像的去块效应等。
    libavdevice - 用于硬件的音视频采集、加速和显示。
    libpostproc:用于后期效果处理;
    ffmpeg:该项目提供的一个工具,可用于格式转换、解码或[电视卡]即时编码等;
    ffsever:一个 HTTP 多媒体即时广播串流服务器;
    ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;
3、FFmpeg 常用知识
    1.封装格式
       MPEG-4,其中 MPEG-1 和 MPEG-2 是采用相同原理为基础的预测编码、变换编码、 熵编码及运动补偿等第一代数据压缩编码技术;
MPEG-4(ISO/IEC 14496)则是基于第二代压缩编码技术制定的国际标准,它以视听媒体对象为基本单元,采用基于内容的压缩编码,实现数字视音频、图形合成应用及交互式多媒体的集成。 MPEG 系列标准对 VCD、 DVD 等视听消费电子及数字电视和高清晰度电视    (DTV&&HDTV)、 多媒体通信等信息产业的发展产生了巨大而深远的影响.
       AVI,音频视频交错(Audio Video Interleaved)的英文缩写。 AVI 格式调用方便、图像质量好,压缩标准可任意选择,是应用最广泛、也是应用时间最长的格式之一。
        FLV , FLASH VIDEO 的简称, FLV 流媒体格式是一种新的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入 Flash 后,使导出的 SWF 文件体积庞大,不能在网络上很好的使用等缺点。
    2.编码格式
       视频部分 h264、wmv、xvid、mjpeg(摄像头出来的每一帧都是mjpeg,缺点在于只有I帧、没有B帧、P帧)
       音频部分 acc、MP3、ape、flac
    3.文件封装格式和编码格式
   
       音频帧和视频帧的帧率是不一致的,比如音频帧采样率是44.1khz,声音必须的源源不断输出,所以音频帧率可能为22.05帧,每个帧里存了2K采样数据.
    视频解码
  • 软件解码:即通过软件让CPU来对视频进行解码处理,缺点耗电发热,优点兼容强
  • 硬件解码:是将原来全部交由CPU(显卡上的一个核心处理芯片,处理计算机中与图形计算有关的工作)来处理的视频数据的部分交由GPU来做,优点不需要太好的CPU,发热低,缺点起步较晚,无法与软解相提并论,兼容性不强.硬解码都是固定帧率.比如只能60帧.
    音频解码
  • 将音频码流(aac、ape等)解码成pcm
   4.像素格式
    压缩编码中一般使用的是RGB24,YUV420 , YUV420P, YUV422P, YUV444P等格式数据,最常见的是YUV420P.
    RGB格式
    BMP文件存储的就是RGB格式像素数据
    yuv格式
        y表示明亮度,而u(Cb 蓝色色差值)和v(Cr 红色色差值)则表示色度值.它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,由于UV色度不是很明显看出,所以除了YUV4:4:4外,又诞生了YUV4:2:2,YUV4:2:0格式.从而占用极少的存储数据.
        如下图所示,黑点表示该像素点的Y分量,以空心圆圈表示像素点的UV分量:
        
  • YUV444:每一个Y对应一组UV分量,单位为字节,所以每个像素点有1个Y字节和1组(2字节,分别是U和V),所以为3字节.
  • YUV422:每两个Y共用一组UV分量,所以每个每个像素点有1个Y字节和1/2组UV(1字节),所以为2字节.
  • YUV420:每四个Y共用一组UV分量,所以4个像素点为6字节(4个Y、1个U、1个V),所以每2个像素点共用3字节,每个像素点为1.5字节(12bit).
    YUV420、YUV420P、YUV420SP区别
  • 对于YUV420格式(packed封装),每个像素点的Y,U,V是连续交*存储的。所以存储数据时,data[0]中就存的是yuvyuvyuv...
  • 对于YUV420P格式(planar平面封装),先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,比如:YYYYYYYY UU VV,所以Ffmpeg中存储P格式数据时,data[0]数组存y,data[1]数组存u,data[2]数组存v
  • 对于YUV420SP格式(semi Planar半平面封装),先连续存储所有像素点的Y,然后连续存储UV,比如:YYYYYYYY UVUV
    5.YUV和RGB转换格式
    RGB 转换成 YUV
  • Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
  • Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
  • Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
    YUV 转换成 RGB
  • B = 1.164(Y - 16) + 2.018(U - 128)
  • G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
  • R = 1.164(Y - 16) + 1.596(V - 128)
    RGB取值范围均为0~255,Y=0~255,U=-122~+122,V=-157~+157
    以下是经过简化的公式,运算量比上述公式要小一些。
    RGB转YUV
  • Y = 0.299R + 0.587G + 0.114B
  • U'= (BY)*0.565
  • V'= (RY)*0.713
    YUV转RGB
  • R = Y + 1.4075 * (V-128);
  • G = Y - 0.3455 * (U-128) - 0.7169*(V-128);
  • B = Y + 1.779 * (U-128);
    PS:除了软解之外,则还可以交给GPU进行硬解.
    6.DTS、PTS、GOP
  • dts : 解码时间戳
  • pts : 显示时间戳
  • GOP : 一组完整的IBP帧画面
    而dts和pts值是不一定是相等的,如下图GOP(Group of Picture)所示:
    
    从上图,可以看到,DTS和PTS的顺序是不一致的,并且每组GOP中开头都是I帧,然后后面都是B、P帧,如果开头的I帧图像质量比较差时,也会影响到一个GOP中后续B、P帧的图像质量.
  • I帧(intra picture) : 帧内编码帧,它将全帧图像信息进行 JPEG 压缩编码及传输,是一个完整图像
  • B帧(bidirectional) : 双向预测内插编码帧,参考前面和后面两帧的数据加上本帧的变化而得出的本帧数据
  • P帧 : 前向预测编码帧,参考前面而得出的本帧数据.
    一般平均来说, I 的压缩率是 7(跟 JPG 差不多), P 是 20, B 可以达到 50.
    在ffmpeg中,pts和dts单位都是不确定,如果要换算为时分秒,则需要AVStream的time_base时基来一起换算出当前显示的标准时间
而time_base结构体为AVRational:
/**
* Rational number (pair of numerator and denominator).
*/
typedef struct AVRational{
    int num; ///< Numerator
    int den; ///< Denominator
} AVRational;
所以计算时分秒为:
if (frame->pts != AV_NOPTS_VALUE)    
   dpts = av_q2d(is->video_st->time_base) * frame->pts;
FFmpeg解码流程
av_register_all0:注册所有组件
avformat_open_input(): 打开输入视频文件
avformat_find_stream_info():获取视频文件信息
avcodec_find_decoder (): 查找解码器
avcodec_open2():打开解码器
av_read_frame():从输入文件读取一压缩数据
avcodec_decode_video20: 解码一压缩数据
avcodec_close():关闭解码器
avformat_close_input 0:关闭输入视频文件
视频播放原理
从**解复用器(Media Extractor、AVFormatContetext->stream)**开始,会有两个线程分别负责解析音频和视频。
视频录制原理
音频:PCM->ACC数据,视频:YUV->H264,音视频封装:FLV / MP4。

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

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

相关文章

java项目之电子资源管理系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的电子资源管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; &#xff08;1&#xff09;在个…

Redis系列-Redis性能优化与安全【9】

目录 Redis系列-Redis性能优化与安全【9】Redis性能优化策略Redis安全设置与防护措施Redis监控与诊断工具介绍 七、Redis应用案例与实战八、Redis未来发展与趋势 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; Redis系列-Redis性能优化与安…

Milvus Cloud——什么是 Agent?

什么是 Agent? 根据 OpenAI 科学家 Lilian Weng 的一张 Agent 示意图 [1] 我们可以了解 Agent 由一些组件来组成。 规划模块 子目标分解:Agent 将目标分为更小的、易于管理的子目标,从而更高效地处理复杂的任务。 反省和调整:Agent 可以对过去的行为进行自我批评和自我反思…

【Linux】 awk命令使用

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法 awk [选项] [文件] awk [选项] [程序] [文件] awk命令 -Linux手…

磁盘空间占用巨大的meta.db-wal文件缓存(tracker-miner-fs索引服务)彻底清除办法

磁盘命令参考本博客linux磁盘空间满了怎么办. 问题: 磁盘空间被盗 今天瞄了一下我的Ubuntu系统盘&#xff0c; nftdiggernftdigger-Ubuntu:~$ df -h 文件系统 容量 已用 可用 已用% 挂载点 udev 16G 0 16G 0% /dev tmpfs 3.2G 1.9…

3.5米分辨率地表温度图像——商业热红外遥感卫星HotSat-1第一批数据发布

最近几年上百颗的光学和雷达商业遥感卫星发射升空&#xff0c;空间分辨率更高&#xff0c;性能更强&#xff0c;竞争也越来越激烈。除了光学和雷达遥感卫星之外&#xff0c;也出现了不少多样化传感器的商业遥感卫星&#xff0c;高光谱、热红外、无线电掩星等。不同的传感器获取…

关于 DC电源模块的体积与功率达到平衡的关系

关于BOSHIDA DC电源模块的体积与功率达到平衡的关系 DC电源模块是一种将交流电转换为直流电的装置。它是许多电子设备中非常重要的部分&#xff0c;尤其是电子产品的便携性和用电时间方面&#xff0c;一直是DC电源模块必须考虑的因素。因此&#xff0c;电源模块的体积和功率之…

CAN2无法通信问题

文章目录 一、CAN2通信要注意的问题二、CAN中断无法进入的问题 一、CAN2通信要注意的问题 从这张图片不难看出can1为主机&#xff0c;can2为从机。因此can2的启动前提是已经启动了can1. can通讯can2是基于can1的 使用can2之前必须初始化can1 单独使用CAN2时一定要同时打开CAN1和…

数据采集代码示例

首先&#xff0c;你需要安装一个 Lua 的爬虫库&#xff0c;例如 Luanode 或者 Lush&#xff1a; lua local ltn12 require("ltn12") local http require("") local response http.request{ host "", port , path "/", …

MySQL 5.7停服你的数据库还没迁移怎么破?

10月底&#xff0c;MySQL5.7版本正式终止生命周期状态&#xff0c;即EOL&#xff08;End of Life&#xff09;&#xff0c;也就是俗称的“停服”&#xff0c;意味着该版本的用户将不能再获得新的安全补丁、版本迭代升级、维护和支持服务&#xff0c;众多使用MySQL 5.7的各个行业…

linux gdb 调试 常见调试命令介绍+总结

1.调试前准备 -g gcc arcg.c -g -oO -o app //必须添加-g 2.调试 gdb gdb app 3.常见调试命令 set args 1 2 3 4 5 6 //设置参数 show args //查看参数 3.1执行程序 1.start2. run gdb app set args 1 2 3 4 5 start //执行一行 c //继续执行 q…

了解千兆光模块和万兆光模块的标准规范

千兆光模块和万兆光模块作为数据中心和网络领域的关键设备&#xff0c;光模块生产需要遵循一些标准规范&#xff0c;为光模块的设计、制造和应用提供统一的规则和指导&#xff0c;确保光模块在各种设备和网络环境中能够正常工作&#xff0c;并满足用户的需求和期望&#xff0c;…

双十一全光谱灯哪个牌子好?双十一必备护眼台灯推荐

护眼台灯近些年来很受欢迎&#xff0c;它采用专业的技术能够帮助调节环境光的变化。尤其是在光线变化复杂的情况下&#xff0c;能够通过智能调光来改善环境&#xff0c;可以减少许多学生党上班族的近视风险&#xff0c;成为了许多学生党打工人的必备照明工具之一。不过随着它的…

移除元素(双指针)

27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改…

如何准备软考-软件设计师(上)

前言&#xff1a; 参加了2023年下半年的软考-软件设计师的考试&#xff0c;之所以参加这个考试&#xff0c;主要出于以下几个目的&#xff1a; 1.减税。虽然只有1500的额度&#xff0c;但是考虑到税率&#xff0c;其实也不少&#xff0c;而且也没有更好的省钱途径。 2.学习。…

Unit2_2:动态规划DP

文章目录 一、最长公共子序列分析填表伪代码过程时间复杂度 二、最长公共子串问题分析过程时间复杂度 最小编辑距离背景分析状态转移方程填表伪代码案例 一、最长公共子序列 子序列&#xff1a;指从原序列中选取出来的具有相对顺序的一组元素&#xff0c;而这些元素不一定是连…

内衣洗衣机和手洗哪个干净?家用小型洗衣机推荐

在最近的几年来&#xff0c;人们对生活和健康的追求越来越高&#xff0c;使得越来越多的内衣洗衣机也走进了我们日常生活的视线&#xff0c;许多研究显示&#xff0c;单纯只是手洗是不能彻底消除我们贴身衣物上的细菌&#xff0c;而机洗则可以有效地消除大部分的细菌&#xff0…

毫米波雷达技术在自动驾驶中的关键作用:安全、精准、无可替代

自动驾驶技术正以前所未有的速度不断演进&#xff0c;而其中的关键之一就是毫米波雷达技术。作为自动驾驶系统中的核心感知器件之一&#xff0c;毫米波雷达在保障车辆安全、实现精准定位和应对复杂环境中发挥着不可替代的作用。本文将深入探讨毫米波雷达技术在自动驾驶中的关键…

报错 documentation/kbuild: is a directory. stop(Windows 内置Linux子系统WSL编译Linux内核)

目录 背景 苦苦求索 解决方案 背景 Windows 10的内置子系统Linux 编译SDK,在clean 时出现的报错. 苦苦求索 网上很多说是文件名有空格, 这确实会导致这个问题. 所以要先排除目录,文件名没有空格的情况. 找到名字有空格的文件 find ./ -name "* *"若是没有输出…

Ubuntu安装步骤

点击文件 --> 新建虚拟机&#xff1a; 找到第一章下载的ubuntu镜像文件&#xff0c;然后下一步 自定义名称和位置&#xff0c;然后下一步 根据需要定内存&#xff0c;2G以上即可&#xff1a; 单个文件即可 点击完成 回车&#xff0c;然后等待安装 回车 回车 回车 按上下键找…