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. sql查询,如果有更新时间则按更新时间倒序,没有则按创建时间倒序排列

    原文:sql查询,如果有更新时间则按更新时间倒序,没有则按创建时间倒序排列 ORDER BY IFNULL(update_time,create_time) DESC IFNULL(expr1,exp ...

  2. JAVA 线程池以及其他

    http://www.cnblogs.com/dolphin0520/ http://www.cnblogs.com/absfree/category/801869.html

  3. 【转】三种方式在C++中调用matlab

      C/C++调用Matlab 在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎.包含m 文件转 换的C/C++文件,以及调用m文件生成的DLL 文件. 1 利用Mat ...

  4. ASIHTTPRequest学习(四)

    如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这 ...

  5. 【AS3 Coder】任务五:Flash 2D游戏的第二春(中)

    在上一节中,我们介绍了如何构建我们小小的90度角RPG游戏的背景,在这一节中我将为列位带来重头戏部分,隆重介绍我们的主角及NPC登场,噔噔噔噔……掌声在哪里?! 额,没听到掌声,罢了,直接开场吧. 本 ...

  6. Linux Shell常用技巧

    转载自http://www.cnblogs.com/stephen-liu74/ 一.    特殊文件: /dev/null和/dev/tty Linux系统提供了两个对Shell编程非常有用的特殊文 ...

  7. ASP.NET MVC学习---(二)EF文件结构

    之前已经简单的介绍过ORM框架和EF 也了解了EF的种种优点 那么这个EF到底长啥样子都还没见过呢 别着急 接下来,科学教育频道--走近科学 带你走进EF的内心世界~ 那么接下来就是~ 等等等等... ...

  8. Cygwin-安装和配置ssh服务

    Cygwin介绍: Cygwin是一个在windows平台上执行的类UNIX模拟环境.它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作, ...

  9. go语言25个关键字总结

    var和const :变量和常量的声明var varName type 或者 varName : = valuepackage and import: 导入func: 用于定义函数和方法return ...

  10. Laravel之缓存

    一.默认缓存的配置 缓存配置位于config/cache.php,你可以使用memcache,redis,数据库缓存,文件缓存等.默认是文件缓存 二.缓存获取 1.获取 $value = Cache: ...