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

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

3、zimo_gr.zip
取字幕的软件

 /*
* Copyright(C), 2008-2013, Ubuntu Inc.
* File name: main.c
* Author: xubinbin 徐彬彬 (Beijing China)
* Version: 1.0
* Date: 2013.06.09
* Description:
* Function List: char *draw_Font_Func(char *ptr_frame,const unsigned char font[],int startx,int starty,int color)
* Email: xubbwd@gmail.com
*/ #include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h> #include "zimo.h" #define FRAME_WIDTH (352)
#define FRAME_HEIGHT (288)
#define FRAME_SIZE (FRAME_WIDTH*FRAME_HEIGHT*3/2)
#define IN_FILENAME "in.raw"
#define OUT_FILENAME "out.raw" const unsigned char table[] = { /*-- 文字: 陈 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x40,0x78,0x40,0x48,0x40,0x57,0xFE,0x50,0x80,0x61,0x20,0x51,0x20,0x4A,0x20,
0x4B,0xFC,0x48,0x20,0x69,0x28,0x51,0x24,0x42,0x22,0x44,0x22,0x40,0xA0,0x40,0x40, /*-- 文字: 桂 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x20,0x10,0x20,0x11,0xFC,0x10,0x20,0xFC,0x20,0x10,0x20,0x33,0xFE,0x38,0x00,
0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00, /*-- 文字: 芳 --*/
/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/
0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x0A,0x20,0x01,0x00,0xFF,0xFE,0x04,0x00,
0x04,0x00,0x07,0xF0,0x04,0x10,0x08,0x10,0x08,0x10,0x10,0x10,0x20,0xA0,0x40,0x40, }; /*
* Function: draw_Font_Func
* Description: 实现在yuv420图片上面画字
* Input: char *ptr_frame 一帧视频的首地址
* const unsigned char font[] 画的字模
* int startx 写字的起点坐标x
* int starty 写字的起点坐标y
* int color 字颜色的选择,具体颜色在程序代码
* Return: 这里会把传进来的一帧视频的地址返回,可以不调用
*/
char *draw_Font_Func(char *ptr_frame,const unsigned char font[],int startx,int starty,int color)
{ assert( ptr_frame != NULL ); int tagY=,tagU=,tagV=;
char *offsetY=NULL,*offsetU=NULL,*offsetV=NULL;
unsigned short p16, mask16; // for reading hzk16 dots /*yuv 地址的设置 */
offsetY = ptr_frame;
offsetU = offsetY + FRAME_WIDTH * FRAME_HEIGHT;
offsetV = offsetU + FRAME_WIDTH * FRAME_HEIGHT/; switch (color)
{
case : // Yellow
tagY = ;tagU = ;tagV = ;
break;
case : // Red
tagY = ;tagU = ;tagV = ;
break;
case : // Green
tagY = ;tagU = ;tagV = ;
break;
case : // Blue
tagY = ;tagU = ;tagV = ;
break;
default: // White
tagY = ;tagU = ;tagV = ;
} int x=,y=,i=,j=,k=;
for(i = ; i < ; i++)
{
#if 0
for (j = , y = starty; j < && y < FRAME_HEIGHT - ; j++, y+=) // line dots per char
{
p16 = *(unsigned short *)(font + j* + i*);/*取字模数据*/
mask16 = 0x0080; /* 二进制 1000 0000 */
for (k = , x = startx +i*; k < && x < FRAME_WIDTH - ; k++, x+=) // dots in a line
{
if (p16 & mask16)
{
*(offsetY + y*FRAME_WIDTH + x) = *(offsetY + y*FRAME_WIDTH + x+) = tagY;
*(offsetY + (y+)*FRAME_WIDTH + x) = *(offsetY + (y+)*FRAME_WIDTH + x+) = tagY;
*(offsetU + y * FRAME_WIDTH/ + x/) =tagU;
*(offsetV + y * FRAME_WIDTH/ + x/) = tagV;
}
mask16 = mask16 >> ; /* 循环移位取数据 */
if (mask16 == )
mask16 = 0x8000;
}
}
#else
for (j = , y = starty; j < && y < FRAME_HEIGHT - ; j++, y++) // line dots per char
{
p16 = *(unsigned short *)(font + j* + i*);/*取字模数据*/
mask16 = 0x0080; /* 二进制 1000 0000 */
for (k = , x = startx +i*; k < && x < FRAME_WIDTH - ; k++, x++) // dots in a line
{
if (p16 & mask16)
{
*(offsetY + y*FRAME_WIDTH + x) = ;
// *(offsetU + y * FRAME_WIDTH/4 + x/2) = 85;
// *(offsetV + y * FRAME_WIDTH/4 + x/2) = 255;
}
mask16 = mask16 >> ; /* 循环移位取数据 */
if (mask16 == )
mask16 = 0x8000;
}
}
#endif
} return (char *)ptr_frame;
} int main(int argc,char * argv[])
{
int ret = ;
FILE *in_file,*out_file; char *frame_buffer = NULL;
frame_buffer = (char*)malloc(FRAME_SIZE); //read frame file 读原来的一帧数据
in_file = fopen(IN_FILENAME,"r");
if (in_file == NULL)
{
printf("open in file error!\n");
} ret = fread(frame_buffer,FRAME_SIZE,,in_file);
if (ret != )
{
printf("ret = %d\n");
printf("fread file error!\n");
}
fclose(in_file); //数据转换
draw_Font_Func(frame_buffer,table,,,); //write frame file 把数据写回
out_file = fopen(OUT_FILENAME,"w");
if (out_file == NULL)
{
printf("open in file error!\n");
} ret = fwrite(frame_buffer,FRAME_SIZE,,out_file);
if (ret != )
{
printf("ret = %d\n");
printf("fwrite file error!\n");
}
fclose(out_file);
free(frame_buffer); printf("Done!\n");
return ;
}

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. 51nod 1649.齐头并进-最短路(Dijkstra)

    1649 齐头并进 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 在一个叫奥斯汀的城市,有n个小镇(从1到n编号),这些小镇通过 ...

  2. 阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了

    项目在本地是可以成功运行的,网上看到一堆各式各样的解决办法感觉都不适合我,于是绝望的删webapps,重新上传,一直不行. 重复了第3次还是第4次,居然就好了,这是什么操作.

  3. spoj - Distinct Substrings(后缀数组)

    Distinct Substrings 题意 求一个字符串有多少个不同的子串. 分析 又一次体现了后缀数组的强大. 因为对于任意子串,一定是这个字符串的某个后缀的前缀. 我们直接去遍历排好序后的后缀字 ...

  4. POJ1273 Drainage Ditches (网络流)

                                                             Drainage Ditches Time Limit: 1000MS   Memor ...

  5. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  6. [BZOJ3237][AHOI2013]连通图(分治并查集)

    3237: [Ahoi2013]连通图 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1736  Solved: 655[Submit][Status ...

  7. java File和Byte[]数组 相互转换

    public class Test { public static void main(String[] args){ String filePath = "E:\\softoon\\wor ...

  8. iOS8下的远程推送

    本篇文章主要介绍了"iOS8下的远程推送",主要涉及到方面的内容,对于IOS开发感兴趣的同学可以参考一下: 昨天做了一下远程推送,今天写下来,分享给需要的人.参考了很多篇文章,或许 ...

  9. [android]加载大量图片避免OOM

    原理是事先取得图片的长宽,直接读出缩略图. BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferr ...

  10. Linux文件名小写的好处(转)

    说明:来自老阮的<为什么文件名要小写>的文章,其实我觉得应该说是<Linux文件名为什么要小写>会更合适些. 一.可移植性 Linux 系统是大小写敏感的,而 Windows ...