FFmpeg视频解码中的YUV420P格式

ffmpeg学习八:软件生成yuv420p视频并将其编码为H264格式 通过前面对ffmpeg中常用的几个api的源码分析,从而对api有了更好的理解。之前已经做过视频的解码了,今天来尝试视频的编码。ffmpeg已经给我们提供了相应的可供参考的程序:doc/examples/decoding_encoding.c文件就是解码和编码的例程。仔细阅读它的代码后,我们可以按照自己的理解,写自己的视频编码程序。我们将会把一个yuv420p格式的文件,使用h264编码器进行编码。 阅读详情
AI摘要

本文详细介绍了YUV和RGB两种颜色编码方法的区别及其在视频处理中的应用。包括这两种颜色空间的发展历史、在视频领域的优势、不同采样方式的对比以及在FFmpeg中的具体实现。

参考文章

在做基于FFmpeg解码的视频播放时,需要涉及到帧数据存储的YUV与RGB格式,所以了解了一下,参考下述博文。
https://blog.youkuaiyun.com/lanxiaziyi/article/details/74139729#avframe-%E4%B8%8E-yuv420%E9%82%A3%E4%BA%9B%E4%BA%8B

发展史

  1. 视网膜存在三种视锥细胞,分别含有对红、绿、蓝三种光线敏感的视色素,当一定波长的光线作用于视网膜时,以一定的比例使三种视锥细胞分别产生不同程度的兴奋,这样的信息传至中枢,就产生某一种颜色的感觉。
  2. 在彩色显示器发明之前,人类已经懂得使用三原色光调配出所有颜色的光。并不是说三原色混合后产生了新的频率的光,而是给人眼睛的感觉是这样。
  3. 在显示器发明之后,从黑白显示器发展到彩色显示器,人们开始使用发出不同颜色的光的荧光粉(CRT,等离子体显示器),或者不同颜色的滤色片(LCD),或者不同颜色的半导体发光器件(OLED和LED大型全彩显示牌)来形成色彩,无一例外的选择了Red,Green,Blue这3种颜色的发光体作为基本的发光单元。通过控制他们发光强度,组合出了人眼睛能够感受到的大多数的自然色彩。

RGB与YUV

  1. 先说说RGB,这个格式很直观。我们一眼就能明白它所表示的意义。
    RGB格式一般画面数据最终呈现的时候才会使用它。对于视频捕获和编解码等应用来讲,这样的表示方式数据量太大了。需要想办法在不太影响感觉的情况下,对原始数据的表示方法进行更改,减少数据量。只要最终能呈现的是RGB,我们中间使用什么格式都无所谓。 于是我们使用Y,Cb,Cr模型来表示颜色。
  2. 为什么电视行业用这个格式?
    YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。 与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV格式的优势

  1. 空间占用少。
    RGB24一帧的大小size=width×heigth×3 Byte
    RGB32一帧的大小size=width×heigth×4 Byte
    YUV420一帧的大小size=width×heigth×1.5 Byte
    (这是在内存中展开的大小)
  2. 如前所述,能与黑白电视机兼容。

不同格式采样方式

下面三个图表示不同格式的Y,U,V采样方式,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
c
1. YUV 4:4:4采样,每一个Y对应一组UV分量。
2. YUV 4:2:2采样,每两个Y共用一组UV分量。
3. YUV 4:2:0采样,每四个Y共用一组UV分量。

YUV存储方式

请参考如下文章:
http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

YUV和RGB间的转换

应用:模拟领域

Y’= 0.299*R’ + 0.587*G’ + 0.114*B’ 
U’= -0.147*R’ - 0.289*G’ + 0.436*B’ = 0.492*(B’- Y’) 
V’= 0.615*R’ - 0.515*G’ - 0.100*B’ = 0.877*(R’- Y’) 

R’ = Y’ + 1.140*V’ 
G’ = Y’ - 0.394*U’ - 0.581*V’ 
B’ = Y’ + 2.032*U’

YCbCr模型来源于YUV模型。YCbCr是 YUV 颜色空间的偏移版本.
应用:数字视频,ITU-R BT.601建议

Y’ = 0.257*R’ + 0.504*G’ + 0.098*B’ + 16 
Cb’ = -0.148*R’ - 0.291*G’ + 0.439*B’ + 128 
Cr’ = 0.439*R’ - 0.368*G’ - 0.071*B’ + 128 

