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

来源:互联网 发布:魔兽争霸软件 编辑:程序博客网 时间:2024/06/10 23:18

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 <unistd.h> #include <signal.h> #include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <time.h> #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 modewhile(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)函数的入参以此来启动不同的进程来切换视频模式。





0 0