Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

news2024/9/28 19:25:47

目录

YUV播放器

AVFrame中保存成YUV实现

linesize的意义

实测(PC机-64bits-win10)

总结:


YUV播放器

首先要有一个YUVplayer用来播放测试的YUV数据,雷神改良过的YUV播放器:

修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客

播放器播放界面如下,支持YUV、RGB格式播放。

AVFrame中保存成YUV实现

        如下实现了两种保存YUV的方式。

        第一种比较简单,直接将Y数据首地址指向的内存保存到文件里,长度直接按width x height计算,同样处理U、V数据。这种保存方式适用于Y、U、V的数据都是连续存储,中间没有任何跨度。

        但现实情况是如果数据的width和CPU的保存对齐不匹配,会出现数据不是连续存储的情况。比如图片宽高是720x576,而CPU是按照64字节对齐的方式存储数据,则Y数据每行的最后48字节是空的,保存YUV时只需要保存Y每行的前720字节。

void yuvStore(AVFrame *pFrame){
	if(NULL == pFrame){
		printf("NULL = pFrame !\n");
	}
	
	char file_name[128] = {0};
	time_t t;
	struct tm *timer;
	time(&t);
	timer = localtime(&t);
	
	switch(pFrame->format){
		case AV_PIX_FMT_YUV420P:
		{
			sprintf(file_name,"yuv420p_%dx%d_%d-%d-%d-%d-%d-%d.yuv",
			pFrame->width,pFrame->height,timer->tm_year+1900,timer->tm_mon+1,timer->tm_mday,timer->tm_hour,timer->tm_min,timer->tm_sec);
			FILE *fp_yuv = fopen(file_name,"wb+");
			if(NULL == fp_yuv){
				printf("NULL == fp_yuv!\n");
			}
			printf("AV_PIX_FMT_YUV420P, width = %d, height = %d\n",pFrame->width,pFrame->height);
			printf("",pFrame->linesize[0],pFrame->linesize[1],pFrame->linesize[2]);

			#if 0 //方法1
			int y_size = pFrame->width*pFrame->height;
			fwrite(pFrame->data[0],1,y_size,fp_yuv);    //Y 
			fwrite(pFrame->data[1],1,y_size/4,fp_yuv);  //U
			fwrite(pFrame->data[2],1,y_size/4,fp_yuv);  //V
			#else //方法2
			for(int i=0;i<pFrame->height;i++){
				fwrite(pFrame->data[0],1,pFrame->width,fp_yuv);    //Y 
				pFrame->data[0]+=pFrame->linesize[0];
			}

			for(int i=0;i<pFrame->height/2;i++){
				fwrite(pFrame->data[1],1,pFrame->width/2,fp_yuv);   //U
				pFrame->data[1]+=pFrame->linesize[1];
			}			

			for(int i=0;i<pFrame->height/2;i++){
				fwrite(pFrame->data[2],1,pFrame->width/2,fp_yuv);   //V
				pFrame->data[2]+=pFrame->linesize[2];
			}	
			#endif

			fclose(fp_yuv);
            break;
		}

		default:
			printf("unsupport format !\n");
			break;
	}
}

linesize的意义

AVFrame包含如下成员(ffmpeg5.1):

        uint8_t *data[AV_NUM_DATA_POINTERS];//指针数组,指向每个通道地址。比如YUV420P的数据,data[0]指向Y数据,data[1]指向U数据,data[2]指向V数据
        int linesize[AV_NUM_DATA_POINTERS];//可以理解为每行数据的跨度。
        int width, height;//如果是视频、描述宽高
        int nb_samples;//如果是音频、描述音频采样点
        int format;//格式,视频见AVPixelFormat,音频见AVSampleFormat

        linesize通常是=图像的宽度。但如果图像的宽度和CPU保存数据的对齐宽度不匹配,比如CPU是按照64字节进行对齐保存的,而图像原始宽度是720(64对齐后是768),解码出来的YUV,每行数据会按照64对齐,也就是Y通道的第一行首地址和第二行首地址之间的内存offset不是720,而是768。 linesize描述的是数据每两行之间的跨度。

