1. /*************************************************
  2. * 主要功能:两路 YUV4:2:0拼接一路左右半宽格式YUV视频
  3. 参考资料:http://www.pudn.com/downloads271/sourcecode/multimedia/vfw/detail1237363.html
  4. U_size=V_size=Y_size/2
  5. *************************************************/
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #define PREWEIGHT 1920
  10. #define PREHEIGHT 1080
  11. #define RESWEIGHT 3840
  12. #define RESHEIGHT 1080
  13. #define PREYSIZE ((PREWEIGHT)*(PREHEIGHT))
  14. #define PREUSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))
  15. #define PREVSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))
  16. #define RESYSIZE ((RESWEIGHT)*(RESHEIGHT))
  17. #define RESUSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))
  18. #define RESVSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))
  19. #define PRESIZE ((PREYSIZE)+(PREUSIZE)+(PREVSIZE))
  20. #define RESSIZE ((RESYSIZE)+(RESUSIZE)+(RESVSIZE))
  21. int GetFrameNum(const char *File)
  22. {
  23. FILE *fp;
  24. int size=0;
  25. if (!(fp=fopen(File,"rb")))
  26. {
  27. printf("Open %s error !",File);
  28. exit(1);
  29. }
  30. else
  31. {
  32. fseek(fp,0,SEEK_END);/*将文件指针移到YUV文件的末尾*/
  33. size=ftell(fp);/*计算文件的总大小*/
  34. }
  35. return (size/PRESIZE);
  36. }
  37. void ReadYUV(char *ResBuf,char *PreBuf,int resstart,int prestart,int resoffset,int preoffset,int size,int height)
  38. {
  39. int k;
  40. for (k=0;k<height;k++)
  41. {
  42. memmove(ResBuf+resstart+k*(resoffset),PreBuf+prestart+k*(preoffset),size);//注意这里用memmov不用strncpy
  43. }
  44. }
  45. int main(int argc,char *argv[])
  46. {
  47. const char *FileName[]={"e:\BMX_L_1920x1080_240frms.yuv","e:\BMX_R_1920x1080_240frms.yuv"};/*两路YUV文件名*/
  48. FILE *FileResult;/*输出文件名*/
  49. FILE** fp_combine=(FILE**)malloc(sizeof(FILE *)*3);/*申请文件指针*/
  50. int *FileFrameNum=(int *)malloc(sizeof(int)*3);/*每个YUV的帧数*/
  51. char *PreBuf=(char *)malloc(sizeof(char)*(PRESIZE+1));/*处理前每一帧图像的大小*/
  52. char *ResBuf=(char*)malloc(sizeof(char)*(RESSIZE+1));/*处理后每一帧图像的大小*/
  53. int Y_start_section=0;/*预处理图片Y分量存入目标区域的起始区域*/
  54. int U_start_section = 0;/*预处理图片U分量存入目标区域的起始区域*/
  55. int V_start_section = 0;/*预处理图片V分量存入目标区域的起始区域*/
  56. int File_offset = 0;/*预处理文件偏移值*/
  57. int i_combine=0,j_combine=0,k_combine=0;/*控制循环*/
  58. /*判断申请内存是否成功*/
  59. if (!((fp_combine)&&(FileFrameNum)&&(PreBuf)&&(ResBuf)))
  60. {
  61. printf("Allocate memeroy Faile !");
  62. exit(1);
  63. }
  64. /*初始化申请空间*/
  65. memset(fp_combine,0,sizeof(FILE *)*2);
  66. memset(FileFrameNum,0,sizeof(int)*2);
  67. memset(PreBuf,0,sizeof(char)*PRESIZE);
  68. memset(ResBuf,0,sizeof(char)*RESSIZE);
  69. if (!(FileResult=fopen("hua_result.YUV","wb")))/*创建输出文件*/
  70. {
  71. printf("Creat File faile !");
  72. exit(1);
  73. }
  74. for (i_combine=0;i_combine<2;i_combine++)
  75. {
  76. if(!(fp_combine[i_combine]=fopen(FileName[i_combine],"rb")))/*打开输入文件*/
  77. {
  78. printf("Open File %s Faile !",FileName[i_combine]);
  79. exit(1);
  80. }
  81. else
  82. {
  83. FileFrameNum[i_combine]=GetFrameNum(FileName[i_combine]);/*存储每一个视频的帧数*/
  84. }
  85. }
  86. i_combine=0;
  87. k_combine=FileFrameNum[i_combine];
  88. while (i_combine<k_combine)
  89. {
  90. File_offset = i_combine*PRESIZE;
  91. j_combine=0;
  92. while (j_combine<2)
  93. {
  94. fseek(fp_combine[j_combine],File_offset,SEEK_SET);/*移动文件指针至需要处理的数据的位置*/
  95. fread(PreBuf,1,PRESIZE,fp_combine[j_combine]);/*读取一幅图像*/
  96. if (j_combine==0)
  97. {
  98. /*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/
  99. Y_start_section=0;
  100. U_start_section=RESYSIZE;
  101. V_start_section=RESYSIZE+RESUSIZE;
  102. }
  103. else
  104. {
  105. /*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/
  106. Y_start_section=PREWEIGHT;
  107. U_start_section=RESYSIZE+PREWEIGHT/2;
  108. V_start_section=RESYSIZE+RESUSIZE+PREWEIGHT/2;
  109. }
  110. /*分别读Y、U、V*/
  111. ReadYUV(ResBuf,PreBuf,Y_start_section,0,                 RESWEIGHT,PREWEIGHT,PREWEIGHT,PREHEIGHT);
  112. ReadYUV(ResBuf,PreBuf,U_start_section,PREYSIZE,          RESWEIGHT/2,PREWEIGHT/2,PREWEIGHT/2,PREHEIGHT/2);
  113. ReadYUV(ResBuf,PreBuf,V_start_section,PREYSIZE+PREUSIZE, RESWEIGHT/2,PREWEIGHT/2,PREWEIGHT/2,PREHEIGHT/2);
  114. j_combine++;
  115. }
  116. fwrite(ResBuf,1,RESSIZE,FileResult);
  117. fflush(FileResult);
  118. i_combine++;
  119. }
  120. fclose(fp_combine[0]);
  121. fclose(fp_combine[1]);
  122. fclose(FileResult);
  123. return 0;
  124. }

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

图像处理之基础---2个YUV视频 拼接技术的更多相关文章

  1. 2个YUV视频拼接技术

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

  2. 基于SURF特征的图像与视频拼接技术的研究和实现(一)

    基于SURF特征的图像与视频拼接技术的研究和实现(一)      一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...

  3. 使用D3D渲染YUV视频数据

    源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...

  4. FFmpeg YUV视频序列编码为视频

    上一篇已经写了如何配置好开发环境,这次就先小试牛刀,来个视频的编码.搞视频处理的朋友肯定比较熟悉YUV视频序列,很多测试库提供的视频数据都是YUV视频序列,我们这里就用用YUV视频序列来做视频.关于Y ...

  5. 使用D3D渲染YUV视频数据<转>

    源代码下载 转载地址:http://blog.csdn.net/dengzikun/article/details/5824874 源码地址:http://download.csdn.net/down ...

  6. 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现

    一.前言 Hi,大家好,我是承香墨影! 开门见山,开篇名义.今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放. 这样的需求应该不算偏门吧? 最简单的就是一些视频 App,会将大段 ...

  7. avi视频格式转yuv格式与播放yuv视频

    因为要用到yuv格式视频.而眼下仅仅有avi格式的视频,所以须要转换,而且opencv不支持yuv编码的视频播放.所以须要转换为rgb编码.而后播放.写了两个程序.以供參考: 1,avi格式视频转yu ...

  8. 一些yuv视频下载地址

    因为测试需要下载一些yuv视频地址,现存一个可以下载yuv视频的地址以备后用 http://trace.eas.asu.edu/yuv/index.html ftp://ftp.ldv.e-techn ...

  9. YUV视频格式详解(翻译自微软文档)

    原文: https://docs.microsoft.com/en-us/previous-versions/aa904813(v=vs.80) YUV视频格式详解(翻译自微软文档)https://b ...

随机推荐

  1. java代码中执行liunx命令

    public static String runShell(String command){ try{ String[] commands = isLinux()?new String[]{" ...

  2. linux-shell父子进程

          用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令声明变量,也可以创建并运行 shell脚本程序.运行shell脚本程序时,系统将创建一个 ...

  3. Spring Boot中使用Feign调用时Hystrix提示异常:"could not be queued for execution and no fallback available."以及"Rejected command because thread-pool queueSize is at rejection threshold"

    说明: 1.我还没有真正理解Spring Cloud的精髓,现只停留在使用阶段,可能存在分析不到位的问题. 1.这个是由于线程池的最大数量导致的,官方说随着线程池的数量越大,资源开销也就越大,所以调整 ...

  4. MySQL索引,MySQL性能分析及explain的使用,分析SQL查询性能

    可以使用explain来分析MySQL查询性能,举例如下: 1.使用explain语句去查看分析结果 如 explain select * from test1 where id=1; 会出现: id ...

  5. 国内 docker 仓库镜像对比

    http://www.datastart.cn/tech/2016/09/28/docker-mirror.html

  6. 跟着Sedgewick学算法(week 1 ElementarySort)

     链接https://www.evernote.com/shard/s408/sh/dbe0167f-20e0-41c4-a49b-75717ad98695/461148482ffb6add092be ...

  7. hmac的python实现

    Hash-based message authentication code,利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出 可以查看python的内置模块hmac.py的源码来学 ...

  8. 利用【深度网络】高效提取feature

    extracting features from a learned model, and add some new features yourself.

  9. GPU hang

    最近做新项目 初期一直遇到个gpu hang的问题 就是command 提交过去gpu 就一直在那里 直到time out 也没什么别的错误提示 gpu debugger还抓不了 解决方案是 缩小之后 ...

  10. Java程序IP v6与IP v4的设置

    Java程序IP v6与IP v4的设置 //Prevent to get IPV6 address,this way only work in debug mode //But you can pa ...