http://blog.csdn.net/huahuahailang/article/details/9040847

/*************************************************
* 主要功能:两路 YUV4:2:0拼接一路左右半宽格式YUV视频
参考资料:http://www.pudn.com/downloads271/sourcecode/multimedia/vfw/detail1237363.html
U_size=V_size=Y_size/2
*************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define PREWEIGHT 1920
#define PREHEIGHT 1080
#define RESWEIGHT 3840
#define RESHEIGHT 1080
#define PREYSIZE ((PREWEIGHT)*(PREHEIGHT))
#define PREUSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))
#define PREVSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))
#define RESYSIZE ((RESWEIGHT)*(RESHEIGHT))
#define RESUSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))
#define RESVSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))
#define PRESIZE ((PREYSIZE)+(PREUSIZE)+(PREVSIZE))
#define RESSIZE ((RESYSIZE)+(RESUSIZE)+(RESVSIZE)) int GetFrameNum(const char *File)
{
FILE *fp;
int size=;
if (!(fp=fopen(File,"rb")))
{
printf("Open %s error !",File);
exit();
}
else
{
fseek(fp,,SEEK_END);/*将文件指针移到YUV文件的末尾*/
size=ftell(fp);/*计算文件的总大小*/
}
return (size/PRESIZE);
}
void ReadYUV(char *ResBuf,char *PreBuf,int resstart,int prestart,int resoffset,int preoffset,int size,int height)
{
int k;
for (k=;k<height;k++)
{
memmove(ResBuf+resstart+k*(resoffset),PreBuf+prestart+k*(preoffset),size);//注意这里用memmov不用strncpy
}
}
int main(int argc,char *argv[])
{
const char *FileName[]={"e:\BMX_L_1920x1080_240frms.yuv","e:\BMX_R_1920x1080_240frms.yuv"};/*两路YUV文件名*/
FILE *FileResult;/*输出文件名*/
FILE** fp_combine=(FILE**)malloc(sizeof(FILE *)*);/*申请文件指针*/
int *FileFrameNum=(int *)malloc(sizeof(int)*);/*每个YUV的帧数*/
char *PreBuf=(char *)malloc(sizeof(char)*(PRESIZE+));/*处理前每一帧图像的大小*/
char *ResBuf=(char*)malloc(sizeof(char)*(RESSIZE+));/*处理后每一帧图像的大小*/
int Y_start_section=;/*预处理图片Y分量存入目标区域的起始区域*/
int U_start_section = ;/*预处理图片U分量存入目标区域的起始区域*/
int V_start_section = ;/*预处理图片V分量存入目标区域的起始区域*/
int File_offset = ;/*预处理文件偏移值*/
int i_combine=,j_combine=,k_combine=;/*控制循环*/
/*判断申请内存是否成功*/
if (!((fp_combine)&&(FileFrameNum)&&(PreBuf)&&(ResBuf)))
{
printf("Allocate memeroy Faile !");
exit();
}
/*初始化申请空间*/
memset(fp_combine,,sizeof(FILE *)*);
memset(FileFrameNum,,sizeof(int)*);
memset(PreBuf,,sizeof(char)*PRESIZE);
memset(ResBuf,,sizeof(char)*RESSIZE);
if (!(FileResult=fopen("hua_result.YUV","wb")))/*创建输出文件*/
{
printf("Creat File faile !");
exit();
}
for (i_combine=;i_combine<;i_combine++)
{
if(!(fp_combine[i_combine]=fopen(FileName[i_combine],"rb")))/*打开输入文件*/
{
printf("Open File %s Faile !",FileName[i_combine]);
exit();
}
else
{
FileFrameNum[i_combine]=GetFrameNum(FileName[i_combine]);/*存储每一个视频的帧数*/
}
}
i_combine=;
k_combine=FileFrameNum[i_combine];
while (i_combine<k_combine)
{
File_offset = i_combine*PRESIZE;
j_combine=;
while (j_combine<)
{
fseek(fp_combine[j_combine],File_offset,SEEK_SET);/*移动文件指针至需要处理的数据的位置*/
fread(PreBuf,,PRESIZE,fp_combine[j_combine]);/*读取一幅图像*/
if (j_combine==)
{
/*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/
Y_start_section=;
U_start_section=RESYSIZE;
V_start_section=RESYSIZE+RESUSIZE;
}
else
{
/*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/
Y_start_section=PREWEIGHT;
U_start_section=RESYSIZE+PREWEIGHT/;
V_start_section=RESYSIZE+RESUSIZE+PREWEIGHT/;
}
/*分别读Y、U、V*/
ReadYUV(ResBuf,PreBuf,Y_start_section,, RESWEIGHT,PREWEIGHT,PREWEIGHT,PREHEIGHT);
ReadYUV(ResBuf,PreBuf,U_start_section,PREYSIZE, RESWEIGHT/,PREWEIGHT/,PREWEIGHT/,PREHEIGHT/);
ReadYUV(ResBuf,PreBuf,V_start_section,PREYSIZE+PREUSIZE, RESWEIGHT/,PREWEIGHT/,PREWEIGHT/,PREHEIGHT/);
j_combine++;
}
fwrite(ResBuf,,RESSIZE,FileResult);
fflush(FileResult);
i_combine++;
}
fclose(fp_combine[]);
fclose(fp_combine[]);
fclose(FileResult);
return ;
}

拼接两个yuv合帧的更多相关文章

  1. Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)

    MediaCodec的使用demo: https://github.com/vecio/MediaCodecDemo https://github.com/taehwandev/MediaCodecE ...

  2. Android零基础入门第30节:两分钟掌握FrameLayout帧布局

    原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...

  3. elementui中的el-table中拼接两个列表字段

    我们知道,在ElementUI中我们是使用下面的语法来展示列表字段的: <el-table :data="yanggbs" stripe style="width: ...

  4. 合并两个yuv文件的C++代码

    //将BasketballPass_416x240_50.yuv序列的前50帧和BlowingBubbles_416x240_50.yuv序列的前250帧合并成out.yuv //参数配置416 24 ...

  5. 用sql合并列,两句话合为一句

    合并bc两列 UPDATE `test` SET `a`=concat(`b`,`c`) 清空a列 UPDATE `test` SET `a` = NULL

  6. java中拼接两个对象集合

    目标:  根据两个list中每条记录的某个属性是否相同来拼接. 1.首先定义一个字符串 String str = "[{\"ITEMID\":2,\"ITEMN ...

  7. java中拼接两个数组

    int a[]={1,2,3,2}; int b[]={4,2,90,8,98}; int[] d3 = new int[a.length + b.length]; System.arraycopy( ...

  8. 图像处理之基础---2个YUV视频 拼接技术

    /************************************************* * 主要功能:两路 YUV4:2:0拼接一路左右半宽格式YUV视频 参考资料:http://www ...

  9. 2个YUV视频拼接技术

    http://blog.csdn.net/huahuahailang/article/details/9040847 2个YUV视频拼接技术 http://zhongcong386.blog.163. ...

随机推荐

  1. iOS内存管理(objective-c)

    移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以j ...

  2. ajax完成团队信息异步添加【实际项目】

    第一:ajax往后台传参如何串(目前理解是json数组直接传给对象) 第二:ajax返回的数值通过PrintWriter.print方法返回 [参考前台页面关于团队信息是如何实现的] 参考页面user ...

  3. python(十二):网络编程之ISO/OSI模型

    互联网(Internet)是依据操作系统,在计算机硬件的基础上建立起的通讯机制.它依赖于TCP/IP协议栈. 一.ISO/OSI模型 1.ISO七层模型与OSI五层模型 它们将计算机抽象成了具有层级关 ...

  4. 通过以太坊发行代币(token)

    2017年开始,区块链ICO项目层出不穷,市场热度一波更胜一波,很多ICO都是通过以太坊智能合约发行自己的代币(token),具体怎样才能发行代币呢?本文进行具体详细的介绍. 准备工作 以太坊官网ER ...

  5. 【angularJS】Directive指令

    AngularJS 通过被称为 指令 的新属性来扩展 HTML.指令是扩展的 HTML 属性,带有前缀 ng-. 内置指令 1.ng-app 指令初始化一个 AngularJS 应用程序. 定义了 A ...

  6. LeetCode 424. Longest Repeating Character Replacement

    原题链接在这里:https://leetcode.com/problems/longest-repeating-character-replacement/description/ 题目: Given ...

  7. Vim自动补全插件----YouCompleteMe安装与配置

    Vim自动补全插件----YouCompleteMe安装与配置 使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assist X这么方便快捷的补全插件呢?以前用 ...

  8. mysql+matlab配置

    mysql 中一直出现'> 单双引号没有配对 mysql 连接matlab 1, 到mysql官网下载 http://dev.mysql.com/downloads/connector/j/(m ...

  9. JMeter代码小Demo(Java)

    一.使用Eclipse进行项目编写 1.使用eclipse,新建项目名字为:TestNumber,包名为:test,类名为:TestNum 2.在JMeter的安装目下下lib/ext中copy2个j ...

  10. winform Textbox模糊搜索实现下拉显示+提示文字

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...