1、信号系统综合实践报告大连理工大学本科实验报告课程名称: 信号综合处理实践 学院(系): 信息与通信工程学院 专 业: 电子信息工程(英强) 班 级: 电英1401班 学 生 1 : 李帆 201483089 学 生 2 : 马壮 201483082 学 生 3 : 王瑞明 201483133 2017 年 10 月 12 日题目:实验39 字幕式文字显示一、方法的原理本课题为字幕式文字显示,将提前设定的文字在显示器上动态显示,随着时间逐渐移动,实现弹幕的滚动效果。主要的方法原理是,对指定文字进行字符化处理,形成32px*32px的汉字阵列,在显示器上对平面坐标进行设定,确定字符的初始位置,并确
2、定字符间的相对位置,设定二维平面内字幕的移动方向和速度,从而实现字幕的动态效果。同时,对显示器背景和字符的灰度进行调整,实现较好的演示效果。1、汉语文字的字符点阵处理:在灰度图像中,文字可以用像素点的形式显示,改变不同像素点位置的灰度值,可以实现文字的正确显示。我们对汉字进行像素点阵处理,将单个汉字表示成自由设定的大小,计算出汉字占据的像素点,从而显示出汉字的图形。利用汉字字模软件PCtoLCD2002,可以很简便地得到一般汉字的点阵表示。在软件中输入汉字内容,调整点阵背景大小和汉字的字体及大小,自动生成像素坐标形式,确定坐标可以进一步实现汉字的正确显示。我们对示例文字采用宋体,背景和汉字大小
3、均为32px*32px,这样在屏幕上显示效果较好。在程序中,我们将三名组员的姓名的每个字分别用像素点表示,作为查询表进行显示。图1 生成汉字“李帆”像素点表示示例2、对显示器进行初始化设定对显示器参数进行设定,屏幕宽度设为720,高度设为576,帧间隔设为25,最大帧率为25000。由于是灰度图像显示,所以对显示器背景色和汉字颜色采用灰度级表示,我们设定背景色为纯黑0x00,将汉字设为纯白0xff,便于清楚地显示。3、字幕文字位置及移动方式设定 对显示器进行二位平面坐标处理后,文字的位置以坐标的形式在显示器显示。将文字作为整体,实现移动效果。我们将中心字设为“马”,规定汉字第一个像素点的坐标为
4、place_x和place_y,在(x,y)至(x+32,y+32)内的矩阵将显示汉字“马”。我们在每一行显示一个成员名字,这样之后每个的汉字只需对x累加32即可实现。确定行间距也为32px,这样在每一列上只需对中心字分别做处理(y+64)和(y-64)。由此实现了一个整体操作,改变place_x和place_y的数值,可以实现字幕的滚动。滚动方式设定为以对角线形式下降,所以在每帧上使横纵坐标均累加,实现语句为 place_x+=5; place_y+=5; 改变符号和大小,可以引起字幕文字移动的方向和快慢。显而易见,place_x累加则向右移动,place_x累减则向左移动,place_y累
5、加则向下移动,place_y累减则向上。如果字幕文字接近边界,我们设定字幕坐标回到初始0点,实现语句为 if(place_x600) place_x=0; 这样可以实现往复滚动,这样更符合网站弹幕的设定。初始位置横纵坐标均设为100,实现语句为提前定义 int place_x=100; int place_y=100; 经过以上方法的讨论,可以将字幕正确转化为图像像素点,并在显示器上以平面坐标的形式显示,在显示后可以实现字幕的自由移动。二、代码和效果图核心代码实现如下:/* * = video_encdec.c = * */* Codec Engine include files: */#in
6、clude #include #include #include #include /* BIOS include files: */#include #include /* Run Time lib include files: */#include #include #include #include /* PSP include files: */#include #include #include #include /* BSL include files */#include /#include /* Video Params Defaults */#include /* Video
7、 Encoder initialization param: */#define VE_MAX_BR (4000000)/* Align on cache-line boundary since encoder uses DMA */#define BUFALIGN 128/* Number of buffers to allocate for video capture + display: */#define FRAME_BUFF_CNT 6/* This example supports either PAL or NTSC depending on position of JP1 */
8、#define STANDARD_PAL 0#define STANDARD_NTSC 1/* Video Encoder parameters for D1, set depending on PAL vs NTSC: */static int intraFrameInterval;static int inputWidth;static int inputHeight;static int maxFrameRate;/* Encoder Input, Encoder output, and Decoder Output Frame sizes */static int framesize;
9、/* Video Frame buffers: */static FVID_Frame *frameBuffTableFRAME_BUFF_CNT;static FVID_Frame *frameBuffPtr = NULL;/* Video Driver Handles: */static FVID_Handle hGioVpfeCcdc = NULL;static FVID_Handle hGioVpbeVid0 = NULL;static FVID_Handle hGioVpbeVenc = NULL;/* Intermediate buffer for the encoded vide
10、o stream: */static XDAS_Int8 *encodedBuf;/* Codec Engine engine and codec labels, defined in cfg file: */static String decoderName = h264dec;static String encoderName = h264enc;static String engineName = encdec;static String progName = app;/* Function prototypes */static Void initVE_StaticParams(VID
11、ENC_Params *vencParams);static Void initVE_DynamicParams(VIDENC_DynamicParams *encDynParams);static Void initVD_StaticParams(VIDDEC_Params *vdecParams);static Void initVD_DynamicParams(VIDDEC_DynamicParams *decDynParams);static Void encode_decode(VIDENC_Handle enc, VIDDEC_Handle dec);/static int rea
12、d_JP1(void);/* * = video_encdec = */* ARGSUSED */Int video_encdec(Int argc, String argv) int status = 0; int result; int i; Engine_Handle ce = NULL; VIDDEC_Handle dec = NULL; VIDENC_Handle enc = NULL; VIDENC_Status encStatus; VIDENC_Params vencParams; VIDENC_DynamicParams encDynParams; VIDDEC_Status
13、 decStatus; VIDDEC_Params vdecParams; VIDDEC_DynamicParams decDynParams; int standard; /* Set video display/capture driver params to defaults */ PSP_VPFE_TVP5146_ConfigParams tvp5146Params = VID_PARAMS_TVP5146_DEFAULT; PSP_VPFECcdcConfigParams vpfeCcdcConfigParams = VID_PARAMS_CCDC_DEFAULT_D1; PSP_V
14、PBEOsdConfigParams vpbeOsdConfigParams = VID_PARAMS_OSD_DEFAULT_D1; PSP_VPBEVencConfigParams vpbeVencConfigParams; printf(video_encdec started.n); / standard = read_JP1(); standard =STANDARD_PAL; /* Update display/capture params based on video standard (PAL/NTSC) */ if (standard = STANDARD_PAL) inpu
15、tWidth = 720; inputHeight = 576; intraFrameInterval = 25; maxFrameRate = 25000; vpbeVencConfigParams.displayStandard = PSP_VPBE_DISPLAY_PAL_INTERLACED_COMPOSITE; else inputWidth = 720; inputHeight = 480; intraFrameInterval = 30; maxFrameRate = 30000; vpbeVencConfigParams.displayStandard = PSP_VPBE_D
16、ISPLAY_NTSC_INTERLACED_COMPOSITE; framesize = (inputWidth * inputHeight * 2 * sizeof(Int8); vpfeCcdcConfigParams.height = vpbeOsdConfigParams.height = inputHeight; vpfeCcdcConfigParams.width = vpbeOsdConfigParams.width = inputWidth; vpfeCcdcConfigParams.pitch = vpbeOsdConfigParams.pitch = inputWidth
17、 * 2; /* Initialize Video Display Driver: */ /* create video input channel */ if (status = 0) PSP_VPFEChannelParams vpfeChannelParams; vpfeChannelParams.id = PSP_VPFE_CCDC; vpfeChannelParams.params = (PSP_VPFECcdcConfigParams*)&vpfeCcdcConfigParams; hGioVpfeCcdc = FVID_create(/VPFE0,IOM_INOUT,NULL,&
18、vpfeChannelParams,NULL); status = (hGioVpfeCcdc = NULL ? -1 : 0); /* create video output channel, plane 0 */ if (status = 0) PSP_VPBEChannelParams vpbeChannelParams; vpbeChannelParams.id = PSP_VPBE_VIDEO_0; vpbeChannelParams.params = (PSP_VPBEOsdConfigParams*)&vpbeOsdConfigParams; hGioVpbeVid0 = FVI
19、D_create(/VPBE0,IOM_INOUT,NULL,&vpbeChannelParams,NULL); status = (hGioVpbeVid0 = NULL ? -1 : 0); /* create video output channel, venc */ if (status = 0) PSP_VPBEChannelParams vpbeChannelParams; vpbeChannelParams.id = PSP_VPBE_VENC; vpbeChannelParams.params = (PSP_VPBEVencConfigParams *)&vpbeVencCon
20、figParams; hGioVpbeVenc = FVID_create(/VPBE0,IOM_INOUT,NULL,&vpbeChannelParams,NULL); status = (hGioVpbeVenc = NULL ? -1 : 0); /* configure the TVP5146 video decoder */ if (status = 0) result = FVID_control(hGioVpfeCcdc, VPFE_ExtVD_BASE+PSP_VPSS_EXT_VIDEO_DECODER_CONFIG, &tvp5146Params); status = (r
21、esult = IOM_COMPLETED ? 0 : -1); /* allocate display/capture frame buffers */ for (i=0; iFRAME_BUFF_CNT; i+) frameBuffTablei = NULL; if (status = 0) for (i=0; iFRAME_BUFF_CNT & status = 0; i+) result = FVID_allocBuffer(hGioVpfeCcdc, &frameBuffTablei); status = (result = IOM_COMPLETED & frameBuffTabl
22、ei != NULL ? 0 : -1); /* prime up the video capture channel */ if (status = 0) FVID_queue(hGioVpfeCcdc, frameBuffTable0); FVID_queue(hGioVpfeCcdc, frameBuffTable1); FVID_queue(hGioVpfeCcdc, frameBuffTable2); /* prime up the video display channel */ if (status = 0) FVID_queue(hGioVpbeVid0, frameBuffT
23、able3); FVID_queue(hGioVpbeVid0, frameBuffTable4); FVID_queue(hGioVpbeVid0, frameBuffTable5); /* grab first buffer from input queue */ if (status = 0) FVID_dequeue(hGioVpfeCcdc, &frameBuffPtr); if (status != 0) goto end; /* Allocate Encoder output buffer: */* encodedBuf = (XDAS_Int8 *)Memory_contigA
24、lloc(framesize, BUFALIGN); if (encodedBuf = NULL) goto end; else Memory_cacheWbInv(encodedBuf, framesize); */ /* use engine to encode, then decode the data */ encode_decode(enc, dec);end: /* Free Video Driver resources: */ if (hGioVpfeCcdc) for (i=0; isize = sizeof(VIDENC_Params); vencParams-encodin
25、gPreset = XDM_DEFAULT; vencParams-rateControlPreset = IVIDEO_LOW_DELAY; vencParams-maxHeight = inputHeight; vencParams-maxWidth = inputWidth; vencParams-maxFrameRate = maxFrameRate; vencParams-maxBitRate = VE_MAX_BR; vencParams-dataEndianness = XDM_BYTE; vencParams-maxInterFrameInterval = 0; vencPar
26、ams-inputChromaFormat = XDM_YUV_422ILE; vencParams-inputContentType = IVIDEO_PROGRESSIVE; return; /* * = initVE_DynamicParams = */static Void initVE_DynamicParams(VIDENC_DynamicParams *encDynParams) encDynParams-inputHeight = inputHeight; encDynParams-inputWidth = inputWidth; encDynParams-refFrameRa
27、te = maxFrameRate; encDynParams-targetFrameRate = maxFrameRate; encDynParams-targetBitRate = VE_MAX_BR; encDynParams-intraFrameInterval = intraFrameInterval; encDynParams-generateHeader = XDM_ENCODE_AU; encDynParams-captureWidth = 0; encDynParams-forceIFrame = 0; return;/* * = initVD_StaticParams =
28、*/static Void initVD_StaticParams(VIDDEC_Params * vdecParams) /* Set Constant Bit Rate, YUV422 Interlaced, little endian: */ vdecParams-size = sizeof(VIDDEC_Params); vdecParams-maxHeight = inputHeight; vdecParams-maxWidth = inputWidth; vdecParams-maxFrameRate = 0; vdecParams-maxBitRate = 0; vdecParams-dataEnd
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1