1、source_code
main.c中实现了函数draw_Font_Func(),这个函数可以直接移植到C程序中使用。
zimo.h里面放的是字模转码后的数据。

2、data_yuv
测试用的yuv420数据(352*288) CIF格式,测试前后的数据。

3、zimo_gr.zip
取字幕的软件

  1. /*
  2. * Copyright(C), 2008-2013, Ubuntu Inc.
  3. * File name: main.c
  4. * Author: xubinbin 徐彬彬 (Beijing China)
  5. * Version: 1.0
  6. * Date: 2013.06.09
  7. * Description:
  8. * Function List: char *draw_Font_Func(char *ptr_frame,const unsigned char font[],int startx,int starty,int color)
  9. * Email: xubbwd@gmail.com
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <assert.h>
  15. #include <string.h>
  16.  
  17. #include "zimo.h"
  18.  
  19. #define FRAME_WIDTH (352)
  20. #define FRAME_HEIGHT (288)
  21. #define FRAME_SIZE (FRAME_WIDTH*FRAME_HEIGHT*3/2)
  22. #define IN_FILENAME "in.raw"
  23. #define OUT_FILENAME "out.raw"
  24.  
  25. const unsigned char table[] = {
  26.  
  27. /*-- 文字: 陈 --*/
  28. /*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
  29. 0x00,0x40,0x78,0x40,0x48,0x40,0x57,0xFE,0x50,0x80,0x61,0x20,0x51,0x20,0x4A,0x20,
  30. 0x4B,0xFC,0x48,0x20,0x69,0x28,0x51,0x24,0x42,0x22,0x44,0x22,0x40,0xA0,0x40,0x40,
  31.  
  32. /*-- 文字: 桂 --*/
  33. /*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
  34. 0x10,0x20,0x10,0x20,0x11,0xFC,0x10,0x20,0xFC,0x20,0x10,0x20,0x33,0xFE,0x38,0x00,
  35. 0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00,
  36.  
  37. /*-- 文字: 芳 --*/
  38. /*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
  39. 0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x0A,0x20,0x01,0x00,0xFF,0xFE,0x04,0x00,
  40. 0x04,0x00,0x07,0xF0,0x04,0x10,0x08,0x10,0x08,0x10,0x10,0x10,0x20,0xA0,0x40,0x40,
  41.  
  42. };
  43.  
  44. /*
  45. * Function: draw_Font_Func
  46. * Description: 实现在yuv420图片上面画字
  47. * Input: char *ptr_frame 一帧视频的首地址
  48. * const unsigned char font[] 画的字模
  49. * int startx 写字的起点坐标x
  50. * int starty 写字的起点坐标y
  51. * int color 字颜色的选择,具体颜色在程序代码
  52. * Return: 这里会把传进来的一帧视频的地址返回,可以不调用
  53. */
  54. char *draw_Font_Func(char *ptr_frame,const unsigned char font[],int startx,int starty,int color)
  55. {
  56.  
  57. assert( ptr_frame != NULL );
  58.  
  59. int tagY=,tagU=,tagV=;
  60. char *offsetY=NULL,*offsetU=NULL,*offsetV=NULL;
  61. unsigned short p16, mask16; // for reading hzk16 dots
  62.  
  63. /*yuv 地址的设置 */
  64. offsetY = ptr_frame;
  65. offsetU = offsetY + FRAME_WIDTH * FRAME_HEIGHT;
  66. offsetV = offsetU + FRAME_WIDTH * FRAME_HEIGHT/;
  67.  
  68. switch (color)
  69. {
  70. case : // Yellow
  71. tagY = ;tagU = ;tagV = ;
  72. break;
  73. case : // Red
  74. tagY = ;tagU = ;tagV = ;
  75. break;
  76. case : // Green
  77. tagY = ;tagU = ;tagV = ;
  78. break;
  79. case : // Blue
  80. tagY = ;tagU = ;tagV = ;
  81. break;
  82. default: // White
  83. tagY = ;tagU = ;tagV = ;
  84. }
  85.  
  86. int x=,y=,i=,j=,k=;
  87. for(i = ; i < ; i++)
  88. {
  89. #if 0
  90. for (j = , y = starty; j < && y < FRAME_HEIGHT - ; j++, y+=) // line dots per char
  91. {
  92. p16 = *(unsigned short *)(font + j* + i*);/*取字模数据*/
  93. mask16 = 0x0080; /* 二进制 1000 0000 */
  94. for (k = , x = startx +i*; k < && x < FRAME_WIDTH - ; k++, x+=) // dots in a line
  95. {
  96. if (p16 & mask16)
  97. {
  98. *(offsetY + y*FRAME_WIDTH + x) = *(offsetY + y*FRAME_WIDTH + x+) = tagY;
  99. *(offsetY + (y+)*FRAME_WIDTH + x) = *(offsetY + (y+)*FRAME_WIDTH + x+) = tagY;
  100. *(offsetU + y * FRAME_WIDTH/ + x/) =tagU;
  101. *(offsetV + y * FRAME_WIDTH/ + x/) = tagV;
  102. }
  103. mask16 = mask16 >> ; /* 循环移位取数据 */
  104. if (mask16 == )
  105. mask16 = 0x8000;
  106. }
  107. }
  108. #else
  109. for (j = , y = starty; j < && y < FRAME_HEIGHT - ; j++, y++) // line dots per char
  110. {
  111. p16 = *(unsigned short *)(font + j* + i*);/*取字模数据*/
  112. mask16 = 0x0080; /* 二进制 1000 0000 */
  113. for (k = , x = startx +i*; k < && x < FRAME_WIDTH - ; k++, x++) // dots in a line
  114. {
  115. if (p16 & mask16)
  116. {
  117. *(offsetY + y*FRAME_WIDTH + x) = ;
  118. // *(offsetU + y * FRAME_WIDTH/4 + x/2) = 85;
  119. // *(offsetV + y * FRAME_WIDTH/4 + x/2) = 255;
  120. }
  121. mask16 = mask16 >> ; /* 循环移位取数据 */
  122. if (mask16 == )
  123. mask16 = 0x8000;
  124. }
  125. }
  126. #endif
  127. }
  128.  
  129. return (char *)ptr_frame;
  130. }
  131.  
  132. int main(int argc,char * argv[])
  133. {
  134. int ret = ;
  135. FILE *in_file,*out_file;
  136.  
  137. char *frame_buffer = NULL;
  138. frame_buffer = (char*)malloc(FRAME_SIZE);
  139.  
  140. //read frame file 读原来的一帧数据
  141. in_file = fopen(IN_FILENAME,"r");
  142. if (in_file == NULL)
  143. {
  144. printf("open in file error!\n");
  145. }
  146.  
  147. ret = fread(frame_buffer,FRAME_SIZE,,in_file);
  148. if (ret != )
  149. {
  150. printf("ret = %d\n");
  151. printf("fread file error!\n");
  152. }
  153. fclose(in_file);
  154.  
  155. //数据转换
  156. draw_Font_Func(frame_buffer,table,,,);
  157.  
  158. //write frame file 把数据写回
  159. out_file = fopen(OUT_FILENAME,"w");
  160. if (out_file == NULL)
  161. {
  162. printf("open in file error!\n");
  163. }
  164.  
  165. ret = fwrite(frame_buffer,FRAME_SIZE,,out_file);
  166. if (ret != )
  167. {
  168. printf("ret = %d\n");
  169. printf("fwrite file error!\n");
  170. }
  171. fclose(out_file);
  172. free(frame_buffer);
  173.  
  174. printf("Done!\n");
  175. return ;
  176. }

