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=0,tagU=0,tagV=0;
 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/4;
 67
 68     switch (color)
 69     {
 70         case 0:         // Yellow
 71             tagY = 226;tagU = 0;tagV = 149;
 72             break;
 73         case 1:         // Red
 74             tagY = 76;tagU = 85;tagV = 255;
 75             break;
 76         case 2:         // Green
 77             tagY = 150;tagU = 44;tagV = 21;
 78             break;
 79         case 3:         // Blue
 80             tagY = 29;tagU = 255;tagV = 107;
 81             break;
 82         default:        // White
 83             tagY = 128;tagU = 128;tagV = 128;
 84     }
 85
 86     int x=0,y=0,i=1,j=0,k=0;
 87     for(i = 0; i < 3; i++)
 88     {
 89     #if 0
 90         for (j = 0, y = starty; j < 16 && y < FRAME_HEIGHT - 1; j++, y+=2)    // line dots per char
 91         {
 92             p16 = *(unsigned short *)(font + j*2 + i*32);/*取字模数据*/
 93             mask16 = 0x0080;  /* 二进制 1000 0000 */
 94             for (k = 0, x = startx +i*36; k < 16 && x < FRAME_WIDTH - 1; k++, x+=2)   // dots in a line
 95             {
 96                 if (p16 & mask16)
 97                 {
 98                     *(offsetY + y*FRAME_WIDTH + x) = *(offsetY + y*FRAME_WIDTH + x+1) = tagY;
 99                     *(offsetY + (y+1)*FRAME_WIDTH + x) = *(offsetY + (y+1)*FRAME_WIDTH + x+1) = tagY;
100                     *(offsetU + y * FRAME_WIDTH/4 + x/2) =tagU;
101                     *(offsetV + y * FRAME_WIDTH/4 + x/2) = tagV;
102                 }
103                 mask16 = mask16 >> 1;  /* 循环移位取数据 */
104                 if (mask16 == 0)
105                     mask16 = 0x8000;
106             }
107         }
108     #else
109         for (j = 0, y = starty; j < 16 && y < FRAME_HEIGHT - 1; j++, y++) // line dots per char
110         {
111             p16 = *(unsigned short *)(font + j*2 + i*32);/*取字模数据*/
112             mask16 = 0x0080;  /* 二进制 1000 0000 */
113             for (k = 0, x = startx +i*18; k < 16 && x < FRAME_WIDTH - 1; k++, x++) // dots in a line
114             {
115                 if (p16 & mask16)
116                 {
117                     *(offsetY + y*FRAME_WIDTH + x) = 255;
118                 //  *(offsetU + y * FRAME_WIDTH/4 + x/2) = 85;
119                 //  *(offsetV + y * FRAME_WIDTH/4 + x/2) = 255;
120                 }
121                 mask16 = mask16 >> 1;  /* 循环移位取数据 */
122                 if (mask16 == 0)
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 = 0;
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,1,in_file);
148     if (ret != 1)
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,20,10,1);
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,1,out_file);
166     if (ret != 1)
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 0;
176 }