R’ = 1.164*(Y’-16) + 1.596*(Cr’-128) 
G’ = 1.164*(Y’-16) - 0.813*(Cr’-128) - 0.392*(Cb’-128) 
B’ = 1.164*(Y’-16) + 2.017*(Cb’-128)

上面各个符号都带了一撇,表示该符号在原值基础上进行了伽马校正,伽马校正有助于弥补在抗锯齿的过程中,线性分配伽马值所带来的细节损失,使图像细节更加丰富。在没有采用伽马校正的情况下,暗部细节不容易显现出来,而采用了这一图像增强技术以后,图像的层次更加明晰了。 H264里面的YUV应属于YCbCr。

FFmpeg中的YUV格式

FFmpeg视频解码后,一般存储为AV_PIX_FMT_YUV420P 的format,而解码后的数据存储在结构体 AVFrame 中。YUV420P在内存中的排布如下:

YYYYYYYY UUUU VVVV

下面是我们编程时关心的重点,YUV420P在AVFrame中的存储形式,

planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)

即存储在结构体 AVFrame 的data[ ]数组中 ,
data[0]——-Y分量
data[1]——-U分量
data[2]——-V分量
linesize[]数组中保存的是对应通道的数据宽度 ,
linesize[0]——-Y分量的宽度
linesize[1]——-U分量的宽度
linesize[2]——-V分量的宽度
这里要特别注意,linesize[0]的值并不一定等于图片的宽度,有时候为了对齐各解码器的CPU,实际尺寸会大于图片的宽度,这点在我们编程时(比如OpengGL硬件转换/渲染)要特别注意,否则解码出来的图像会异常。

FFmpeg 4.3 H265十三:编码-将AVFrame转换成AVPacket。视频编码原理.编码相关api,H264特殊参数说明。将一个yuv420p文件编码成h264,代码是重点。VBR CBR 从前面的学习我们知道 AVFrame中是最原始的 视频数据,这一节开始我们需要将这个最原始的视频数据 压缩成 AVPacket数据,我们前面,将YUV数据或者 RGBA 数据装进入了 AVFrame里面,并且在SDL中显示。也就是说:对于安防项目来说,我们将原始从摄像头数据(YUV,RGB)转换成 AVFrame后,可以直接显示出来。但是如果我们将要数据存储,则要将 AVFrame转成 AVPacket. 阅读详情

相关推荐

ffmpeg H264转YUV420p

比较形象的说法就是把长长的一段连续的数据“切割”成一段段的数据。av_parser_parse2():解析获得一个Packet。av_parser_init(): 初始化AVCodecParserContext。使用的H264文件是D:/videos/264.dat(dat后缀名无所谓)方法二不需要查找流的信息,直接读取二进制文件,自己设置解码器ID。方法二:主要函数:av_parser_parse2()方法一:主要函数:av_read_frame()主要函数:av_read_frame()

yinshipin007的博客 680

FFmpeg4.3开发系列之15:同步录音录屏并存储或直播实战

敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。我将带领大家一起来学习:录音录屏、同步机制、存储、直播推流。具体内容包括:1.FFmpeg录音录屏讲解及命令行实战。2.FFmpeg录屏API实战讲解。3.FFmpeg录音API实战讲解。4.FFmpeg音视频同步API实战讲解。5.FFmpeg同步录音录屏并直播实战。 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。 

FFmpeg解码原理图解:从YUV到RGB的像素转换在Qt播放器中是如何实现的?

本文详细解析了FFmpeg解码原理,重点介绍了从YUV到RGB的像素转换在Qt播放器中的实现过程。通过图解和代码示例,深入探讨了`sws_scale()`函数的工作原理及Qt框架的`QImage`渲染机制,帮助开发者优化视频播放器的性能和画质。

weixin_26742753的博客 374

AV_PIX_FMT_YUV420P与AV_PIX_FMT_YUVJ420P

YUV420P YUVJ420P

lanxiaziyi的专栏 1万+

yuv420p

做编解码过程中最常见的视频格式是yuv420p 下面对yuv420p做一些介绍 420p中的p代表planar,也就是扁平的意思。所以这里引出yuv有两种布局方式,分别是lanar和packed。 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。 YUV,分为三个分量...

woai110120130的专栏 2210

FFMPEG:从H264到YUV格式的转换与本地解码实践指南

