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. [转]:What happens to older developers?

    原文链接可能失效. This post is old but will remain on the front page for the time being. 140313. Jeff Jenkin ...

  2. Uoj 441 保卫王国

    Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...

  3. {Reship}{Sparse Representation}稀疏表示

    ===================================================== http://blog.sina.com.cn/s/blog_6d0e97bb01015wo ...

  4. “VT-x is not available. (VERR_VMX_NO_VMX)” in VirtualBox

    Sometimes you can get “VT-x is not available. (VERR_VMX_NO_VMX)” error if you are trying to start x6 ...

  5. F4NNIU 版本的标准电阻列表(2018-09-29 更新)

    F4NNIU 版本的标准电阻列表(2018-09-29 更新) 值代码 电阻值 格式化值 单位 公差代码 公差 格式化值数字 描述 0RJ 0 0 R J 5% J0000 0R 5% (0RJ) 1 ...

  6. MySQL主从报错解决:Failed to initialize the master info structure

    大清早收到一个MySQL的自定义语言告警 :replication interrupt,看来是主从同步报错了. 登陆MySQL,执行 show slave status \G 发现salve已经停止了 ...

  7. TCP 、UDP、IP包的最大长度

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

  8. linux保存的设置用户/组ID(set-user-ID)的测试

    直接贴代码和结果 // FileName: id.cpp #include <iostream> #include <unistd.h> using namespace std ...

  9. 使用FILE指针读写文件

    http://www.cnblogs.com/Solstice/archive/2011/07/17/2108715.html 看了这篇博客有感而发. 就个人而言我是典型的从C到C++的类型,并且逐渐 ...

  10. 【转】Jmeter使用之常用函数介绍

    "_csvRead"函数 csvRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数. 下面具体讲一下如何使用csvread函数: 1.新建一个csv或者t ...