YUV420视频上面添加字幕的更多相关文章

  1. (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究

    使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究 Author:lihaiping1603@aliyun.com Create:2019-09-04 最近对ffmpeg给视频文件添加字幕效果 ...

  2. 在object,embed上添加跳转链接(视频上添加跳转)

    今天遇到个问题,就是在视频上添加跳转链接时,谷歌浏览器能正常跳转,但是ie下,却无效,视频使用object引入,<a>标签跟随其后采用绝对定位,和平时的图片加跳转操作一样.原来是需要加上& ...

  3. FFmpeg 向视频中添加文字

    原文地址:http://www.cnblogs.com/wanggang123/p/6707985.html FFmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文 ...

  4. Ffmpeg 视频教程 向视频中添加文字

    Ffmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文字库FreeSerif.ttf.当我们 用到ffmpeg 添加文字功能时 我们需要先下载改文字库,下载地址是h ...

  5. php使用ffmpeg向视频中添加文字字幕

    这篇文章主要介绍了PHP使用ffmpeg给视频增加字幕显示的方法,实例分析了php操作ffmpeg给视频增加字母的技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 本文实例讲述了PHP使用ffmpe ...

  6. 如何通过PR给视频添加字幕?

    第一步:将视频通过导出音频格式MP3 第二步:将音频MP3导入网易见外平台 第三步:在网易见外平台创建项目,进行语音转写如下所示: 第四步:将从网易见外平台到处的srt字母文件,打开后进行编码为utf ...

  7. 【AE软件】视频添加字幕

    1.导入视频 2.将视频拖入大屏幕 3.在下面点击右键——新建——文本 4.文字属性设置

  8. AVFoundation播放视频时显示字幕,切换音轨

    主要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption 调用 AVAsset对象的availableMediaCharacteristicsWit ...

  9. TeleMCU视频会议系统添加字幕支持

    本文原创自 http://blog.csdn.net/voipmaker  转载注明出处. 最新版本号TeleMCU添加了字幕支持,与会者能够看到其它人的名字,做法是在与会者的视频上overlay 文 ...

随机推荐

  1. (18)PL/SQL

    PL/SQL(Procedure Language/SQL) PL/SQL是Oracle对sql语言的过程化扩展---指在sql命令语言中增加了过程处理语句(如分支.循环等),使sql语言具有过程处理 ...

  2. UVA 1025 A Spy in the Metro 【DAG上DP/逆推/三维标记数组+二维状态数组】

    Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After s ...

  3. Spring Cloud底层原理(转载 石杉的架构笔记)

    拜托!面试请不要再问我Spring Cloud底层原理 原创: 中华石杉 石杉的架构笔记   目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核 ...

  4. jdbc多种实现方式

    1,驱动加载 //注册驱动 //DriverManager.registerDriver(new Driver());此方法被淘汰 Class.forName("com.mysql.jdbc ...

  5. Android Developer -- Bluetooth篇 开发实例之二 连接设备

    连接设备 In order to create a connection between your application on two devices, you must implement bot ...

  6. .Net中的不可变集合(Immutable Collection)简介

    今天发现MS在Nuget上发布了一个Immutable Collection的程序集,提供了对不可变对象的集合的支持. 简单的看了一下,貌似支持的还比较全: ImmutableArray<T&g ...

  7. 纯CSS实现网站常用的五角星评分和分数展示交互效果

    最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方 ...

  8. ubifs & mtd

    前天晚上在写完另一篇总结之时,赵XX向我咨询了关于mtd 和ubifs的相关内容.而我在这方面只是略懂皮毛,所以向他许愿共同调查这个方面的知识.经过昨天一天的调查,最后感觉是有了一定的经验和基础了,所 ...

  9. ARP/RARP

    IP地址和MAC地址之间的转换   点对点链路不使用ARP   ARP高速缓存   ARP高效运行的关键是每个主机上都有一个ARP高速缓存. 存放了最近IP地址与MAC地址间的映射关系. 每一项生存时 ...

  10. 控制面板cpl大全

    ALSNDMGR.CPL AC97 Audio组态设定appwiz.cpl 添加和删除程序bthprops.cpldesk.cpl   显示属性firewall.cpl Windows防火墙hdwwi ...