YUV420视频上面添加字幕
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视频上面添加字幕相关推荐
- iOS使用AVFoundation在视频上添加字幕以及控制字幕时间
IOS在视频上添加字幕效果的基本思路是: 使用自定义的CATextLayer文字图层或者CAShapeLayer文字图层,添加到视频的Layer上创建用户自定义的字幕效果.这两者的区别是:CAText ...
- 视频怎么添加字幕?这几种添加字幕方法都很简单
给视频添加字幕可以在视频观看中起到很多作用,不仅可以帮助听力不好的人更好地理解视频内容,还可以帮助学习外语的人提高语言能力,同时还可以增强视听体验.在这个数字时代,字幕越来越成为了视频制作的重要组成部 ...
- 如何给视频制作添加字幕?
如何给视频制作添加字幕?submerge mac可以轻松为电影电视和其他视频文件制作字幕,它内置有一个全屏幕播放器,你可以直接查看电影字幕,同时还有字幕搜索工具,使查找和下载正确的字幕轻而易举. Su ...
- Camtasia视频编辑添加字幕的步骤(记录操作以备后用)
1.先新建项目后,点击,然后就可以进行视频同步添加字幕了. 2.点击,就可以选择导入字幕方式. 3.也可以点击然后,手动将字幕加进去. 可以随时间逐段添加进去. 4.如何设置字幕背景与字体,字号,颜色 ...
- 短视频怎么添加字幕?三个软件帮你解决添加字幕的问题
在我还在当b站up主的那段时间里,每天犯难的就是剪视频,给视频加字幕.而且我还是一个观点类up主,里面有的词是专有名词,比较生僻,但我又不会加字幕,所以点击率一直上不去.众所周知,有字幕的点击率比没有 ...
- 07-----给音视频文件添加字幕流
添加字幕流可以使用ACHTIME软件去添加. 一 下载ACHTIME软件 在下载之前我们需要注册一个账号.然后才能下载. http://arctime.cn/download.html 二 添加字幕流 ...
- 【短视频运营】短视频剪辑 ③ ( 添加字幕 | 智能识别字幕 | 修改字幕 | 字幕预设 | 字幕换行 | 使用字幕作为封面主题 )
文章目录 一.添加字幕 ( 智能识别字幕 ) 二.修改字幕 ( 字幕预设 | 字幕换行 ) 三.使用字幕作为封面主题 一.添加字幕 ( 智能识别字幕 ) 在 素材 面板中 , 选择 " 文本 ...
- 如何在视频上添加字幕?试试这几个方法吧
我有一个朋友,他是一名游戏爱好者.前几天,他制作了一个新的游戏教程,并想要将其上传到网络上.这时,他突然看到有一些观众留言说:"视频做的不错,但是能不能加个字幕方便理解".为了满足 ...
- html将字幕添加到视频链接,目前最高效,给视频自动添加字幕的方法
思路: 1.从视频提取出audio音频部分,存为mp3文件 2.使用语音识别工具,将mp3文件转换成srt字幕文件 3.使用Adobe Premiere Pro CC 2018(PR),将字幕合入视频 ...
最新文章
- 5个最佳的Android测试框架
- Java知多少(23)类的基本运行顺序
- c语言程序设计一元二次函数,计算一元二次函数的根,大家看看那里有错了。。。。...
- 三禧科技 工业机器人_redmi note 9 即将发布,三剑齐发! 三禧科技
- 研发协同平台数据库死锁处理及改进
- 两台linux之间互传php脚本,linux下两台服务器实现同步的方法
- java-log入门【目的把日志写入socket】
- 省选专练SCOI2015小凸想跑步
- 如何自动生成PDF书签
- 【matlab小白训练】BP神经网络
- 龙芯源码编译mysql_龙芯服务器安装总结
- python一笔画五角星_隐藏在一笔画五角星中的秘密,画法简单的符号,却有丰厚的内涵...
- Zigbee设备类型选择
- Maltrail恶意流量检测系统
- pictureselector 压缩_PictureSelector
- 如何在css中设置音乐效果,css实现简单音乐符效果
- 对互联网产品运营的理解
- Vs —— 转移Qt项目后环境问题
- linux 命令 ls
- 读懂消费贷款之中国消费金融发展史
热门文章
- 模型并行,数据并行,参数平均,ASGD
- 巧用天翼云盘备份云主机数据
- PHPWord在文档中插入表格
- excel锁定单元格不能修改_【软件应用】工程中经常运用的Excel技巧(附教程下载)...
- 软件测试面试宝典,大厂测试高频面试题详解一网打尽,速看
- 手机上如何学会使用计算机,手机怎么投屏到电脑上,我这儿有4种方法,一分钟让你学会...
- Leetcode刷题记录 735. 行星碰撞
- golang转换时间格式报missing Location in call to Date
- 开放域对话预训练模型总结
- ubuntu18.04安装显卡驱动,Anaconda,CUDA,pytorch全套流程