YUV420视频上面添加字幕
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视频上面添加字幕的更多相关文章
- (原)使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究
使用ass字幕文件通过ffmpeg给视频添加字幕的一些研究 Author:lihaiping1603@aliyun.com Create:2019-09-04 最近对ffmpeg给视频文件添加字幕效果 ...
- 在object,embed上添加跳转链接(视频上添加跳转)
今天遇到个问题,就是在视频上添加跳转链接时,谷歌浏览器能正常跳转,但是ie下,却无效,视频使用object引入,<a>标签跟随其后采用绝对定位,和平时的图片加跳转操作一样.原来是需要加上& ...
- FFmpeg 向视频中添加文字
原文地址:http://www.cnblogs.com/wanggang123/p/6707985.html FFmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文 ...
- Ffmpeg 视频教程 向视频中添加文字
Ffmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文字库FreeSerif.ttf.当我们 用到ffmpeg 添加文字功能时 我们需要先下载改文字库,下载地址是h ...
- php使用ffmpeg向视频中添加文字字幕
这篇文章主要介绍了PHP使用ffmpeg给视频增加字幕显示的方法,实例分析了php操作ffmpeg给视频增加字母的技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 本文实例讲述了PHP使用ffmpe ...
- 如何通过PR给视频添加字幕?
第一步:将视频通过导出音频格式MP3 第二步:将音频MP3导入网易见外平台 第三步:在网易见外平台创建项目,进行语音转写如下所示: 第四步:将从网易见外平台到处的srt字母文件,打开后进行编码为utf ...
- 【AE软件】视频添加字幕
1.导入视频 2.将视频拖入大屏幕 3.在下面点击右键——新建——文本 4.文字属性设置
- AVFoundation播放视频时显示字幕,切换音轨
主要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption 调用 AVAsset对象的availableMediaCharacteristicsWit ...
- TeleMCU视频会议系统添加字幕支持
本文原创自 http://blog.csdn.net/voipmaker 转载注明出处. 最新版本号TeleMCU添加了字幕支持,与会者能够看到其它人的名字,做法是在与会者的视频上overlay 文 ...
随机推荐
- (18)PL/SQL
PL/SQL(Procedure Language/SQL) PL/SQL是Oracle对sql语言的过程化扩展---指在sql命令语言中增加了过程处理语句(如分支.循环等),使sql语言具有过程处理 ...
- 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 ...
- Spring Cloud底层原理(转载 石杉的架构笔记)
拜托!面试请不要再问我Spring Cloud底层原理 原创: 中华石杉 石杉的架构笔记 目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核 ...
- jdbc多种实现方式
1,驱动加载 //注册驱动 //DriverManager.registerDriver(new Driver());此方法被淘汰 Class.forName("com.mysql.jdbc ...
- Android Developer -- Bluetooth篇 开发实例之二 连接设备
连接设备 In order to create a connection between your application on two devices, you must implement bot ...
- .Net中的不可变集合(Immutable Collection)简介
今天发现MS在Nuget上发布了一个Immutable Collection的程序集,提供了对不可变对象的集合的支持. 简单的看了一下,貌似支持的还比较全: ImmutableArray<T&g ...
- 纯CSS实现网站常用的五角星评分和分数展示交互效果
最近做的一个项目涉及到评分和展示分数的模块,UI设计师也给了几个切好的图片,实现五角星评分方式很多,本质爱折腾的精神和对性能追求以及便于维护的考虑,搜集和尝试了很多方式,最终采用了纯css驱动的实现方 ...
- ubifs & mtd
前天晚上在写完另一篇总结之时,赵XX向我咨询了关于mtd 和ubifs的相关内容.而我在这方面只是略懂皮毛,所以向他许愿共同调查这个方面的知识.经过昨天一天的调查,最后感觉是有了一定的经验和基础了,所 ...
- ARP/RARP
IP地址和MAC地址之间的转换 点对点链路不使用ARP ARP高速缓存 ARP高效运行的关键是每个主机上都有一个ARP高速缓存. 存放了最近IP地址与MAC地址间的映射关系. 每一项生存时 ...
- 控制面板cpl大全
ALSNDMGR.CPL AC97 Audio组态设定appwiz.cpl 添加和删除程序bthprops.cpldesk.cpl 显示属性firewall.cpl Windows防火墙hdwwi ...