FFMPEG的解码后的数据格式
这两天在阅读电视转发服务器中的流媒体底层库的源码时,在看到显示部分的时候,遇到了一些疑问:
就是在用d3d做显示时候,我们显示的数据格式,指定为yv12,对于YV12的数据格式在内存中的分布,可以参考YV12的相关文章,这里我就暂时略过。
下面是将数据拷贝到显示的锁定内存中,用于显示:
for(i = 0;i < h;i ++){//Y数据拷贝
memcpy(p + i * stride,item->output + i * w, w);
}
for(i = 0;i < h/2;i ++){//U数据拷贝
memcpy(p + stride * h + i * stride / 2,item->output + w * h + w * h / 4 + i * w / 2, w / 2);
}
for(i = 0;i < h/2;i ++){//V数据拷贝
memcpy(p + stride * h + stride * h / 4 + i * stride / 2,item->output + w * h + i * w / 2, w / 2);
}
而在显示之前,也就是解码的时候,也进行过数据的拷贝:
memcpy(&(pItemF.head),&(m_tRecentItem.head),sizeof(AV_HEAD_PARAM));
for (int i=0;i<m_tRecentItem.head.height;i++)//Y数据拷贝
memcpy(pYUVBuf+i*m_tRecentItem.head.width , m_tRecentItem.picture->data[0]+i*m_tRecentItem.picture ->linesize[0], m_tRecentItem.head.width);
for (int i=0;i<m_tRecentItem.head.height/2;i++)//U数据拷贝
memcpy(pYUVBuf+m_tRecentItem.head.height*m_tRecentItem.head.width+i*m_tRecentItem.head.width/2 , m_tRecentItem.picture->data[1]+i*m_tRecentItem.picture ->linesize[1], m_tRecentItem.head.width/2);
for (int i=0;i<m_tRecentItem.head.height/2;i++)//V数据拷贝
memcpy(pYUVBuf + m_tRecentItem.head.height*m_tRecentItem.head.width + m_tRecentItem.head.height/2 * m_tRecentItem.head.width/2 + i*m_tRecentItem.head.width/2 , m_tRecentItem.picture->data[2]+i*m_tRecentItem.picture ->linesize[2], m_tRecentItem.head.width/2);
而上面的item->output=
pYUVBuf
如果显示的数据是YV12,那么解码以后的数据格式又是怎么样的格式?
--------------------------------------------------------------
在经过一番查找资料以后知道,解码以后的数据格式是I420.
在此博客中提过:http://blog.sina.com.cn/s/blog_4ae178ba01018o7q.html
解码
如果您只要求解成YUV 420I数据,只需一次调用就可以了:
avcodec_decode_video(g_pCodecCtx, g_pavfFrame, (int *)&nGot, (unsigned __int8 *)pSrcData, dwDataLen);
这里,nGot用来返回解码成功与否,avcodec_decode_video调用完成后,如果nGot不等于0,则表示解码成功,否则未解出视频帧。
pSrcData是待解的H264编码的一段数据流,dwDataLen表示该段数据流的长度,单位是byte。
解 码后的视频帧(YUV数据)被存入g_pavfFrame,g_pavfFrame->data[0]、 g_pavfFrame->data[1]、g_pavfFrame->data[2]即是YUV数据。下面的示例代码把YUV数据压在了一 块内存里,排列方式为:
YY
YY
U
V
该函数有返回值:如果解码成功,则返回本次解码使用的码流字节数,否则返回0。
------------------------------------------------------------------------
在采集到RGB24数据后,需要对这个格式的数据进行第一次压缩。即将图像的颜色空间由RGB2YUV。因为,X264在进行编码的时候需要标准的YUV(4:2:0)。但是这里需要注意的是,虽然YV12也是(4:2:0),但是YV12和I420的却是不同的,在存储空间上面有些区别。如下:
YV12 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
I420 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
可以看出,YV12和I420基本上是一样的,就是UV的顺序不同。
从上面这段话,我们可以知道,在做显示的时候,因为i420的格式数据和yv12格式的数据uv存储顺序不一样,所以我们在做显示的时候,对数据进行了一次从新存储。
FFMPEG的解码后的数据格式的更多相关文章
- FFMPEG结构体分析:AVFrame(解码后的数据)
https://blog.csdn.net/jxcr1984/article/details/52766524 本文转自: http://blog.csdn.net/leixiaohua1020/ar ...
- 学习FFmpeg API – 解码视频
本文转载 视频播放过程 首先简单介绍以下视频文件的相关知识.我们平时看到的视频文件有许多格式,比如 avi, mkv, rmvb, mov, mp4等等,这些被称为容器(Container), 不同的 ...
- ffmpeg编解码视频导致噪声增大的一种解决方法
一.前言 ffmpeg在视音频编解码领域算是一个比较成熟的解决方案了.公司的一款视频编辑软件正是基于ffmpeg做了二次封装,并在此基础上进行音视频的编解码处理.然而,在观察编码后的视频质量时,发现图 ...
- 【转】学习FFmpeg API – 解码视频
ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...
- FFmpeg编解码处理4-音频编码
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584948.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- FFmpeg编解码处理3-视频编码
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584937.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- FFmpeg编解码处理2-编解码API详解
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584925.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- FFmpeg编解码处理1-转码全流程简介
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584901.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- ffmpeg 编解码详细过程
ffmpeg编解码详细过程 bobbypollo 转:ffmpeg编解码详细过程 原文地址:ffmpeg编解码详细过程(转)作者:心在飞翔原文出处: http://www.360doc.com ...
随机推荐
- 安装ubuntu和windows双系统后,如何修改默认启动项
在安装了Ubuntu16.04系统之后,系统会默认自启动Ubuntu16.04,而我们大多数情况下可能都在使用windows系统,不修改默认设置,不经意间便会启动了Ubuntu16.04,通过我的经历 ...
- js数组设置值操作
js中给数组中添加新值的方式: var flow=[]; for(var i=0;i<21;i++){ flow.push(Math.floor(Math.random()*(30+((i%12 ...
- Spring Cloud构建微服务架构(三)断路器
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因 ...
- IIS 的几个小技巧
1.向 IIS 中安装 .NET 应用程序池 如果先安装了 IIS,后安装了 .NET,就需要向 IIS 中注册 ASP.NET . (有的版本 .NET 安装后可能不会在 IIS 中体现,比如貌似 ...
- Spring Hello World
1. 概述 Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首次在 Apache 2.0 许可下发布. 1.1 依赖注入 1.2 ...
- 五、String在Java中是传“引用”
这个是Java的经典问题.许多类似的问题在stackoverflow被提问,有很多不正确或不完备的答案.如果不想太多你会认为这个问题比较简单.( The question is simple if y ...
- Spark性能优化指南——基础篇转
前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...
- [转]Understanding Weak References
原文地址:https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html 推荐另一篇文章:http://www ...
- 【C#/WPF】限制GridSplitter分隔栏的滑动范围
GridSplitter可以自由滑动,例如一个水平方向的分隔栏,可以从屏幕顶端滑到屏幕底端. 现在的需求是:限制GridSplitter在一定范围内滑动. 例如,现在有如下的横竖两个GridSplit ...
- C语言 · 关联矩阵
算法训练 关联矩阵 时间限制:1.0s 内存限制:512.0MB 问题描述 有一个n个结点m条边的有向图,请输出他的关联矩阵. 输入格式 第一行两个整数n.m,表示图中结点和边的数目 ...