YUV420视频上面添加字幕相关推荐

  1. iOS使用AVFoundation在视频上添加字幕以及控制字幕时间

    IOS在视频上添加字幕效果的基本思路是: 使用自定义的CATextLayer文字图层或者CAShapeLayer文字图层,添加到视频的Layer上创建用户自定义的字幕效果.这两者的区别是:CAText ...

  2. 视频怎么添加字幕?这几种添加字幕方法都很简单

    给视频添加字幕可以在视频观看中起到很多作用,不仅可以帮助听力不好的人更好地理解视频内容,还可以帮助学习外语的人提高语言能力,同时还可以增强视听体验.在这个数字时代,字幕越来越成为了视频制作的重要组成部 ...

  3. 如何给视频制作添加字幕?

    如何给视频制作添加字幕?submerge mac可以轻松为电影电视和其他视频文件制作字幕,它内置有一个全屏幕播放器,你可以直接查看电影字幕,同时还有字幕搜索工具,使查找和下载正确的字幕轻而易举. Su ...

  4. Camtasia视频编辑添加字幕的步骤(记录操作以备后用)

    1.先新建项目后,点击,然后就可以进行视频同步添加字幕了. 2.点击,就可以选择导入字幕方式. 3.也可以点击然后,手动将字幕加进去. 可以随时间逐段添加进去. 4.如何设置字幕背景与字体,字号,颜色 ...

  5. 短视频怎么添加字幕?三个软件帮你解决添加字幕的问题

    在我还在当b站up主的那段时间里,每天犯难的就是剪视频,给视频加字幕.而且我还是一个观点类up主,里面有的词是专有名词,比较生僻,但我又不会加字幕,所以点击率一直上不去.众所周知,有字幕的点击率比没有 ...

  6. 07-----给音视频文件添加字幕流

    添加字幕流可以使用ACHTIME软件去添加. 一 下载ACHTIME软件 在下载之前我们需要注册一个账号.然后才能下载. http://arctime.cn/download.html 二 添加字幕流 ...

  7. 【短视频运营】短视频剪辑 ③ ( 添加字幕 | 智能识别字幕 | 修改字幕 | 字幕预设 | 字幕换行 | 使用字幕作为封面主题 )

    文章目录 一.添加字幕 ( 智能识别字幕 ) 二.修改字幕 ( 字幕预设 | 字幕换行 ) 三.使用字幕作为封面主题 一.添加字幕 ( 智能识别字幕 ) 在 素材 面板中 , 选择 " 文本 ...

  8. 如何在视频上添加字幕?试试这几个方法吧

    我有一个朋友,他是一名游戏爱好者.前几天,他制作了一个新的游戏教程,并想要将其上传到网络上.这时,他突然看到有一些观众留言说:"视频做的不错,但是能不能加个字幕方便理解".为了满足 ...

  9. html将字幕添加到视频链接,目前最高效,给视频自动添加字幕的方法

    思路: 1.从视频提取出audio音频部分,存为mp3文件 2.使用语音识别工具,将mp3文件转换成srt字幕文件 3.使用Adobe Premiere Pro CC 2018(PR),将字幕合入视频 ...

最新文章

  1. 5个最佳的Android测试框架
  2. Java知多少(23)类的基本运行顺序
  3. c语言程序设计一元二次函数,计算一元二次函数的根,大家看看那里有错了。。。。...
  4. 三禧科技 工业机器人_redmi note 9 即将发布,三剑齐发! 三禧科技
  5. 研发协同平台数据库死锁处理及改进
  6. 两台linux之间互传php脚本,linux下两台服务器实现同步的方法
  7. java-log入门【目的把日志写入socket】
  8. 省选专练SCOI2015小凸想跑步
  9. 如何自动生成PDF书签
  10. 【matlab小白训练】BP神经网络
  11. 龙芯源码编译mysql_龙芯服务器安装总结
  12. python一笔画五角星_隐藏在一笔画五角星中的秘密,画法简单的符号,却有丰厚的内涵...
  13. Zigbee设备类型选择
  14. Maltrail恶意流量检测系统
  15. pictureselector 压缩_PictureSelector
  16. 如何在css中设置音乐效果,css实现简单音乐符效果
  17. 对互联网产品运营的理解
  18. Vs —— 转移Qt项目后环境问题
  19. linux 命令 ls
  20. 读懂消费贷款之中国消费金融发展史

热门文章

  1. 模型并行,数据并行,参数平均,ASGD
  2. 巧用天翼云盘备份云主机数据
  3. PHPWord在文档中插入表格
  4. excel锁定单元格不能修改_【软件应用】工程中经常运用的Excel技巧(附教程下载)...
  5. 软件测试面试宝典,大厂测试高频面试题详解一网打尽,速看
  6. 手机上如何学会使用计算机,手机怎么投屏到电脑上,我这儿有4种方法,一分钟让你学会...
  7. Leetcode刷题记录 735. 行星碰撞
  8. golang转换时间格式报missing Location in call to Date
  9. 开放域对话预训练模型总结
  10. ubuntu18.04安装显卡驱动,Anaconda,CUDA,pytorch全套流程