3D视频上下转化左右交织格式YUV

3D视频中,有的是上下格式的,但是无论是裸眼3D还是3D眼镜都需要左右格式的,下面就是转换的算法,利用ffmpeg解码,进行YUV切割,实现左右视频交织,可以在裸眼3D手机或者pad上观看3D效果。必须要先熟悉YUV数据格式。

        FILE *yuvFile = fopen("yuv_file_width.yuv","ab");
	if(!yuvFile)
		return 0;
	av_register_all();
	AVFormatContext *pFormat  = NULL;
	if (avformat_open_input(&pFormat ,SRC_FILE,NULL,NULL) < 0)
	{
		return 0;
	}
	AVCodecContext * video_dec_ctx = NULL;
	AVCodec *video_dec = NULL;
	if (avformat_find_stream_info(pFormat,NULL) < 0)
	{
		return 0;
	}
	av_dump_format(pFormat,0,SRC_FILE,0);
	int index = -1,i = 0;
	for (i=0;i<pFormat->nb_streams;i++)
	{
		if (pFormat->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
		{
			index = i;
			break;
		}
	}
	if (-1 == index)
	{
		printf("can‘t find the codec\n");
		return -1;
	}
	video_dec_ctx = pFormat->streams[index]->codec;
	video_dec = avcodec_find_decoder(video_dec_ctx->codec_id);
	//源文件的格式上下文 解码器上下文  解码器 都已经找到 现在打开解码器
	if(avcodec_open2(video_dec_ctx,video_dec,NULL) < 0)
	{
		return 0;
	}

	//需要读取一帧数据 放在包里
	AVPacket *video_pkt =  new AVPacket;
	av_init_packet(video_pkt);

	while (1)
	{
		if(av_read_frame(pFormat,video_pkt)<0)
		{
			fclose(yuvFile);
			delete video_pkt;
			return 0;
		}
		if (pFormat->streams[video_pkt->stream_index]->codec->codec_type ==       AVMEDIA_TYPE_VIDEO)
		{
			AVFrame *frame =avcodec_alloc_frame();
			int got_pictrue = 0,ret = 0;
			ret = avcodec_decode_video2(video_dec_ctx,frame,&got_pictrue,video_pkt);
			if (ret < 0)
			{
				continue;
			}
			if (got_pictrue)
			{
				printf("decode one frame is ok\n");
				int height = video_dec_ctx->height/2;
				int width = video_dec_ctx->width*2;
				char *buf = new char[height*width*3/2];
				memset(buf,0,height*width*3/2);
				int y_tmp=0,i=0;
				int u_tmp = width/2*height*2;
				int v_tmp = u_tmp + width/4*height/2*2;

				for (i=0;i<height;i++)
				{
					int tmp;
					memcpy(buf+y_tmp,frame->data[0]+i*frame->linesize[0],width/2);
					y_tmp += width/2;
					tmp = i+height;
					memcpy(buf+y_tmp,frame->data[0]+tmp*frame->linesize[0],width/2);
					y_tmp += width/2;
					if (i<height/2)
					{
						memcpy(buf+u_tmp,frame->data[1]+i*frame->linesize[1],width/4);
						u_tmp += width/4;
						tmp = i+height/2;
						memcpy(buf+u_tmp,frame->data[1]+tmp*frame->linesize[1],width/4);
						u_tmp += width/4;

						memcpy(buf+v_tmp,frame->data[2]+i*frame->linesize[2],width/4);
						v_tmp += width/4;
						tmp = i+height/2;
						memcpy(buf+v_tmp,frame->data[2]+tmp*frame->linesize[2],width/4);
						v_tmp += width/4;
					}
				}

				int frame_height = height;
				int frame_width = width/2;
				char *frame_buf = new char[frame_height*frame_width*3/2];
				memset(frame_buf,0,frame_height*frame_width*3/2);
				int tmp=0;
				for (i=0;i<height*width*3/2;i++)
				{
					if (i%2 == 0)
					{
						memcpy(frame_buf+tmp,buf+i,1);
						tmp++;
					}

				}
				for (i=0;i<height;i++)
				{
				memcpy(buf+a,frame->data[0]+i*frame->linesize[0],width);
				a += width;
				}
				for (i=0;i<height/2;i++)
				{
				memcpy(buf+a,frame->data[1]+i*frame->linesize[1],width/2);
				a += width/2;
				}
				for (i=0;i<height/2;i++)
				{
				memcpy(buf+a,frame->data[2]+i*frame->linesize[2],width/2);
				a += width/2;
				}
				fwrite(frame_buf,1,frame_height*frame_width*3/2,yuvFile);
				delete[] frame_buf;
				delete[] buf;
				frame_buf = NULL;
				buf = NULL;
			}
			avcodec_free_frame(&frame);
		}
	}
	fclose(yuvFile);
	delete video_pkt;

  

时间: 2024-08-05 15:25:13

3D视频上下转化左右交织格式YUV的相关文章

基于 Android 的 3D 视频样本代码

作者:Mark Liu 下载样本代码 简介 在Android 中,创建一个能够播放视频剪辑的应用非常简单:创建一个采用 3D 图形平面的游戏应用也非常简单.但是,创建一个能够在 3D 图形对象上播放视频的应用却不容易.本文介绍了我为应对该挑战创建的应用.该应用可在 3D 平面上渲染视频,并支持用户以交互的方式在视频平面上播放. 该应用需要解决三大实施问题: 如何构建代码以支持用户在播放视频时变更 3D 平面? 虽然 Android 中默认的 MediaPlayer 配备了全面的播放操作,但是难以

3D视频的播放

人眼产生立体效果的条件有两个: 1.需要左右眼两路影像,这两路影像是不同的,具有正确的视差: 2.进入左右眼的影像要完全分离,左影像进左眼,右影像进右眼. 第一条是对3D视频源提出的要求,视频源必须包括两路视频,这两路视频既有关系,又有差别.它们是在同一时刻.同一架3D摄像机(有两个摄像镜头,两镜头距离与人眼瞳距相近)拍摄的同一个场景所产生的两路视频.这两路视频很相似,可以利用这些相似性设计压缩算法,以此来减少数据量,以后会学习3D视频的拍摄与存储. 第二条是对3D播放设备提出的要求.如何才能让

转 常见视频编码方式以及封装格式

常见视频编码方式以及封装格式 常见视频编码方式 所谓视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式.视频流传输中最为重要的编解码标准有国际电联的H.261.H.263.H.264.H.265,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo.微软公司的WMV以及Apple公司的QuickTime等. AVI AVI 是 Audio Video I

如何将Excel日期快速转化为文本格式?

Excel表中日期格式其实是数值,有时候需要原样转成文本,有时候也要将文本转成日期. 我发现了一个方法,估计是最快的了.不需要用那一堆year() month()之类的函数. 快速将日期格式转化为文本格式 全选--右键--设置单元格格式, 可见,为日期格式. 如果在这里选择文本呢? 变成了数字,如果选择常规或者数值,都是数字. 我试很多办法,什么year函数,month函数,等等,麻烦要死. 终于我发现了一个很简便的办法. 倒回来,全选这个区域 点击  数据--分列 弹出一个框,直接点下一步 再

number数值转化成为货币格式

/** *number数值转化成为货币格式 * * num 要转换的数值 * places 保留小数位数 * symbol 货币符号 * thousand 整数部分千位分隔符 * decimal 小数分隔符 */ formatMoney = (num, places, symbol, thousand, decimal) => { places = !isNaN(places = Math.abs(places)) ? places : 2 symbol = symbol !== undefin

qsv视频如何转换成mp4格式?

我们通常都需要将这些qsv格式的视频转换成mp4格式,那么下面就让小编给大家简单介绍一下. 步骤一:需要将qsv格式的视频文件转换成MP4格式,我们需要给准备好qsv格式的视频文件,然后通过在浏览器上的搜索迅捷PDF在线转换器进入到在线网站:步骤二:在首页的导航栏中找到音视频转换中的qsv转mp4功能点击进入即可:步骤三:进入之后就可以进行qsv格式的文件选择,将qsv格式的文件选择到界面中去,然后进行打开即可:步骤四:视频文件转换是需要一定的时间的,我们可以耐心的等待一段时间,等视频文件转换完

基于 Android 的 3D 视频示例代码

笔者:Mark Liu 下载样本代码 简单介绍 在Android 中,创建一个可以播放视频剪辑的应用很easy:创建一个採用 3D 图形平面的游戏应用也很easy.可是,创建一个可以在 3D 图形对象上播放视频的应用却不easy. 本文介绍了我为应对该挑战创建的应用. 该应用可在 3D 平面上渲染视频,并支持用户以交互的方式在视频平面上播放. 该应用须要解决三大实施问题: 怎样构建代码以支持用户在播放视频时变更 3D 平面? 尽管 Android 中默认的 MediaPlayer 配备了全面的播

字符串金额转化为指定格式的货币格式

前言 做金融项目的时候,接触的大量数字字符串往往需要格式化显示,这里我写了一个demo,将字符串金额格式化,可以保留小数位数,可以添加货币标识前缀. 写在string的原型里面,需要格式化的时候直接格式化呗! 例:'123345.23123'.moneyFormatter(2,'¥') 输出: '¥123,345.23' demo有注释,我就不多做说明了 我的demo <!DOCTYPE html> <html lang="en"> <head> &

各视频、各音频之间格式任意玩弄

写在前面说的话 在这里,记录下来,是为了方便以后偶尔所制作所需和你们前来的浏览学习. 学会,玩弄一些视频和音频的软件,只有好处没有害处.同时,也不需很多时间,练练手罢了.也是方便自己所用吧! 步骤一: 比如,我们在爱奇艺里,安装PC版,下载下来的一般是.qsv格式的.而这,若去改为.mp4或.avi或flv,一般是行不通的.所以.这时.需要 将    .qsv格式     ->       .flv格式  步骤二:  再,用格式化工厂. 将  .flv 格式     ->      .mp3格