FFmpeg是一个非常强大的开源项目,它提供了一套可以直接进行视频和音频处理的命令行工具。FFmpeg最初是用于Linux系统,但目前它支持几乎所有的操作系统,包括Windows、MacOS等。FFmpeg可以解码、编码、转码、复用、解复用、流、过滤和播放几乎所有已知的视频和音频格式。H264编码技术是视频压缩领域的一个重要进展,它带来了更高效的压缩比和更高的视频质量。了解其历史发展和技术特点是理解该编码标准的关键。YUV和RGB是两种常见的颜色编码方式,它们在视频和图像处理领域被广泛使用。

weixin_29476595的博客 1274

视频编解码学习一 yuv格式

  今天说下视频解码基础知识   众所周知,我们日常看到的视频都有各种各样的视频格式,mp4,flv,rmvb,mkv,wmv。。。这些视频是根据什么区分的,为什么会有这么多视频格式。   首先说下视频压缩,视频都是一帧一帧的图片组成,他们都是通过容器封装成各种各样的格式。人眼的视觉残留特性导致人眼的分辨率不能超过30帧每秒,那么我们也就没有必要按照视频最初采集的大小进行存储,否则存储消耗实在是太大,比如1080p电影15分钟经过YUV4:2:0格式下的数据量为1920 x 1028 x 12 x 2...

奋斗Andy的博客 1742

FFmpeg 解码视频文件

FFmpeg 解码视频文件为YUV(YUV420P)文件

qq_42161913的博客 925

FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)

FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法。 swscale主要用于在2个AVFrame之间进行转换。 下面来看一个视频解码的简单例子,这个程序完成了对"北京移动开发者大会茶歇视频2.flv"(其实就是优酷上的一个普通视频)的解码工作,并将解码后的数据保存为原始数据文件(例如YUV420,YUV422,RGB24等等)。其中略去了很多的代码。 注:完整代码在文章:100

雷霄骅(leixiaohua1020)的专栏 12万+

