UI界面下视频模式切换(多进程)

UI界面启动后视频也要叠加上来,视频有3种模式,预览、录像和播放。UI界面要始终存在,但是视频模式可以切换。Qt界面作为父进程始终运行于桌面,调用exec函数族启动视频模式子进程,这个子进程实际是执行“telescope”二进制文件,"telescope"源文件实际上使用main(int argc, char *argv[])接受命令行参数来判断在哪种视频模式下运行。

qt工程的main.cpp文件中

int main(int argc, char *argv[])
{
.
.
.
char *arg[10] = {"./telescope >> /mnt/sd/kd-log"};
    int pid;
    pid = fork();
    if (pid == -1) {
        printf("Could not fork child process.\n");

    }
    else if (pid == 0) {
        execv("./telescope", arg) ;
}
return app.exec();
}

qt中也提供了接口QProcess::startDetached("./telescope>> /mnt/sd/kd-log");也可启动子进程


telescope源文件程序:

#include  
#include  
#include  
#include  
#include  
#include  
#include  

#define RET_NONE  
#define RET_OK         0
#define RET_ERROR     -1
#define WORK_PATH     "/home/root"

#define CMD_PREVIEW    "./encode -v 110203-112233.264 -I 1 -y 2 -k -o -f"
#define CMD_RECORD      "./encode -v 110203-112233.264 -I 1 -y 2 -k -o"
#define CMD_REPLAY      "./decode -v 110203-112233.264 -y 2 -O composite -k -o"

#define MODE_PREVIEW     'p'
#define MODE_RECORD      'r'
#define MODE_REPLAY      'd'

int video_run(char videoModeNew)
{
    int pid;
    FILE *fp; 
    time_t t; 
    static int videoModeCur=0;
    
    int rev=0;
    static int i=0;

    if((fp=fopen("/mnt/sd/video_dbg.log","a")) < 0)      return -2;

    t=time(0); 
 
    if(MODE_PREVIEW == videoModeNew){
          system(CMD_PREVIEW);  
          fprintf(fp,"%d  Preview   %s \n", i++,asctime(localtime(&t)) );          
    }
    else if(MODE_RECORD == videoModeNew){
          system(CMD_RECORD);
          fprintf(fp,"%d  Record   %s \n  \n", i++, asctime(localtime(&t)) );  
    }
    else{
          system(CMD_REPLAY);	 
          fprintf(fp,"%d  Replay %s \n", i++, asctime(localtime(&t)) );  
    }    
      
    fclose(fp); 
    return RET_OK;
}

// 2.telescope main()
main(int argc, char *argv[]) 
{ 
	FILE *fp; 
	time_t t;            
        int i=0;    
        char video_module = 'p';
        
        if(argc == 2 &&
           (argv[1][0]=='p' || argv[1][0]=='r' || argv[1][0]=='d'))
        { 
	    video_module = argv[1][0];
	}
	
        // 2 switch between encode and decode mode
	while(1)
	{      
                // 2.1 execute encode/decode mode                
                video_run(video_module);
		
		// 2.2 execute encode/decode mode
                if((fp=fopen("/tmp/run_video_module","r")) != NULL) 
		{ 
                        
			video_module=fgetc(fp);  
                        printf("sw video_mode:  %c\n",video_module);			                     
			fclose(fp); 
		} 
                else  printf("Fail to sw video_mode:  %c\n",video_module);	
 		
		sleep(1);
	} 
}

在int video_run(char  videoModeNew)函数中调用system函数来执行二进制文件,这里需要两个bin文件,encode和decode。encode分为预览和录像模式,录像模式相比预览模式多了一个memory即存入内存的线程,decode是播放模式下的进程。

主函数中的while循环实时读取文件中字符,把读到的字符赋值给video_module作为被调用video_run(char  videoModeNew)函数的入参以此来启动不同的进程来切换视频模式。





你可能感兴趣的:(linux)