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 ...
随机推荐
- 支持向量机(SVM):应用实例
SVM 应用实例(人脸识别): from __future__ import print_function from time import time import logging import m ...
- [转]VTH changes in DC from Hspice
Hello, everyone. I’d like to know the threshold of the MOS transistor. And I found the “.print vth() ...
- Spring AOP声明式事务异常回滚(转)
转:http://hi.baidu.com/iduany/item/20f8f8ed24e1dec5bbf37df7 Spring AOP声明式事务异常回滚 近日测试用例,发现这样一个现象:在业务代码 ...
- javascript常用字符串函数和本地存储
concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a.conca ...
- 【JEECG_3.7.1】列表多表头的设计
先看下多表头的设计: 在这个多表头的表单当中,我们可以按照从上到下和从左往右的划分方式,将表头划分成三行十列,分别是: 列表标签 人员信息.部门信息.工资.入职状态.创建日期.操作 名称.年龄.性别. ...
- go系列之数组
数组 数组是同一类型元素的集合.例如,整数集合 5,8,9,79,76 形成一个数组.Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组.(译者注:当然,如果是 interface{} ...
- Markdown: Basics (快速入门)[转]
Markdown: Basics (快速入门) / (点击查看完整语法说明) Getting the Gist of Markdown's Formatting Syntax [转自:http://w ...
- echarts报错Cannot read property 'features' of undefined
引入地图的时候 echarts2报错: Uncaught Error: [MODULE_MISS]"echarts/src/util/mapData/params" is not ...
- 【C++程序员学 python】python 之变量
既然学过C++,那么就应该知道变量是什么,常量是什么. python 相比于C++,在使用变量之前不用先声明. 而是直接使用,python 会根据你的变量自动识别其类型. 假如a = 123 那么a ...
- Python3 Scrapy 安装方法
Python3 Scrapy 安装方法 (一脸辛酸泪) 写在前面 最近在学习爬虫,在熟悉了Python语言和BeautifulSoup4后打算下个爬虫框架试试. 没想到啊,这坑太深了... 看了看相关 ...