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:            [email protected]
 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 }
时间: 2024-12-11 22:13:38

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

如何在视频中添加字幕

用time machine 在ppt里面加载的视频上添加字幕,用STAMP: Subtitling Add-In for PowerPoint: http://www.xuexila.com/ppt/jichu/1697130.html

Linux下使用yamdi为flv视频批量添加关键帧

因为公司业务需要,今天早上领导安排将一批flv的视频添加上关键帧.在这里我使用到了yamdi这个工具,结合一个自己编写的小脚本,顺利完成任务.yamdi的安装在这里就不做记录了,直接贴上脚本.水平有限,欢迎指正. #!/bin/sh echo -n "Please enter the path you want to convert the video:" read path if [ "$path" == "" ] then echo &quo

Ffmpeg drawtext 向视频中添加文字

Ffmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文字库FreeSerif.ttf.当我们 用到ffmpeg 添加文字功能时 我们需要先下载改文字库,下载地址是http://www.fonts2u.com/free-serif.font,这算是 前期准备工作.准备工作完成以后,我来介绍下Ffmpeg实现视频文件添加文字功能的基本流程,流程图如下图所示: 图1. Ffmpeg 向视频添加文字流程

Android 录制视频时,在视频右下角添加时间水印,达到监控录像的效果

录制视频时,在视频右下角添加时间水印,达到监控录像的效果,如下图: 实现步骤如下: 1.制作12张图片,分别是数字0-9,冒号和横折.首先用PS做成png24格式,最好是黑底白字(在代码中将黑色忽略). 2.将上面制作好的12张png图片转成256色的bmp位图,可以使用windows自带的画图程序打开,然后另存为. 3.使用Bmp2c将第2步得到的256色bmp图片,转成c数组. 4.将第3步得到的c数组放到头文件tchip_digital_data.h里. 5.修改frameworks/av

大量经典英文高清动画电影 英语学习视频 中英字幕 儿歌 百度网盘

大量经典英文高清动画电影 英语学习视频 中英字幕 儿歌 百度网盘 **大量迪士尼.皮克斯.索尼的原版英文动画电影** 欢迎来到小店"雄狐工作室",小店的地址是>> 各位亲: 如果你是一个家长,想让小孩在课余时间通过快乐地看英文原版动画电影来提升英语吗? 如果你是一个小学/中学英语教师,想让你的学生们在课堂上观看英语动画电影,寓教于乐吗? 如果你是一个爱好动画/动漫的中学生/大学生,想通过英文动画片来提高自己的英文水平吗? 或者你只是单纯地想自己或者让小孩看看.接触一些优秀的

Focusky教程 | 添加字幕与声音

Focusky动画演示大师(也称为"FS软件")支持用户自行添加字幕与声音. 具体操作请参考以下步骤. 点击缩略图右侧的"添加字幕与声音"按键, 进入编辑页面. [图1▲] 添加声音: 一.    录制声音: 点击"添加录音"-"开始录音", 录音完毕后, 点击"保存"即可. [图2▲] 二.    导入音频: 点击"导入", 可打开本地文件夹, 选择并打开一个音频, 随即导入到工程中.

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

这篇文章主要介绍了PHP使用ffmpeg给视频增加字幕显示的方法,实例分析了php操作ffmpeg给视频增加字母的技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 本文实例讲述了PHP使用ffmpeg给视频增加字幕显示的方法.分享给大家供大家参考.具体实现方法如下: <?php $dir = './'; // set to current folder if ($handle = opendir($dir)) { while(false!== ($file = readdir($handle)

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

主要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption 调用 AVAsset对象的availableMediaCharacteristicsWithMediaSelectionOptions会返回一个数组,这个数组包含视频中备用的媒体资源,AVMediaCharacteristicLegible字幕资源,AVMediaCharacteristicAudible 音轨资源,AVMediaCharacteristicVisual 视频资源. 显示

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

本文原创自 http://blog.csdn.net/voipmaker  转载注明出处. 最新版本号TeleMCU添加了字幕支持,与会者能够看到其它人的名字,做法是在与会者的视频上overlay 文本字幕. 下图是三个client參与的7分屏视频会议画面,一个PCclient,一个WebRTCclient通过Chrome浏览器參与视频会议 ,一个iphone手机,每一个画面左下角有參会者的标识.