[RK3399][Android7.1] 调试笔记 --- 编译GSL5680 touch提示错误

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 之前在rk3288平台上使用过GSL5680的Touch,现在移植过来一直报如下错误: make[1]: `include/generated/vdso-offsets.h' is up to date. CHK include/generated/compi...

Kris Fei's blog 1056

企业级智能知识库问答AI助手(大模型+Python)

智能知识问答库AI助手

usa_washington的博客 1655

FFmpeg4入门07:解码视频并保存为YUV格式文件

上一篇我们解码并保存了其中的几帧确保解码过程和结果是对的。本篇我们将解码整个视频并保存为标准的YUV格式(YUV格式具体信息详见YUV格式介绍),我们就选YUV420P(I420)作为输出格式。 保存文件需要对本地文件进行读写操作,那么首先要有文件操作指针,C为FILE,C++为iostream。 以C为例。 FILE *fp = fopen("result.yuv","w+b"); 扩展名任意,只要数据格式对就可以了,最好是把数据格式标识出来,比如:1280x720_yuv420p.yuv。 与上一篇文

qq_26056015的博客 2426

网络安全学习路线是怎样的?

为什么要学习安全? 近几年网络安全事件层出不穷,相信大家哪怕没遇到过,但也听过不少了吧。如服务器遭受入侵被黑,用户帐号被盗;被钓鱼、勒索病毒等,这些一旦发生,对企业而言都是不小的打击。因此,网络安全不容忽视,同时随着时代的不断发展,公司对于运维及网络工程师要求也越来越严格。未来越来越吃香的一定是技能方向广的复合型人才。网络安全可以说是一条非常好的发展道路。 今年两会期间,全国政协委员,360集团创始人、董事长周鸿祎提交了关于网络安全行业特殊人才的提案,为广大白帽子人员争取更好...

网安技术分享 8697

基于FFMPEG+Opencv的视频播放器(对h264进行解码)(注释清晰)

该代码参考了雷神的博客 [总结]FFMPEG视音频编解码零基础学习方法 #include <iostream> #include <highgui.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #define __STDC_CONSTANT_MACROS e

weixin_43306331的博客 2015

基于STM32与FPGA Cyclone IV的FSMC高速数据通信实战解析

本文详细解析了基于STM32的FSMC接口与FPGA Cyclone IV实现高速并行数据通信的实战方案。通过将FPGA模拟为SRAM设备,构建了MCU与FPGA之间的高速数据通道,并深入探讨了硬件连接、STM32软件配置、FPGA逻辑设计及性能优化等关键步骤,为图像处理、高速采集等需要大数据量交换的嵌入式应用提供了稳定高效的通信解决方案。

swift5iosmith的博客 294

Linux V3H 平台开发系列讲解(摄像头)2.3.1 MAX96912 MAX96717 GMSL1 CSI 2lane配置

​ 单路摄像头,数据流类型YUV422, mipi接口,经过MAX96717 串行器,gmsl1链路 到解串器MAX96712,最后mipi csi 2lane(lane0 lane1)输出到 renesa v3h soc开发板; ​

xian18809311584的博客 580

FFmpeg 调试必备技巧:如何验证视频解码是否正确?YUV + ffplay

介绍一个验证解码后的数据是否正确的方法

筏的博客 986

【数据集】ERA5(欧洲中期天气预报中心)再分析数据介绍及下载

简介EAR5数据集及下载步骤

WW、forever的博客 1万+

AVFrame存储YUV420P对齐分析

1、概述被这个问题困扰很久,由于懒癌晚期,一直都是云里雾里,最近终于把微信聊天记录里的视频分析了一下,记录于此已做备忘。2、分析过程用ffmpeg写了个解码程序,遍历微信聊天视频目录找出所有视频文件,一个600多个,挨个解码,并把其长宽,AVFrame.linesize[0],AVFrame.linesize[1],AVFrame.linesize[2]打印出来,做对比,终于发现一些规律。下面是打...

dancing_night的专栏 5912

maxim max96712+max96717调试笔记

mxxim max96712 和max96717调试笔记

libuping2023的博客 1万+

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 504

OpenCV YUV420P -> RGB JPEG 图像转换

通过FFMPEG 得到mov视频解码后的一个Frame,它是YUV420P的图像,我要把它转换成方便显示的JPEG图像。 代码片断如下所示 av_image_copy(_data, _linesize, (const uint8_t **)avframe->data, avframe->linesize, _pix_fmt, _width, _height); ... cv::...

Jang的博客 2778

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

美畅物联丨如何通过 FFmpeg 解码视频

实际上,在视频解码方面,FFmpeg同样提供了灵活且高效的解决方案,不管是将视频转换为可播放的格式,还是提取视频中的音频、图像等元素,都能够借助它得以实现。该对象涵盖了解码器所需的全部配置信息,包含视频的编码参数、像素格式、时间基准等,是解码工作的核心部分。例如,在调用某个目标检测算法的接口时,我们可以将转换后的BGR图像数据作为输入参数传递给算法库,从而进行后续的目标检测处理。通过以上步骤,我们便能轻松运用FFmpeg来进行视频解码,且把解码后的视频转化为适合算法处理的格式。

changlian24hlink的博客 821

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

利用av_parser_parser2函数,解码h264文件

1、解码 原始的图像数据是非常庞大的,本示例的视频20s,分辨率1280*720,原始的yuv420p数据大概在1.4G,如果是2个小时的电影、分辨率为1920*1080,原始的yuv数据可想而知会有多大,所以无论是音频还是视频数据都会经过编码,以降低多媒体mp4、mov等视频的容量。 利用av_parser_parser2解码,输入必须是只包含视频编码数据“裸流”(例如H.264、HEVC码流文件),而不能是包含封装格式的媒体数据(例如AVI、MKV、MP4)。 2、解码流程 懒的画图了,直接手写

liupenglove的专栏 1877

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ffmpeg最简单的解码保存YUV数据

文章来源: ffmpeg最简单的解码保存YUV数据 这篇文章很不错,收藏了。 video的 raw data 一般都是YUV420p的格式,简单的记录下这个格式的细节,如有不对希望大家能指出。 YUV图像通常有两种格式,一种是packet 还有一种是planar     从字面上就能理解packet的意思就是所有的yuv数据都是一股脑的放在一起,当然内部的数据还是按

路楷的专栏 6405

音视频开发中如何使用ffmpeg 一帧H264解码YUV420P?

作为在音视频行业持续发力多年的视频服务厂商,TSINGSEE青犀视频研发了开源平台EasyDarwin,还有多款音视频流媒体平台,我们开发流媒体平台基本都要使用ffmpeg,在ffmpeg中,H264在编码前必须要转换成YUV420P,本文就分享一下怎么将h264转成YUV420P。 以下就是yuv420: 八个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3][Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8] 码流为:Y0

TSINGSEE青犀视频官方技术博客 719
上一篇: 图像色彩编码YUV(YCbCr)的基本知识
下一篇: OpenGL之EGL入门知识
ericbars
博客等级 码龄10年 120粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值