实测(PC机-64bits-win10)

        1920x1080的分辨率,1920是64对齐,linesize=width。

        720x576的分辨率,720不是64对齐,linesize=width+padding。

总结:

        linesize描述了图像每行之间内存的offset,可能等于图像width。取决于图像宽度是否=CPU对齐后的存储宽度。

要先参考这个文章搭建ffmpeg的win测试环境。

VScode配置ffmpeg+sdl2.0开发环境(window+MinGW)_小葫芦写代码的博客-CSDN博客_vscode ffmpeg

测试工程地址:将下边的工程下载后,就可以测试这个API

基于vscode构建的ffmpeg+sdl2.0的视频播放器demo_vscode设置sdl2环境-桌面系统文档类资源-CSDN下载

使用ffmpeg生成一段分辨率为720*576的视频

ffmpeg -i test.mp4 -s 720x576 -f mp4 720.mp4

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

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

相关文章

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示&#xff0c;这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…

react生命周期(类组件/函数组件)

1.react代码模式分为两种 类组件和函数组件&#xff08;生命周期也有所不同&#xff09; 2.类组件&#xff08;写法如下&#xff09; import React from react export default class App1 extends React.Component{state {username:,password:}setUser (event) > {this.s…

《MySQL系列-InnoDB引擎12》启动、关闭与恢复

启动、关闭与恢复 InnoDB是MySQL数据库得存储引擎之一&#xff0c;因此InnoDB存储引擎得启动和关闭&#xff0c;可以说是MySQL实例得启动过程中对InnoDB存储引擎的处理过程。 在关闭时&#xff0c;参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、…

BIOS(控制权交接第一棒)

计算机系统的控制权&#xff08;CPU的使用权&#xff09;交接的第一棒是BIOS&#xff01;接下来&#xff0c;我们简单学习一下BIOS相关知识。 在计算机接电后按下开机键&#xff0c;首先运行的软件是基本输入输出系统&#xff08;Basic Input Output System&#xff0c;BIOS&a…

阿里云故障有感

2304阿里云故障有感 为什么会写一个如此奇怪的议题。 人的生活轨迹&#xff0c;不一定只有唯一的叙事方式&#xff0c;可以不那么苦&#xff0c;不那么累&#xff0c;不那么怕&#xff0c;不那么憋屈。 不再去追求宏大的叙事&#xff0c;而是去关心自己的感受&#xff0c;吃没…

Spring Boot学习篇(六)

