pjsip实现门铃应用,rv1106显示远端视频思路


最近,一个朋友考虑做个类似门铃的应用,用PJSIP来做。

验证套装:

呱牛笔记

要求,带显示屏的那一端能自动显示远端摄像头的视频,且不影响语音通话,但是这个显示要求能通过lvgl的GUI应用来完成。


结合这个需求,做了个简单的demo原型。

呱牛笔记

结合上一篇解码得到的BITMAP,将BITMAP通过共享内存的方式发给LVGL_DEMO,由GUI负责界面的切换和显示。

因为有h264软解码,rv1106 cpu达到75%,帧率显示15帧,80% CPU。


呱牛笔记



bitmap显示刷新demo代码

#include "lvgl/lvgl.h"
#define LV_HOR_RES 800
#define LV_VER_RES 480

lv_img_dsc_t w = {
    .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
    .header.always_zero = 0,
    .header.reserved = 0,
    .header.w = LV_HOR_RES,
    .header.h = LV_VER_RES,
    #ifdef USE_RGB24
    .data_size = LV_HOR_RES * LV_VER_RES* 4,
    #else
    .data_size = LV_HOR_RES * LV_VER_RES* 3,
    #endif
    //   .data = w_map,
};
static char bitmap_data[LV_HOR_RES * LV_VER_RES* 4];
static lv_obj_t *image_obj = NULL;
void flash_image_test(char *data, int data_size)
{
	if (data_size > w.data_size){
	printf("data_size:%d, w.data_size:%d\n", data_size, w.data_size);
	return;
	}
    lv_obj_t *Screen = lv_scr_act();//lv_obj_create(NULL);                       // 创建一个屏幕对象
    lv_obj_set_size(Screen, LV_HOR_RES, LV_VER_RES);              // 设置屏幕大小
    lv_obj_set_style_bg_color(Screen, lv_color_hex(0x000000), 0); // 设置背景色
  
    // 创建LVGL图像对象
    if (image_obj == NULL){
        image_obj = lv_img_create(Screen);  
    }
    w.data = data;
    lv_img_set_src(image_obj, &w);

    lv_obj_align(image_obj, LV_ALIGN_TOP_RIGHT, 0, 0);  //调节位置 

    lv_scr_load(Screen);
 }


#define VWIDTH 800
#define VHEIGHT 600
#define SEP_LEN 26
int quit = 0;
void do_read_test(){ 
	char start_sep[32] = "\0";
	uint8_t last_get_flag = 0;
	int width =0 ;
	int height =0 ;
	int temp_value;
	int count = 0;
	char file_name[255] = "";

	while(!quit){
		if (get_shared_buffer() == 0){
			do{
				last_get_flag = 1;
				// 获取信号量的锁,确保互斥
				P(semid_4_lvgl);
				memcpy(start_sep, shm_ptr_4_lvgl, SEP_LEN);
				start_sep[SEP_LEN] = '\0'; 
				if (strstr(start_sep, "s:start")){
					count = sscanf((char * )start_sep, "s:start:%d,%d,%d", &temp_value, &width, &height);
				    printf("Client: Data received: %d,width:%d,height:%d,count:%d\n", temp_value, width, height, count);
					if (count == 3)
					{ 
						char *argbData = shm_ptr_4_lvgl + SEP_LEN;
										
						// 释放信号量
						V(semid_4_lvgl);
						// 设置图像对象的数据源为从FLASH读取的数据
						memcpy(bitmap_data, argbData, temp_value);
					    
						static int save_index = 0;
						save_index++;
						sprintf(file_name, "/tmp/%d_10.bmp", save_index); 
						flash_image_test(bitmap_data, temp_value);
						//SaveARGBAsBMP(file_name, argbData, VWIDTH, VHEIGHT);
					}else{
						// 释放信号量
						V(semid_4_lvgl);
					    
					
					}
					
        				lv_timer_handler();
				}else if (strstr(start_sep, "s:stop")){ 
						printf("Client: Data received: quit\n");
					// 释放信号量
					V(semid_4_lvgl);
					break;
				}else{
					// 释放信号量
					V(semid_4_lvgl);
					 
        				lv_timer_handler();
					usleep(10 * 1000);
				}

			}while(1);
					
			// 分离共享内存
			if (shmdt(shm_ptr_4_lvgl) == -1) { 
			    printf("Client: shmdt failed\n"); 
			} 
		}
		lv_timer_handler();
		usleep(20 * 1000);
	}
}


-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com


本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com

请先登录后发表评论
  • 最新评论
  • 总共0条评论