Spring Boot学习篇(六) mybatis-plus使用篇(二) 1 新增 1.1 示例代码 AutowiredISongsService songsService; Testpublic void add(){Songs snew Songs(null,"11","xx",null,"xx歌曲","2020-02-12");songsService.save(s);System.…

linux之vim编辑器

文章目录1. 概念2.安装3. vim的使用1.使用一些按键没有反应2. 模式转换1.命令模式转换到插入模式1. a2. i3. o2.命令模式切换到底行模式1. 退出3. 整体概念图4. 热键的使用1. 命令模式下1.复制——yy 粘贴——p复制若干行—— n yy粘贴若干行—— n p2. 撤销操作——u3. 对撤销…

03-Alibaba微服务组件Nacos注册中心实战

什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 服务及其元数据管理 Nacos…

陆道培医疗冲刺香港上市:持续亏损,毛利率下滑,陆佩华为董事长

2023年1月3日&#xff0c;陆道培医疗集团&#xff08;下称“陆道培医疗”&#xff09;在港交所递交招股书&#xff0c;准备在港交所主板上市。本次冲刺上市&#xff0c;陆道培医疗拟将募资金额用于河北燕达陆道培医院的扩建及搬迁及上海陆道培医院的开业等。 同时&#xff0c;陆…

新生儿只是睡?了解了他的生长发育情况后就不这么觉得了

在网上看到这样一句话&#xff0c;说:所谓坐月子&#xff0c;其实就是把最需要照顾的产妇和新生儿捆在一起&#xff0c;让他们互相治愈。是的&#xff0c;在很多人眼里&#xff0c;新生儿除了吃饭就是睡觉&#xff0c;照顾起来真的很容易&#xff0c;但是只要了解了新生儿的生长…

Android开发常见问题:为什么不要用Timer?

前言 从刚开始做Android开始&#xff0c;就时刻谨记一条规则&#xff1a;如果有能实现功能的Android API&#xff0c;就不要用Java API。所以我很少用Timer&#xff0c;直到前一阵一个朋友问我&#xff1a; 我有一个Timer计时器&#xff0c;我看logcat已经启动了&#xff0c;为…

嵌入式应该从哪里入手?

就从目前IT行业大的方向上来讲嵌入式工程师相对来讲是非常吃香的&#xff0c;学习嵌入式开发的朋友数量也是非常的多的&#xff0c;那么对于对嵌入式工程师我们应该从哪里入手呢? 下面就根据我自身多年的一个实际的工作经验来给哪些不知道怎么入门的朋友来简单的介绍一下。 前…

C语言进阶——指针(一)

目录 一. 字符指针 二. 指针数组 三. 数组指针 四. 数组参数、指针参数 1.一维数组传参 2.二维数组传参 3.一级指针传参 4.二级指针传参 一. 字符指针 在之前&#xff0c;我们就了解到过字符指针 int main() {char aW;//字符变量char* pa&a;//字符指针*…

1.3日报

今天优化了getMobileByScene接口&#xff0c; 测试accountadd接口 遇到的问题与解决 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导致系统错误&#xff0c;在同事帮助下重装了系统&#xff0c;好在保住了文件。但是软件还得重新配置。 getMobileByScene接口在…

精益|什么是价值流图分析(VSM)?

在精益生产管理中&#xff0c;价值流研究主要是指利用制作价值流图&#xff0c;进行价值流图研究可以发现并消除浪费、降低成本&#xff0c;改进企业运营状况&#xff0c;提升企业竞争力。因此进行价值流研究离不开价值流图。 价值流图&#xff08;Value Stream Mapping&#x…

基于KT6368A蓝牙芯片开发智能抖音翻页翻页笔总结

一、功能简介 KT6368A蓝牙芯片也是基于 HID 开发&#xff0c;主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。打开手机蓝牙进行连接&#xff0c;进入视频浏览界面操作对应按键即可。包含一个蓝牙的指示灯&#xff0c;表示是否连接 。同时支持adkey按…

HBase面试题汇总

1、请描述HBse的&#xff1f; 答&#xff1a; Memstore级别&#xff1a;当MemStore的大小达到设置阈值&#xff08;默认128M&#xff09;&#xff0c;会触发flush操作。 1、HBase中Memstore在何时进行数据的flush操作&#xff1f; 答&#xff1a; Memstore级别&#xff1a…

uniapp 填坑之旅---udb微信小程序端显示异常

功能描述&#xff1a;A页面展示列表a&#xff0c;点击a&#xff0c;进入B页面&#xff0c;展示a对象关联的子对象b。在B页面中&#xff0c;通过unicloud-db组件manual模式加载&#xff0c;具体代码按照官网示例来写。问题描述&#xff1a;代码实现后&#xff0c;一直在H5调试&a…

Jmeter安装配置使用超详细教程(亲测有效)

文章目录1、Jmeter下载2、JDK安装3、Jmeter环境部署4、验证jmeter5、修改语言6、接口测试1、Jmeter下载 1.1、下载地址 http://jmeter.apache.org/download_jmeter.cgi 1.2、选择对应版本&#xff0c;本文以windows版本为例&#xff0c;版本号为5.5。 2、JDK安装 jmeter安装…

到底为什么那么多大厂在开始疯狂裁员?

最近几年大家都听到了好多大厂公司开始裁员&#xff0c;比如鹅厂、狗厂、鸟厂、熊厂等。 接下来给大家讲个故事&#xff0c;希望故事看完&#xff0c;你就会懂了&#xff01; 外国的神父呆了不久 留下几个 P 就走了&#xff0c; 一个 P 叫 BPR&#xff0c; 一个 P 叫 ERP。 …